From 17d2f1d9c90e8fd534966fdcfd5de6e74cba6d94 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:58:23 +0800 Subject: [PATCH 01/29] dev --- abi/Committer.json | 702 ++++++ docs/sql/listener.sql | 73 +- go.mod | 30 +- go.sum | 136 +- internal/blockchain/blockchain.go | 1 + internal/handler/checkstatus.go | 35 +- internal/handler/committer.go | 28 +- internal/handler/committer_test.go | 51 + internal/handler/handler.go | 3 + internal/handler/inscribe.go | 31 +- internal/handler/sequenceBatches.go | 139 ++ internal/handler/syncEvent.go | 4 +- internal/handler/syncEvent_test.go | 7 + internal/handler/syncProposal.go | 17 +- internal/schema/proposal.go | 9 +- internal/svc/svc.go | 8 +- internal/types/config.go | 14 +- pkg/b2node/b2node.go | 557 ++--- pkg/b2node/b2node_test.go | 446 ++-- pkg/contract/committer.go | 2179 +++++++++++++++++++ {internal/handler => pkg/contract}/zkEVM.go | 142 +- pkg/event/zkevm/sequenceBatches.go | 46 + 22 files changed, 4081 insertions(+), 577 deletions(-) create mode 100644 abi/Committer.json create mode 100644 internal/handler/committer_test.go create mode 100644 internal/handler/sequenceBatches.go create mode 100644 internal/handler/syncEvent_test.go create mode 100644 pkg/contract/committer.go rename {internal/handler => pkg/contract}/zkEVM.go (99%) create mode 100644 pkg/event/zkevm/sequenceBatches.go diff --git a/abi/Committer.json b/abi/Committer.json new file mode 100644 index 0000000..182da31 --- /dev/null +++ b/abi/Committer.json @@ -0,0 +1,702 @@ +[{ + "inputs": [], + "name": "AccessControlBadConfirmation", + "type": "error" +}, { + "inputs": [{ + "internalType": "address", + "name": "account", + "type": "address" + }, { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + }], + "name": "AccessControlUnauthorizedAccount", + "type": "error" +}, { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" +}, { + "inputs": [], + "name": "NotInitializing", + "type": "error" +}, { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + }], + "name": "Initialized", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, { + "indexed": true, + "internalType": "address", + "name": "proposer", + "type": "address" + }, { + "indexed": false, + "internalType": "string", + "name": "proofHash", + "type": "string" + }, { + "indexed": false, + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, { + "indexed": true, + "internalType": "uint256", + "name": "startIndex", + "type": "uint256" + }, { + "indexed": false, + "internalType": "uint256", + "name": "endIndex", + "type": "uint256" + }], + "name": "ProposalSubmitted", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }], + "name": "ProposalTimedOut", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + }], + "name": "RoleAdminChanged", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }], + "name": "RoleGranted", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }], + "name": "RoleRevoked", + "type": "event" +}, { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, { + "indexed": false, + "internalType": "address", + "name": "voter", + "type": "address" + }, { + "indexed": false, + "internalType": "uint8", + "name": "phase", + "type": "uint8" + }], + "name": "VoteProposal", + "type": "event" +}, { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "proposer", + "type": "address" + }], + "name": "addProposer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }], + "name": "allCommitPhaseVotes", + "outputs": [{ + "internalType": "address[]", + "name": "", + "type": "address[]" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "allProposers", + "outputs": [{ + "internalType": "address[]", + "name": "", + "type": "address[]" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }], + "name": "allTimeoutPhaseVotes", + "outputs": [{ + "internalType": "address[]", + "name": "", + "type": "address[]" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "string", + "name": "txHash", + "type": "string" + }], + "name": "bitcoinTx", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }, { + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "name": "commitPhaseVotes", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "getLastProposal", + "outputs": [{ + "components": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, { + "internalType": "address", + "name": "winner", + "type": "address" + }, { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, { + "internalType": "string", + "name": "txHash", + "type": "string" + }], + "internalType": "struct Committer.Proposal", + "name": "", + "type": "tuple" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }], + "name": "getRoleAdmin", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "internalType": "address", + "name": "account", + "type": "address" + }], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "internalType": "address", + "name": "account", + "type": "address" + }], + "name": "hasRole", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "sender", + "type": "address" + }], + "name": "isProposer", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "address", + "name": "voter", + "type": "address" + }], + "name": "isVotedOnCommitPhase", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "address", + "name": "voter", + "type": "address" + }], + "name": "isVotedOnTimeoutPhase", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "lastProposal", + "outputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, { + "internalType": "address", + "name": "winner", + "type": "address" + }, { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, { + "internalType": "string", + "name": "txHash", + "type": "string" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }], + "name": "proposal", + "outputs": [{ + "components": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, { + "internalType": "address", + "name": "winner", + "type": "address" + }, { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, { + "internalType": "string", + "name": "txHash", + "type": "string" + }], + "internalType": "struct Committer.Proposal", + "name": "", + "type": "tuple" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "name": "proposals", + "outputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, { + "internalType": "address", + "name": "winner", + "type": "address" + }, { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, { + "internalType": "string", + "name": "txHash", + "type": "string" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "name": "proposers", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "name": "proposersList", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "address", + "name": "proposer", + "type": "address" + }], + "name": "removeProposer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + }], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { + "internalType": "address", + "name": "account", + "type": "address" + }], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint256", + "name": "period", + "type": "uint256" + }], + "name": "setTimeoutPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }], + "name": "submitProof", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}, { + "inputs": [{ + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + }], + "name": "supportsInterface", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [], + "name": "timeoutPeriod", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }, { + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "name": "timeoutPhaseVotes", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" +}, { + "inputs": [{ + "internalType": "uint64", + "name": "id", + "type": "uint64" + }], + "name": "timeoutProposal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" +}] diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index 9e62e7f..161623e 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -13,8 +13,8 @@ CREATE TABLE `rollbacks` ( `id` bigint NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名, eth', - `event_id` bigint NOT NULL COMMENT ' 事件ID', + `blockchain` varchar(32) NOT NULL COMMENT ' chain_name, eth', + `event_id` bigint NOT NULL COMMENT ' event id', PRIMARY KEY (`id`), KEY `event_id_index` (`event_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; @@ -27,16 +27,16 @@ CREATE TABLE `sync_blocks` ( `id` bigint NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `miner` varchar(42) NOT NULL COMMENT ' 出块人', - `block_time` bigint NOT NULL COMMENT ' 出块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `tx_count` bigint NOT NULL COMMENT ' 交易数量', - `event_count` bigint NOT NULL COMMENT ' 事件数量', - `parent_hash` varchar(66) NOT NULL COMMENT ' 父Hash', - `status` varchar(32) NOT NULL COMMENT ' 状态', - `check_count` bigint NOT NULL COMMENT ' 检查次数', + `blockchain` varchar(32) NOT NULL COMMENT ' chain name', + `miner` varchar(42) NOT NULL COMMENT ' miner', + `block_time` bigint NOT NULL COMMENT ' block_time', + `block_number` bigint NOT NULL COMMENT ' block_number', + `block_hash` varchar(66) NOT NULL COMMENT ' block hash', + `tx_count` bigint NOT NULL COMMENT ' tx count', + `event_count` bigint NOT NULL COMMENT ' event count', + `parent_hash` varchar(66) NOT NULL COMMENT ' parent hash', + `status` varchar(32) NOT NULL COMMENT ' status', + `check_count` bigint NOT NULL COMMENT ' check count', PRIMARY KEY (`id`), KEY `status_index` (`status`), KEY `tx_count_index` (`tx_count`), @@ -51,16 +51,16 @@ CREATE TABLE `sync_blocks_history` ( `id` bigint NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `miner` varchar(42) NOT NULL COMMENT ' 出块人', - `block_time` bigint NOT NULL COMMENT ' 出块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `tx_count` bigint NOT NULL COMMENT ' 交易数量', - `event_count` bigint NOT NULL COMMENT ' 事件数量', - `parent_hash` varchar(66) NOT NULL COMMENT ' 父Hash', - `status` varchar(32) NOT NULL COMMENT ' 状态', - `check_count` bigint NOT NULL COMMENT ' 检查次数', + `blockchain` varchar(32) NOT NULL COMMENT ' block chain', + `miner` varchar(42) NOT NULL COMMENT ' miner ', + `block_time` bigint NOT NULL COMMENT ' block time', + `block_number` bigint NOT NULL COMMENT ' block number', + `block_hash` varchar(66) NOT NULL COMMENT ' block Hash', + `tx_count` bigint NOT NULL COMMENT ' tx count ', + `event_count` bigint NOT NULL COMMENT ' event count ', + `parent_hash` varchar(66) NOT NULL COMMENT ' parent hash', + `status` varchar(32) NOT NULL COMMENT ' status', + `check_count` bigint NOT NULL COMMENT ' check count', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2792531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; @@ -72,20 +72,20 @@ CREATE TABLE `sync_events` ( `id` bigint NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `sync_block_id` bigint NOT NULL COMMENT ' 同步区块ID', - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `block_time` bigint NOT NULL COMMENT ' 区块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `block_log_indexed` bigint NOT NULL COMMENT ' 日志index', - `tx_index` bigint NOT NULL COMMENT ' 交易index', - `tx_hash` varchar(66) NOT NULL COMMENT ' 交易Hash', - `event_name` varchar(32) NOT NULL COMMENT ' 事件名称', - `event_hash` varchar(66) NOT NULL COMMENT ' 事件Hash', - `contract_address` varchar(42) NOT NULL COMMENT ' 合约地址', - `data` json NOT NULL COMMENT ' 数据内容', - `status` varchar(32) NOT NULL COMMENT ' 状态', - `retry_count` bigint DEFAULT '0' COMMENT '重试次数', + `sync_block_id` bigint NOT NULL COMMENT ' sync_block_id', + `blockchain` varchar(32) NOT NULL COMMENT ' blockchain', + `block_time` bigint NOT NULL COMMENT ' block_time', + `block_number` bigint NOT NULL COMMENT ' block_number', + `block_hash` varchar(66) NOT NULL COMMENT ' block_hash', + `block_log_indexed` bigint NOT NULL COMMENT ' block_log_indexed', + `tx_index` bigint NOT NULL COMMENT ' tx_index', + `tx_hash` varchar(66) NOT NULL COMMENT ' tx_hash', + `event_name` varchar(32) NOT NULL COMMENT ' event_name', + `event_hash` varchar(66) NOT NULL COMMENT ' event_hash', + `contract_address` varchar(42) NOT NULL COMMENT ' contract_address', + `data` json NOT NULL COMMENT ' data', + `status` varchar(32) NOT NULL COMMENT ' status', + `retry_count` bigint DEFAULT '0' COMMENT 'retry_count', PRIMARY KEY (`id`), KEY `status_index` (`status`) ) ENGINE=InnoDB AUTO_INCREMENT=1011299 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; @@ -151,6 +151,7 @@ CREATE TABLE `proposal` ( `block_height` bigint NOT NULL DEFAULT 0, `winner` varchar(128), `status` bigint NOT NULL DEFAULT 0, + `upload_details` tinyint(1) default 0, PRIMARY KEY (`id`), KEY `proposal_id_index` (`proposal_id`) ) diff --git a/go.mod b/go.mod index a87bc86..bac179c 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/caarlos0/env/v6 v6.10.1 github.com/cosmos/cosmos-sdk v0.46.11 - github.com/ethereum/go-ethereum v1.10.26 + github.com/ethereum/go-ethereum v1.13.14 github.com/evmos/ethermint v0.22.0 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 @@ -33,6 +33,7 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/aead/siphash v1.0.1 // indirect github.com/armon/go-metrics v0.4.1 // indirect @@ -40,6 +41,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect @@ -48,6 +50,8 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/confio/ics23/go v0.9.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect @@ -55,9 +59,10 @@ require ( github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/cosmos/iavl v0.19.5 // indirect github.com/cosmos/ledger-cosmos-go v0.12.2 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deckarep/golang-set v1.8.0 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -65,6 +70,7 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-kit/kit v0.12.0 // indirect @@ -72,16 +78,15 @@ require ( github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/go-stack/stack v1.8.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/gateway v1.1.0 // indirect github.com/gogo/protobuf v1.3.3 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.7 // indirect @@ -104,22 +109,24 @@ require ( github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect - github.com/klauspost/compress v1.15.11 // indirect + github.com/klauspost/compress v1.15.15 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect @@ -130,8 +137,6 @@ require ( github.com/prometheus/procfs v0.8.0 // indirect github.com/rakyll/statik v0.1.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rjeczalik/notify v0.9.1 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/spf13/afero v1.9.3 // indirect @@ -141,6 +146,7 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.15.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tendermint/tendermint v0.34.27 // indirect @@ -163,13 +169,15 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.17.0 // indirect google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect @@ -177,9 +185,9 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index ded226a..642aa51 100644 --- a/go.sum +++ b/go.sum @@ -203,12 +203,16 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= @@ -240,6 +244,8 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1U github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= @@ -303,6 +309,18 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= github.com/cometbft/cometbft v0.34.27 h1:ri6BvmwjWR0gurYjywcBqRe4bbwc3QVs9KRcCzgh/J0= @@ -311,6 +329,10 @@ github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0 github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -337,6 +359,10 @@ github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= @@ -345,8 +371,8 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= @@ -362,16 +388,14 @@ github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf h1:Yt+4K30SdjOkRoRRm3vYNQgR+/ZIy0RmeUDZo7Y8zeQ= -github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= +github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -382,8 +406,10 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= -github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -393,8 +419,8 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= @@ -405,6 +431,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -428,21 +456,21 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= @@ -482,8 +510,9 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -507,8 +536,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -533,9 +562,12 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= @@ -601,13 +633,15 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= @@ -645,8 +679,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= +github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -658,6 +693,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -671,11 +710,11 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -693,6 +732,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -762,8 +804,6 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= @@ -772,8 +812,8 @@ github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzy github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -837,6 +877,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= @@ -868,8 +910,8 @@ github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3C github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= -github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= @@ -940,8 +982,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 h1:BEABXpNXLEz0WxtA+6CQIz2xkg80e+1zrhWyMcq8VzE= -golang.org/x/exp v0.0.0-20230131160201-f062dba9d201/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -968,6 +1010,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1183,8 +1227,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1240,6 +1284,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1488,8 +1534,8 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1526,5 +1572,7 @@ pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/internal/blockchain/blockchain.go b/internal/blockchain/blockchain.go index aecb248..1a8a384 100644 --- a/internal/blockchain/blockchain.go +++ b/internal/blockchain/blockchain.go @@ -23,6 +23,7 @@ var ( func init() { register(&zkevm.VerifyBatches{}) + register(&zkevm.SequenceBatches{}) cfg := config.GetConfig() addContract(cfg.PolygonZKEVMAddress) } diff --git a/internal/handler/checkstatus.go b/internal/handler/checkstatus.go index c22516a..a9b642c 100644 --- a/internal/handler/checkstatus.go +++ b/internal/handler/checkstatus.go @@ -1,6 +1,7 @@ package handler import ( + "fmt" "time" "github.com/b2network/b2committer/internal/schema" @@ -13,7 +14,7 @@ import ( func CheckStatus(ctx *svc.ServiceContext) { for { var dbProposal schema.Proposal - err := ctx.DB.Where("status=?", schema.VotingStatus).Order("end_batch_num asc").First(&dbProposal).Error + err := ctx.DB.Where("status=?", schema.ProposalVotingStatus).Order("end_batch_num asc").First(&dbProposal).Error if err != nil { log.Errorf("[Handler.CheckStatus] find Voting proposal err: %s\n", errors.WithStack(err).Error()) time.Sleep(5 * time.Second) @@ -24,10 +25,9 @@ func CheckStatus(ctx *svc.ServiceContext) { log.Errorf("[Handler.CheckStatus] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) continue } - if proposal.Status != schema.VotingStatus && proposal.Winner != "" { - dbProposal.Winner = proposal.Winner - dbProposal.Status = proposal.Status - dbProposal.BlockHeight = proposal.BlockHight + if proposal.Status != schema.ProposalVotingStatus && proposal.Winner.String() != "" { + dbProposal.Winner = proposal.Winner.String() + dbProposal.Status = uint64(proposal.Status) ctx.DB.Save(dbProposal) } time.Sleep(3 * time.Second) @@ -38,7 +38,7 @@ func CheckStatusTimeOut(ctx *svc.ServiceContext) { for { time.Sleep(30 * time.Second) var dbProposal schema.Proposal - err := ctx.DB.Where("status!=?", schema.SucceedStatus).Order("end_batch_num asc").First(&dbProposal).Error + err := ctx.DB.Where("status not in (? , ?)", schema.ProposalSucceedStatus, schema.ProposalTimeoutStatus).Order("end_batch_num asc").First(&dbProposal).Error if err != nil { log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal err: %s\n", errors.WithStack(err)) time.Sleep(5 * time.Second) @@ -49,16 +49,17 @@ func CheckStatusTimeOut(ctx *svc.ServiceContext) { log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) continue } - if proposal.BitcoinTxHash == "" && proposal.Status == schema.PendingStatus && proposal.Winner != ctx.B2NodeConfig.Address { - num := uint64(ctx.LatestBlockNumber) - proposal.BlockHight - if num > 10000 { - err := ctx.NodeClient.TimeoutProposal(proposal.Id) - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] TimeoutProposal err: %s\n", errors.WithStack(err)) - continue - } - } - time.Sleep(2 * time.Second) - } + fmt.Println(proposal) + //if proposal.TxHash == "" && proposal.Status == schema.ProposalPendingStatus && proposal.Winner.String() != ctx.B2NodeConfig.Address { + // num := uint64(ctx.LatestBlockNumber) - proposal.BlockHight + // if num > 10000 { + // err := ctx.NodeClient.TimeoutProposal(proposal.Id) + // if err != nil { + // log.Errorf("[Handler.CheckStatusTimeOut] TimeoutProposal err: %s\n", errors.WithStack(err)) + // continue + // } + // } + // time.Sleep(2 * time.Second) + //} } } diff --git a/internal/handler/committer.go b/internal/handler/committer.go index 2bfd927..ce4fe8c 100644 --- a/internal/handler/committer.go +++ b/internal/handler/committer.go @@ -4,6 +4,7 @@ import ( "context" "encoding/hex" "fmt" + "github.com/b2network/b2committer/pkg/contract" "strings" "time" @@ -44,7 +45,8 @@ type VerifyRangBatchInfo struct { func Committer(ctx *svc.ServiceContext) { for { var proposals []schema.Proposal - lastProposalID, lastFinalBatchNum, err := ctx.NodeClient.QueryLastProposalID() + proposal, err := ctx.NodeClient.QueryLastProposal() + lastProposalID, lastFinalBatchNum := proposal.Id, proposal.EndIndex if err != nil { log.Errorf("[Handler.Committer][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) time.Sleep(10 * time.Second) @@ -79,31 +81,31 @@ func Committer(ctx *svc.ServiceContext) { func GetVerifyBatchInfoByLastBatchNum(ctx *svc.ServiceContext, lastFinalBatchNum uint64) (*VerifyRangBatchInfo, error) { verifyBatchesAndTxHashs, err := GetVerifyBatchesFromStartBatchNum(ctx, lastFinalBatchNum, ctx.Config.LimitNum) if err != nil || len(verifyBatchesAndTxHashs) != ctx.Config.LimitNum { - return nil, fmt.Errorf("[GetVerifyBatchInfo] error info: %s", errors.WithStack(err)) + return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) } verifyBatchesParams := make([]*VerifyBatchesTrustedAggregatorParams, 0, ctx.Config.LimitNum) for _, verifyBatch := range verifyBatchesAndTxHashs { verifyBatchParam, err := GetVerifyBatchesParamsByTxHash(ctx, common.HexToHash(verifyBatch.txHash)) if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchInfo] error info: %s", errors.WithStack(err)) + return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) } verifyBatchesParams = append(verifyBatchesParams, verifyBatchParam) } verifyBatchInfo, err := GetMerkleStateRootsAndProofs(verifyBatchesParams) if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchInfo] error info: %s", errors.WithStack(err)) + return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) } return verifyBatchInfo, nil } // CommitterProposal committer transaction to b2-node func committerProposal(ctx *svc.ServiceContext, verifyBatchInfo *VerifyRangBatchInfo, lastProposalID uint64) error { - proposalID, err := ctx.NodeClient.SubmitProof(lastProposalID+1, ctx.B2NodeConfig.Address, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, + proposalID := lastProposalID + 1 + _, err := ctx.NodeClient.SubmitProof(proposalID, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, verifyBatchInfo.startBatchNum, verifyBatchInfo.endBatchNum) if err != nil { return fmt.Errorf("[committerProposal] submit proof error info: %s", errors.WithStack(err)) } - dbProposal := &schema.Proposal{ Base: schema.Base{ CreatedAt: time.Now(), @@ -111,8 +113,7 @@ func committerProposal(ctx *svc.ServiceContext, verifyBatchInfo *VerifyRangBatch }, EndBatchNum: verifyBatchInfo.endBatchNum, ProposalID: proposalID, - Proposer: ctx.B2NodeConfig.Address, - Status: schema.VotingStatus, + Status: schema.ProposalVotingStatus, StateRootHash: verifyBatchInfo.stateRootHash, ProofRootHash: verifyBatchInfo.proofRootHash, StartBatchNum: verifyBatchInfo.startBatchNum, @@ -170,14 +171,15 @@ func GetMerkleStateRootsAndProofs(params []*VerifyBatchesTrustedAggregatorParams func GetVerifyBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum uint64, limit int) ([]*VerifyBatchesAndTxHash, error) { events := make([]schema.SyncEvent, 0, limit) err := ctx.DB.Table("sync_events").Select("*, JSON_EXTRACT(data, '$.numBatch') as numBatch"). - Where("JSON_EXTRACT(data, '$.numBatch') > ?", startBatchNum).Order("numBatch").Limit(limit).Find(&events).Error + Where(" event_name = ? and JSON_EXTRACT(data, '$.numBatch') > ?", "verifyBatchesTrustedAggregator", + startBatchNum).Order("numBatch").Limit(limit).Find(&events).Error if err != nil { return nil, fmt.Errorf("[GetVerifyBatchesFromStartBatchNum] dbbase err: %s", err) } if len(events) != 10 { return nil, fmt.Errorf("[GetVerifyBatchesFromStartBatchNum] sync_events find event is not enough %s", err) } - verifyBatchesAndTxHashs := make([]*VerifyBatchesAndTxHash, 0, limit) + verifyBatchesAndTxHashes := make([]*VerifyBatchesAndTxHash, 0, limit) for _, event := range events { verifyBatch := &zkevm.VerifyBatches{} err = verifyBatch.ToObj(event.Data) @@ -188,9 +190,9 @@ func GetVerifyBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum ui verifyBatches: verifyBatch, txHash: event.TxHash, } - verifyBatchesAndTxHashs = append(verifyBatchesAndTxHashs, verifyBatchesAndTxHash) + verifyBatchesAndTxHashes = append(verifyBatchesAndTxHashes, verifyBatchesAndTxHash) } - return verifyBatchesAndTxHashs, nil + return verifyBatchesAndTxHashes, nil } func DecodeTransactionInputData(contractABI abi.ABI, data []byte) (map[string]interface{}, string) { @@ -211,7 +213,7 @@ func DecodeTransactionInputData(contractABI abi.ABI, data []byte) (map[string]in } func GetVerifyBatchesParamsByTxHash(ctx *svc.ServiceContext, txHash common.Hash) (*VerifyBatchesTrustedAggregatorParams, error) { - abiObject, err := abi.JSON(strings.NewReader(ZkEVMMetaData.ABI)) + abiObject, err := abi.JSON(strings.NewReader(contract.ZkEVMMetaData.ABI)) if err != nil { return nil, fmt.Errorf("[GetVerifyBatchesParamsByTxHash] parse abi error: %s", errors.WithStack(err)) } diff --git a/internal/handler/committer_test.go b/internal/handler/committer_test.go new file mode 100644 index 0000000..e40086c --- /dev/null +++ b/internal/handler/committer_test.go @@ -0,0 +1,51 @@ +package handler + +import ( + "context" + "encoding/hex" + "fmt" + "github.com/b2network/b2committer/pkg/contract" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" + "strings" + "testing" +) + +func TestGetVerifyBatchesParamsByTxHash(t *testing.T) { + //txHash := "0x05a4cf1c23eb2fea36a7d23dc0d419f35e27474f8217bf371ff8299502d99224" + txHash := "0x442edca80b4882ef2cd3482e5cb95570a81d19fd8a03ed1e302a711fd7e994ed" + // method := "VerifyBatchesTrustedAggregator" + rpc, err := ethclient.Dial("https://ethereum-goerli-rpc.publicnode.com") + tx, _, err := rpc.TransactionByHash(context.Background(), common.HexToHash(txHash)) + + //inputsMap, methodName := DecodeTransactionInputData(abiObject, tx.Data()) + + methodSigData := tx.Data()[:4] + inputsSigData := tx.Data()[4:] + + abiObject, err := abi.JSON(strings.NewReader(contract.ZkEVMMetaData.ABI)) + require.NoError(t, err) + method, err := abiObject.MethodById(methodSigData) + require.NoError(t, err) + + inputsMap := make(map[string]interface{}) + err = method.Inputs.UnpackIntoMap(inputsMap, inputsSigData) + require.NoError(t, err) + initNumBatch := inputsMap["initNumBatch"].(uint64) + finalNewBatch := inputsMap["finalNewBatch"].(uint64) + e := inputsMap["newLocalExitRoot"].([32]byte) + f := inputsMap["newStateRoot"].([32]byte) + g := inputsMap["proof"].([24][32]byte) + + var result string + for _, arr := range g { + result += hex.EncodeToString(arr[:]) + } + fmt.Println("initNumBatch", initNumBatch) + fmt.Println("finalNewBatch", finalNewBatch) + fmt.Println("newLocalExitRoot", hex.EncodeToString(e[:])) + fmt.Println("newStateRoot outputs:", hex.EncodeToString(f[:])) + fmt.Println("proof outputs: ", common.HexToHash(result)) +} diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 7e22698..15c18e1 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -5,6 +5,7 @@ import ( ) func Run(ctx *svc.ServiceContext) { + // query last block number go LatestBlackNumber(ctx) // sync blocks @@ -21,4 +22,6 @@ func Run(ctx *svc.ServiceContext) { go CheckStatusTimeOut(ctx) // sync proposal go SyncProposal(ctx) + // sequence batches + go SequenceBatches(ctx) } diff --git a/internal/handler/inscribe.go b/internal/handler/inscribe.go index ba15f2f..dcd5daf 100644 --- a/internal/handler/inscribe.go +++ b/internal/handler/inscribe.go @@ -2,12 +2,10 @@ package handler import ( "encoding/json" - "time" - "github.com/b2network/b2committer/pkg/btcapi" btcmempool "github.com/b2network/b2committer/pkg/btcapi/mempool" - "github.com/b2network/b2committer/pkg/inscribe" + "time" "github.com/b2network/b2committer/pkg/log" @@ -21,7 +19,7 @@ func Inscribe(ctx *svc.ServiceContext) { time.Sleep(30 * time.Second) for { var dbProposal schema.Proposal - err := ctx.DB.Where("status=?", schema.PendingStatus).Order("end_batch_num asc").First(&dbProposal).Error + err := ctx.DB.Where("status=?", schema.ProposalPendingStatus).Order("end_batch_num asc").First(&dbProposal).Error if err != nil { log.Errorf("[Handler.Inscribe] Pending and timeout proposal err: %s\n", errors.WithStack(err).Error()) time.Sleep(5 * time.Second) @@ -32,15 +30,16 @@ func Inscribe(ctx *svc.ServiceContext) { log.Errorf("[CheckProposalPending] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) continue } - if proposal.Status == schema.SucceedStatus { - dbProposal.Status = proposal.Status - dbProposal.Winner = proposal.Winner - dbProposal.BtcRevealTxHash = proposal.BitcoinTxHash + if proposal.Status == schema.ProposalSucceedStatus { + dbProposal.Status = uint64(proposal.Status) + dbProposal.Winner = proposal.Winner.String() + dbProposal.BtcRevealTxHash = proposal.TxHash ctx.DB.Save(dbProposal) } - if proposal.Status == schema.PendingStatus && - proposal.Winner == ctx.B2NodeConfig.Address && proposal.BitcoinTxHash == "" { - rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, proposal.StateRootHash, proposal.ProofHash, ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) + if proposal.Status == schema.ProposalPendingStatus && + proposal.Winner.String() == ctx.B2NodeConfig.Address && proposal.TxHash == "" { + rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, proposal.StateRootHash, + proposal.ProofHash, ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) if err != nil { log.Errorf("[Handler.Inscribe] Inscribe err: %s\n", errors.WithStack(err).Error()) continue @@ -53,7 +52,7 @@ func Inscribe(ctx *svc.ServiceContext) { log.Infof("[Handler.Inscribe] inscribe result: %s", str) bitcoinTxHash := rs.RevealTxHashList[0].String() - _, err = ctx.NodeClient.BitcoinTx(proposal.Id, proposal.Winner, bitcoinTxHash) + _, err = ctx.NodeClient.BitcoinTxHash(proposal.Id, bitcoinTxHash) if err != nil { log.Errorf("[Handler.Inscribe] BitcoinTx err: %s\n", errors.WithStack(err).Error()) continue @@ -63,16 +62,16 @@ func Inscribe(ctx *svc.ServiceContext) { ctx.DB.Save(dbProposal) } - if proposal.Status == schema.PendingStatus && proposal.BitcoinTxHash != "" && proposal.Winner != ctx.B2NodeConfig.Address { - // 拿到bitcoin 去btc network query一下 确认状态 对比大于6个高度后 确认后就提交提案 + if proposal.Status == schema.ProposalPendingStatus && proposal.TxHash != "" && proposal.Winner.String() != ctx.B2NodeConfig.Address { + // Get bitcoin txHash and query on btc network confirm status If the comparison is greater than 6 heights, submit the proposal after confirmation btcAPIClient := btcmempool.NewClient(btcapi.ChainParams(ctx.BTCConfig.NetworkName)) - transaction, err := btcAPIClient.GetTransactionByID(proposal.BitcoinTxHash) + transaction, err := btcAPIClient.GetTransactionByID(proposal.TxHash) if err != nil { log.Errorf("[Handler.Inscribe] GetTransactionByID err: %s\n", errors.WithStack(err).Error()) continue } if transaction.Status.Confirmed && (ctx.LatestBTCBlockNumber-transaction.Status.BlockHeight) >= 6 { - _, err = ctx.NodeClient.BitcoinTx(proposal.Id, proposal.Proposer, proposal.BitcoinTxHash) + _, err = ctx.NodeClient.BitcoinTxHash(proposal.Id, proposal.TxHash) if err != nil { log.Errorf("[Handler.Inscribe] BitcoinTx err: %s\n", errors.WithStack(err).Error()) continue diff --git a/internal/handler/sequenceBatches.go b/internal/handler/sequenceBatches.go new file mode 100644 index 0000000..8626317 --- /dev/null +++ b/internal/handler/sequenceBatches.go @@ -0,0 +1,139 @@ +package handler + +import ( + "context" + "encoding/json" + "fmt" + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/pkg/contract" + "github.com/b2network/b2committer/pkg/event/zkevm" + "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + "os" + "strings" + "time" +) + +type CollectionSequenceBatches struct { + IsCompleted bool + SequenceBatches []*SequenceBatchesAndTxHash + StartBatchNum uint64 + EndBatchNum uint64 +} + +type SequenceBatchesAndTxHash struct { + NumBatch uint64 + TxHash string +} + +func SequenceBatches(ctx *svc.ServiceContext) { + for { + var dbProposal schema.Proposal + err := ctx.DB.Where("status = ?", schema.ProposalSucceedStatus).Order("proposal_id asc").First(&dbProposal).Error + //dbProposal.StartBatchNum + //dbProposal.EndBatchNum + //collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, 718506, 719063) + collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) + if err != nil { + log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesFromStartBatchNum] error info: %s", errors.WithStack(err).Error()) + time.Sleep(10 * time.Second) + continue + } + if !collectionSequenceBatches.IsCompleted { + log.Errorf("[Handler.SequenceBatches] sync batches not completed") + time.Sleep(10 * time.Second) + continue + } + sequenceBatchesMap, err := GetSequenceBatchesDetails(ctx, collectionSequenceBatches.SequenceBatches) + if err != nil { + log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesDetails] error info: %s", errors.WithStack(err).Error()) + time.Sleep(3 * time.Second) + continue + } + WriteFile(ctx, sequenceBatchesMap) + } +} + +func GetSequenceBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum uint64, endBatchNum uint64) (*CollectionSequenceBatches, error) { + isCompleted := false + events := make([]schema.SyncEvent, 0) + err := ctx.DB.Table("sync_events").Select("*, JSON_EXTRACT(data, '$.numBatch') as numBatch "). + Where(" event_name = ? and JSON_EXTRACT(data, '$.numBatch') between ? and ?", "sequenceBatches", + startBatchNum, endBatchNum).Order("numBatch").Find(&events).Error + if err != nil { + return nil, fmt.Errorf("[GetSequenceBatchesFromStartBatchNum] dbbase err: %s", err) + } + + sequenceBatchesAndTxHashes := make([]*SequenceBatchesAndTxHash, 0) + for _, event := range events { + sequenceBatch := &zkevm.SequenceBatches{} + err = sequenceBatch.ToObj(event.Data) + if err != nil { + return nil, fmt.Errorf("[GetSequenceBatchesFromStartBatchNum] parse event data error: %s", errors.WithStack(err)) + } + SequenceBatchesAndTxHash := &SequenceBatchesAndTxHash{ + NumBatch: sequenceBatch.BatchNum, + TxHash: event.TxHash, + } + sequenceBatchesAndTxHashes = append(sequenceBatchesAndTxHashes, SequenceBatchesAndTxHash) + if sequenceBatch.BatchNum == endBatchNum { + isCompleted = true + } + } + + return &CollectionSequenceBatches{ + StartBatchNum: startBatchNum, + EndBatchNum: endBatchNum, + SequenceBatches: sequenceBatchesAndTxHashes, + IsCompleted: isCompleted, + }, nil +} + +func GetSequenceBatchesDetails(ctx *svc.ServiceContext, sequenceBatches []*SequenceBatchesAndTxHash) (map[uint64]map[string]interface{}, error) { + abiObject, err := abi.JSON(strings.NewReader(contract.ZkEVMMetaData.ABI)) + + if err != nil { + return nil, fmt.Errorf("[GetSequenceBatchesDetails] parse abi error: %s", errors.WithStack(err)) + } + sequenceBatchesMap := make(map[uint64]map[string]interface{}) + for _, sequenceBatch := range sequenceBatches { + txHash := sequenceBatch.TxHash + tx, _, err := ctx.RPC.TransactionByHash(context.Background(), common.HexToHash(txHash)) + if err != nil { + return nil, fmt.Errorf("[GetSequenceBatchesDetails] get tx error: %s", errors.WithStack(err)) + } + inputsMap, methodName := DecodeTransactionInputData(abiObject, tx.Data()) + + if methodName != "sequenceBatches" { + return nil, fmt.Errorf("[GetSequenceBatchesDetails] methodName is : %s parse method error: %s", methodName, errors.WithStack(err)) + } + sequenceBatchesMap[sequenceBatch.NumBatch] = inputsMap + } + return sequenceBatchesMap, nil +} + +func WriteFile(ctx *svc.ServiceContext, sequenceBatchesMap map[uint64]map[string]interface{}) { + jsonData, err := json.Marshal(sequenceBatchesMap) + if err != nil { + log.Errorf("[WriteFile] json marshal error: %s", errors.WithStack(err)) + return + } + + file, err := os.Create("output.json") + if err != nil { + fmt.Println("create file error:", err) + return + } + defer file.Close() + + _, err = file.Write(jsonData) + if err != nil { + fmt.Println("write file error:", err) + return + } + + fmt.Println("map write file output.json success") +} diff --git a/internal/handler/syncEvent.go b/internal/handler/syncEvent.go index d4567d4..5dcc37c 100644 --- a/internal/handler/syncEvent.go +++ b/internal/handler/syncEvent.go @@ -57,8 +57,8 @@ func SyncEvent(ctx *svc.ServiceContext) { func HandlePendingBlock(ctx *svc.ServiceContext, block schema.SyncBlock) error { log.Infof("[Handler.SyncEvent.PendingBlock]Start: %d, %s \n", block.BlockNumber, block.BlockHash) - // log.Infof("[Handler.SyncEvent.PendingBlock]GetContracts: %v\n", ctx.GetContracts()) - // log.Infof("[Handler.SyncEvent.PendingBlock]GetEvents: %v\n", blockchain.GetEvents()) + //log.Infof("[Handler.SyncEvent.PendingBlock]GetContracts: %v\n", blockchain.GetContracts()) + //log.Infof("[Handler.SyncEvent.PendingBlock]GetEvents: %v\n", blockchain.GetEvents()) events, err := LogFilter(ctx, block, blockchain.GetContracts(), [][]common.Hash{blockchain.GetEvents()}) log.Infof("[Handler.SyncEvent.PendingBlock] block %d, events number is %d:", block.BlockNumber, len(events)) if err != nil { diff --git a/internal/handler/syncEvent_test.go b/internal/handler/syncEvent_test.go new file mode 100644 index 0000000..408373e --- /dev/null +++ b/internal/handler/syncEvent_test.go @@ -0,0 +1,7 @@ +package handler + +import "testing" + +func TestHanding(t *testing.T) { + +} diff --git a/internal/handler/syncProposal.go b/internal/handler/syncProposal.go index 992b61a..a584604 100644 --- a/internal/handler/syncProposal.go +++ b/internal/handler/syncProposal.go @@ -1,13 +1,13 @@ package handler import ( - "time" - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/pkg/log" "github.com/pkg/errors" "gorm.io/gorm" + "time" + + "github.com/b2network/b2committer/internal/svc" ) // SyncProposal sync proposal and process voting status @@ -15,13 +15,13 @@ func SyncProposal(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) proposalID := ctx.Config.InitProposalID for { - lastProposalID, _, err := ctx.NodeClient.QueryLastProposalID() + lastProposal, err := ctx.NodeClient.QueryLastProposal() if err != nil { log.Errorf("[Handler.Committer][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) time.Sleep(3 * time.Second) continue } - if lastProposalID < proposalID { + if lastProposal.Id < proposalID { log.Infof("[Handler.SyncProposal] Current proposalId is latest") time.Sleep(30 * time.Second) continue @@ -51,7 +51,7 @@ func SyncProposal(ctx *svc.ServiceContext) { continue } - if proposal.Status == schema.VotingStatus { + if proposal.Status == schema.ProposalVotingStatus { // voting verifyBatchInfo, err := GetVerifyBatchInfoByLastBatchNum(ctx, proposal.StartIndex) if err != nil { @@ -60,7 +60,7 @@ func SyncProposal(ctx *svc.ServiceContext) { continue } - _, err = ctx.NodeClient.SubmitProof(proposal.Id, ctx.B2NodeConfig.Address, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, + _, err = ctx.NodeClient.SubmitProof(proposal.Id, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, verifyBatchInfo.startBatchNum, verifyBatchInfo.endBatchNum) if err != nil { log.Errorf("[Handler.SyncProposal] vote proposal error info", errors.WithStack(err)) @@ -75,8 +75,7 @@ func SyncProposal(ctx *svc.ServiceContext) { }, EndBatchNum: verifyBatchInfo.endBatchNum, ProposalID: proposal.Id, - Proposer: proposal.Proposer, - Status: schema.VotingStatus, + Status: schema.ProposalVotingStatus, StateRootHash: verifyBatchInfo.stateRootHash, ProofRootHash: verifyBatchInfo.proofRootHash, StartBatchNum: verifyBatchInfo.startBatchNum, diff --git a/internal/schema/proposal.go b/internal/schema/proposal.go index 5aae254..7dff948 100644 --- a/internal/schema/proposal.go +++ b/internal/schema/proposal.go @@ -1,16 +1,15 @@ package schema const ( - VotingStatus = 0 - PendingStatus = 1 - SucceedStatus = 2 - TimeoutStatus = 3 + ProposalVotingStatus = 0 + ProposalPendingStatus = 1 + ProposalSucceedStatus = 2 + ProposalTimeoutStatus = 3 ) type Proposal struct { Base ProposalID uint64 `json:"proposal_id"` - Proposer string `json:"proposer"` StateRootHash string `json:"state_root_hash"` ProofRootHash string `json:"proof_root_hash"` StartBatchNum uint64 `json:"start_batch_num"` diff --git a/internal/svc/svc.go b/internal/svc/svc.go index ee164e1..b5d4b5a 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -1,9 +1,8 @@ package svc import ( - "time" - "github.com/b2network/b2committer/pkg/b2node" + "time" "github.com/b2network/b2committer/pkg/log" @@ -57,11 +56,12 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 privateKeHex := b2nodeConfig.PrivateKey chainID := b2nodeConfig.ChainID address := b2nodeConfig.Address - grpcConn, err := types.GetClientConnection(b2nodeConfig.GRPCHost, types.WithClientPortOption(b2nodeConfig.GRPCPort)) + contractAddress := b2nodeConfig.CommitterAddress + b2rpc, err := ethclient.Dial(b2nodeConfig.RPCUrl) if err != nil { log.Panicf("[svc] init b2node grpc panic: %s\n", err) } - nodeClient := b2node.NewNodeClient(privateKeHex, chainID, address, grpcConn, b2nodeConfig.RPCUrl, b2nodeConfig.CoinDenom) + nodeClient := b2node.NewNodeClient(privateKeHex, chainID, address, contractAddress, b2rpc) svc = &ServiceContext{ BTCConfig: bitcoinCfg, diff --git a/internal/types/config.go b/internal/types/config.go index 46e37d9..3059da2 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -18,19 +18,17 @@ type Config struct { Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"70000"` InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0xb2fa3c8011ce25bb1d261403107b58b6aeda8a2af3827e86ad70ee081966d99c"` - PolygonZKEVMAddress string `env:"POLYGON_ZKEVM_ADDRESS" envDefault:"0xd9571Aaf414b0F51d40D6738813FA4eA782d18B7"` + PolygonZKEVMAddress string `env:"POLYGON_ZKEVM_ADDRESS" envDefault:"0xa997cfD539E703921fD1e3Cf25b4c241a27a4c7A"` LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` } type B2NODEConfig struct { - Address string `env:"B2NODE_ADDRESS" envDefault:"ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a"` - ChainID string `env:"B2NODE_CHAIN_ID" envDefault:"ethermint_9000-1"` - GRPCHost string `env:"B2NODE_GRPC_HOST" envDefault:"127.0.0.1"` - GRPCPort uint32 `env:"B2NODE_GRPC_PORT" envDefault:"9090"` - RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"http://localhost:8545"` - CoinDenom string `env:"B2NODE_COIN_DENOM" envDefault:"aphoton"` - PrivateKey string `env:"B2NODE_PRIVATE_KEY" envDefault:"b2dd35d83b69d0d572616713148e83ba7d7f02fb14f442ffc4246319c61a3fa3"` + ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` + RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512"` + CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0xBf0Fe27C50f7cf155888bf24Bf0a5104Db926661"` + Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0x0DD3684F0C7e6b383C7bEc2901dCDa4b5360D893"` + PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } type BitcoinRPCConfig struct { diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go index 32f0dea..2335db0 100644 --- a/pkg/b2node/b2node.go +++ b/pkg/b2node/b2node.go @@ -1,313 +1,346 @@ package b2node import ( - "context" - "encoding/hex" - "encoding/json" + "crypto/ecdsa" "fmt" - "strconv" - - "github.com/b2network/b2committer/pkg/rpc" - - sdkmath "cosmossdk.io/math" - - clientTx "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/tx" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - xauthsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/ethermint/crypto/ethsecp256k1" - eTypes "github.com/evmos/ethermint/types" - committerTypes "github.com/evmos/ethermint/x/committer/types" - feeTypes "github.com/evmos/ethermint/x/feemarket/types" - "google.golang.org/grpc" -) - -const ( - DefaultBaseGasPrice = 10_000_000 + "github.com/b2network/b2committer/pkg/contract" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "math/big" ) type NodeClient struct { - PrivateKey ethsecp256k1.PrivKey - Address string - ChainID string - GrpcConn *grpc.ClientConn - RPCUrl string - Denom string + PrivateKey *ecdsa.PrivateKey + ContractAddress string + Address string + ChainID int64 + Conn *ethclient.Client + Committer *contract.Committer + Auth *bind.TransactOpts } -type GasPriceRsp struct { - ID int64 `json:"id"` - Jsonrpc string `json:"jsonrpc"` - Result string `json:"result"` -} - -func NewNodeClient(privateKeyHex string, chainID string, address string, grpcConn *grpc.ClientConn, - rpcURL string, denom string, -) *NodeClient { - privatekeyBytes, err := hex.DecodeString(privateKeyHex) +func NewNodeClient(privateKeyStr string, chainID int64, address string, contractAddress string, conn *ethclient.Client) *NodeClient { + privateKey, err := crypto.HexToECDSA(privateKeyStr) if nil != err { panic(err) } + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) return &NodeClient{ - PrivateKey: ethsecp256k1.PrivKey{ - Key: privatekeyBytes, - }, - Address: address, - ChainID: chainID, - GrpcConn: grpcConn, - RPCUrl: rpcURL, - Denom: denom, + PrivateKey: privateKey, + Address: address, + ChainID: chainID, + Conn: conn, + Committer: committer, + Auth: auth, } } func (n NodeClient) AddCommitter(address string) (string, error) { - msg := committerTypes.NewMsgAddCommitter(n.Address, address) - msgResponse, err := n.broadcastTx(msg) + tx, err := n.Committer.AddProposer(&bind.TransactOpts{ + From: n.Auth.From, + Signer: n.Auth.Signer, + }, common.HexToAddress(address)) if err != nil { return "", fmt.Errorf("[AddCommitter] err: %s", err) } - code := msgResponse.TxResponse.Code - rawLog := msgResponse.TxResponse.RawLog - if code != 0 { - return "", fmt.Errorf("[AddCommitter][msgResponse.TxResponse.Code] err: %s", rawLog) - } - hexData := msgResponse.TxResponse.Data - byteData, err := hex.DecodeString(hexData) - if err != nil { - return "", fmt.Errorf("[AddCommitter][hex.DecodeString] err: %s", err) - } - pbMsg := &sdk.TxMsgData{} - err = pbMsg.Unmarshal(byteData) - if err != nil { - return "", fmt.Errorf("[AddCommitter][pbMsg.Unmarshal] err: %s", err) - } - resMsgRes := &committerTypes.MsgAddCommitterResponse{} - err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) - if err != nil { - return "", fmt.Errorf("[AddCommitter][resMsgRes.Unmarshal] err: %s", err) - } - return resMsgRes.Committer, err + return tx.Hash().String(), nil } -func (n NodeClient) GetAccountInfo(address string) (*eTypes.EthAccount, error) { - authClient := authTypes.NewQueryClient(n.GrpcConn) - res, err := authClient.Account(context.Background(), &authTypes.QueryAccountRequest{Address: address}) - if err != nil { - return nil, fmt.Errorf("[NodeClient] GetAccountInfo err: %s", err) - } - ethAccount := &eTypes.EthAccount{} - err = ethAccount.Unmarshal(res.GetAccount().GetValue()) +func (n NodeClient) QueryAllProposers() ([]common.Address, error) { + res, err := n.Committer.AllProposers(&bind.CallOpts{}) if err != nil { - return nil, fmt.Errorf("[NodeClient][ethAccount.Unmarshal] err: %s", err) + return nil, fmt.Errorf("[QueryAllProposers] err: %s", err) } - return ethAccount, nil + return res, nil } -func (n NodeClient) SubmitProof(id uint64, from string, proofHash string, stateRootHash string, - startIndex uint64, endIndex uint64, -) (uint64, error) { - msg := committerTypes.NewMsgSubmitProof(id, from, proofHash, stateRootHash, startIndex, endIndex) - msgResponse, err := n.broadcastTx(msg) +func (n NodeClient) RemoveProposers(address common.Address) (*types.Transaction, error) { + tx, err := n.Committer.RemoveProposer(&bind.TransactOpts{ + From: n.Auth.From, + Signer: n.Auth.Signer, + }, address) if err != nil { - return 0, fmt.Errorf("[SubmitProof] err: %s", err) - } - code := msgResponse.TxResponse.Code - rawLog := msgResponse.TxResponse.RawLog - if code != 0 { - return 0, fmt.Errorf("[SubmitProof][msgResponse.TxResponse.Code] err: %s", rawLog) + return nil, fmt.Errorf("[RemoveProposers] err: %s", err) } - hexData := msgResponse.TxResponse.Data - byteData, err := hex.DecodeString(hexData) - if err != nil { - return 0, fmt.Errorf("[SubmitProof][hex.DecodeString] err: %s", err) - } - pbMsg := &sdk.TxMsgData{} - err = pbMsg.Unmarshal(byteData) - if err != nil { - return 0, fmt.Errorf("[SubmitProof][pbMsg.Unmarshal] err: %s", err) - } - - resMsgRes := &committerTypes.MsgSubmitProofResponse{} - err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) - if err != nil { - return 0, fmt.Errorf("[SubmitProof][resMsgRes.Unmarshal] err: %s", err) - } - return resMsgRes.Id, err -} - -func (n NodeClient) BitcoinTx(proposalID uint64, from string, bitcoinTxHash string) (uint64, error) { - msg := committerTypes.NewMsgBitcoinTx(proposalID, from, bitcoinTxHash) - msgResponse, err := n.broadcastTx(msg) - if err != nil { - return 0, fmt.Errorf("[BitcoinTx] err: %s", err) - } - code := msgResponse.TxResponse.Code - rawLog := msgResponse.TxResponse.RawLog - if code != 0 { - return 0, fmt.Errorf("[BitcoinTx][msgResponse.TxResponse.Code] err: %s", rawLog) - } - hexData := msgResponse.TxResponse.Data - byteData, err := hex.DecodeString(hexData) - if err != nil { - return 0, fmt.Errorf("[BitcoinTx][hex.DecodeString] err: %s", err) - } - pbMsg := &sdk.TxMsgData{} - err = pbMsg.Unmarshal(byteData) - if err != nil { - return 0, fmt.Errorf("[BitcoinTx][pbMsg.Unmarshal] err: %s", err) - } - - resMsgRes := &committerTypes.MsgSubmitProofResponse{} - err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) - if err != nil { - return 0, fmt.Errorf("[BitcoinTx][resMsgRes.Unmarshal] err: %s", err) - } - return resMsgRes.Id, err + return tx, nil } -func (n NodeClient) GetEthGasPrice() (uint64, error) { - gasPriceByte, err := rpc.HTTPPostJSON("", n.RPCUrl, `{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}`) - if err != nil { - return 0, fmt.Errorf("[GetEthGasPrice] err: %s", err) - } - var g GasPriceRsp - if err := json.Unmarshal(gasPriceByte, &g); err != nil { - return 0, fmt.Errorf("[GetEthGasPrice.json.Unmarshal] err: %s", err) - } - parseUint, err := strconv.ParseUint(g.Result, 0, 64) - if err != nil { - return 0, fmt.Errorf("[GetEthGasPrice.strconv.ParseUint] err: %s", err) - } - return parseUint, nil -} - -func (n NodeClient) GetGasPrice() (uint64, error) { - queryClient := feeTypes.NewQueryClient(n.GrpcConn) - res, err := queryClient.Params(context.Background(), &feeTypes.QueryParamsRequest{}) - if err != nil { - return 0, fmt.Errorf("[GetGasPrice] err: %s", err) - } - return res.Params.BaseFee.Uint64(), nil -} - -func (n NodeClient) broadcastTx(msgs ...sdk.Msg) (*tx.BroadcastTxResponse, error) { - gasPrice, err := n.GetGasPrice() - if err != nil { - return nil, fmt.Errorf("[broadcastTx][GetGasPrice] err: %s", err) - } - txBytes, err := n.buildSimTx(gasPrice, msgs...) - if err != nil { - return nil, fmt.Errorf("[SubmitProof] err: %s", err) - } - txClient := tx.NewServiceClient(n.GrpcConn) - res, err := txClient.BroadcastTx(context.Background(), &tx.BroadcastTxRequest{ - Mode: tx.BroadcastMode_BROADCAST_MODE_BLOCK, - TxBytes: txBytes, +func (n NodeClient) QueryLastProposal() (*contract.CommitterProposal, error) { + proposal, err := n.Committer.GetLastProposal(&bind.CallOpts{ + From: common.HexToAddress(n.Address), }) if err != nil { - return nil, fmt.Errorf("[SubmitProof][BroadcastTx] err: %s", err) + return nil, fmt.Errorf("[QueryLastProposalID] err: %s", err) } - return res, err + return &proposal, nil } -func (n NodeClient) buildSimTx(gasPrice uint64, msgs ...sdk.Msg) ([]byte, error) { - encCfg := simapp.MakeTestEncodingConfig() - txBuilder := encCfg.TxConfig.NewTxBuilder() - err := txBuilder.SetMsgs(msgs...) - if err != nil { - return nil, fmt.Errorf("[BuildSimTx][SetMsgs] err: %s", err) - } - ethAccount, err := n.GetAccountInfo(n.Address) - if nil != err { - return nil, fmt.Errorf("[BuildSimTx][GetAccountInfo]err: %s", err) - } - signV2 := signing.SignatureV2{ - PubKey: n.PrivateKey.PubKey(), - Data: &signing.SingleSignatureData{ - SignMode: encCfg.TxConfig.SignModeHandler().DefaultMode(), - }, - Sequence: ethAccount.BaseAccount.Sequence, - } - err = txBuilder.SetSignatures(signV2) - if err != nil { - return nil, fmt.Errorf("[BuildSimTx][SetSignatures 1]err: %s", err) - } - txBuilder.SetGasLimit(DefaultBaseGasPrice) - txBuilder.SetFeeAmount(sdk.NewCoins(sdk.Coin{ - Denom: n.Denom, - Amount: sdkmath.NewIntFromUint64(gasPrice * DefaultBaseGasPrice), - })) - - signerData := xauthsigning.SignerData{ - ChainID: n.ChainID, - AccountNumber: ethAccount.BaseAccount.AccountNumber, - Sequence: ethAccount.BaseAccount.Sequence, - } - - sigV2, err := clientTx.SignWithPrivKey( - encCfg.TxConfig.SignModeHandler().DefaultMode(), signerData, - txBuilder, &n.PrivateKey, encCfg.TxConfig, ethAccount.BaseAccount.Sequence) - if err != nil { - return nil, fmt.Errorf("[BuildSimTx][SignWithPrivKey] err: %s", err) - } - - err = txBuilder.SetSignatures(sigV2) +func (n NodeClient) QueryProposalByID(id uint64) (*contract.CommitterProposal, error) { + proposal, err := n.Committer.Proposal(&bind.CallOpts{ + From: common.HexToAddress(n.Address), + }, id) if err != nil { - return nil, fmt.Errorf("[BuildSimTx][SetSignatures 2] err: %s", err) - } - txBytes, err := encCfg.TxConfig.TxEncoder()(txBuilder.GetTx()) - if err != nil { - return nil, fmt.Errorf("[BuildSimTx][GetTx] err: %s", err) + return nil, fmt.Errorf("[QueryProposalByID] err: %s", err) } - return txBytes, err + return &proposal, nil } -func (n NodeClient) QueryLastProposalID() (uint64, uint64, error) { - queryClient := committerTypes.NewQueryClient(n.GrpcConn) - res, err := queryClient.LastProposalID(context.Background(), &committerTypes.QueryLastProposalIdRequest{}) +func (n NodeClient) SubmitProof(id uint64, proofHash string, stateRootHash string, + startIndex uint64, endIndex uint64, +) (*types.Transaction, error) { + tx, err := n.Committer.SubmitProof(&bind.TransactOpts{ + From: n.Auth.From, + Signer: n.Auth.Signer, + }, id, proofHash, stateRootHash, startIndex, endIndex) if err != nil { - return 0, 0, fmt.Errorf("[QueryLastProposalID] err: %s", err) + return nil, fmt.Errorf("[SubmitProof] err: %s", err) } - return res.LastProposalId, res.EndIndex, nil + return tx, nil } -func (n NodeClient) QueryProposalByID(id uint64) (*committerTypes.Proposal, error) { - queryClient := committerTypes.NewQueryClient(n.GrpcConn) - res, err := queryClient.Proposal(context.Background(), &committerTypes.QueryProposalRequest{ProposalId: id}) +func (n NodeClient) BitcoinTxHash(id uint64, txHash string) (*types.Transaction, error) { + tx, err := n.Committer.BitcoinTx(&bind.TransactOpts{ + From: n.Auth.From, + Signer: n.Auth.Signer, + }, id, txHash) if err != nil { - return nil, fmt.Errorf("[QueryProposalByID] err: %s", err) + return nil, fmt.Errorf("[BitcoinTxHash] err: %s", err) } - return res.Proposal, nil + return tx, nil } -func (n NodeClient) CommitterBitcoinTx(msg *committerTypes.MsgBitcoinTx) (*tx.BroadcastTxResponse, error) { - gasPrice, err := n.GetGasPrice() - if err != nil { - return nil, fmt.Errorf("[CommitterBitcoinTx][GetGasPrice] err: %s", err) - } - txBytes, err := n.buildSimTx(gasPrice, msg) - if err != nil { - return nil, fmt.Errorf("[SubmitProof] err: %s", err) - } - txClient := tx.NewServiceClient(n.GrpcConn) - res, err := txClient.BroadcastTx(context.Background(), &tx.BroadcastTxRequest{ - Mode: tx.BroadcastMode_BROADCAST_MODE_BLOCK, - TxBytes: txBytes, - }) +func (n NodeClient) TimeoutProposal(id uint64) (*types.Transaction, error) { + tx, err := n.Committer.TimeoutProposal(&bind.TransactOpts{ + From: n.Auth.From, + Signer: n.Auth.Signer, + }, id) if err != nil { - return nil, fmt.Errorf("[SubmitProof][BroadcastTx] err: %s", err) + return nil, fmt.Errorf("[TimeoutProposal] err: %s", err) } - return res, err + return tx, nil } -func (n NodeClient) TimeoutProposal(id uint64) error { - msg := &committerTypes.MsgTimeoutProposal{Id: id, From: n.Address} - _, err := n.broadcastTx(msg) - if err != nil { - return fmt.Errorf("[TimeoutProposal] err: %s", err) - } - return nil -} +// +//func (n NodeClient) GetAccountInfo(address string) (*eTypes.EthAccount, error) { +// authClient := authTypes.NewQueryClient(n.GrpcConn) +// res, err := authClient.Account(context.Background(), &authTypes.QueryAccountRequest{Address: address}) +// if err != nil { +// return nil, fmt.Errorf("[NodeClient] GetAccountInfo err: %s", err) +// } +// ethAccount := &eTypes.EthAccount{} +// err = ethAccount.Unmarshal(res.GetAccount().GetValue()) +// if err != nil { +// return nil, fmt.Errorf("[NodeClient][ethAccount.Unmarshal] err: %s", err) +// } +// return ethAccount, nil +//} +// +//func (n NodeClient) SubmitProof(id uint64, from string, proofHash string, stateRootHash string, +// startIndex uint64, endIndex uint64, +//) (uint64, error) { +// msg := committerTypes.NewMsgSubmitProof(id, from, proofHash, stateRootHash, startIndex, endIndex) +// msgResponse, err := n.broadcastTx(msg) +// if err != nil { +// return 0, fmt.Errorf("[SubmitProof] err: %s", err) +// } +// code := msgResponse.TxResponse.Code +// rawLog := msgResponse.TxResponse.RawLog +// if code != 0 { +// return 0, fmt.Errorf("[SubmitProof][msgResponse.TxResponse.Code] err: %s", rawLog) +// } +// hexData := msgResponse.TxResponse.Data +// byteData, err := hex.DecodeString(hexData) +// if err != nil { +// return 0, fmt.Errorf("[SubmitProof][hex.DecodeString] err: %s", err) +// } +// pbMsg := &sdk.TxMsgData{} +// err = pbMsg.Unmarshal(byteData) +// if err != nil { +// return 0, fmt.Errorf("[SubmitProof][pbMsg.Unmarshal] err: %s", err) +// } +// +// resMsgRes := &committerTypes.MsgSubmitProofResponse{} +// err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) +// if err != nil { +// return 0, fmt.Errorf("[SubmitProof][resMsgRes.Unmarshal] err: %s", err) +// } +// return resMsgRes.Id, err +//} +// +//func (n NodeClient) BitcoinTx(proposalID uint64, from string, bitcoinTxHash string) (uint64, error) { +// msg := committerTypes.NewMsgBitcoinTx(proposalID, from, bitcoinTxHash) +// msgResponse, err := n.broadcastTx(msg) +// if err != nil { +// return 0, fmt.Errorf("[BitcoinTx] err: %s", err) +// } +// code := msgResponse.TxResponse.Code +// rawLog := msgResponse.TxResponse.RawLog +// if code != 0 { +// return 0, fmt.Errorf("[BitcoinTx][msgResponse.TxResponse.Code] err: %s", rawLog) +// } +// hexData := msgResponse.TxResponse.Data +// byteData, err := hex.DecodeString(hexData) +// if err != nil { +// return 0, fmt.Errorf("[BitcoinTx][hex.DecodeString] err: %s", err) +// } +// pbMsg := &sdk.TxMsgData{} +// err = pbMsg.Unmarshal(byteData) +// if err != nil { +// return 0, fmt.Errorf("[BitcoinTx][pbMsg.Unmarshal] err: %s", err) +// } +// +// resMsgRes := &committerTypes.MsgSubmitProofResponse{} +// err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) +// if err != nil { +// return 0, fmt.Errorf("[BitcoinTx][resMsgRes.Unmarshal] err: %s", err) +// } +// return resMsgRes.Id, err +//} +// +//func (n NodeClient) GetEthGasPrice() (uint64, error) { +// gasPriceByte, err := rpc.HTTPPostJSON("", n.RPCUrl, `{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}`) +// if err != nil { +// return 0, fmt.Errorf("[GetEthGasPrice] err: %s", err) +// } +// var g GasPriceRsp +// if err := json.Unmarshal(gasPriceByte, &g); err != nil { +// return 0, fmt.Errorf("[GetEthGasPrice.json.Unmarshal] err: %s", err) +// } +// parseUint, err := strconv.ParseUint(g.Result, 0, 64) +// if err != nil { +// return 0, fmt.Errorf("[GetEthGasPrice.strconv.ParseUint] err: %s", err) +// } +// return parseUint, nil +//} +// +//func (n NodeClient) GetGasPrice() (uint64, error) { +// queryClient := feeTypes.NewQueryClient(n.GrpcConn) +// res, err := queryClient.Params(context.Background(), &feeTypes.QueryParamsRequest{}) +// if err != nil { +// return 0, fmt.Errorf("[GetGasPrice] err: %s", err) +// } +// return res.Params.BaseFee.Uint64(), nil +//} +// +//func (n NodeClient) broadcastTx(msgs ...sdk.Msg) (*tx.BroadcastTxResponse, error) { +// gasPrice, err := n.GetGasPrice() +// if err != nil { +// return nil, fmt.Errorf("[broadcastTx][GetGasPrice] err: %s", err) +// } +// txBytes, err := n.buildSimTx(gasPrice, msgs...) +// if err != nil { +// return nil, fmt.Errorf("[SubmitProof] err: %s", err) +// } +// txClient := tx.NewServiceClient(n.GrpcConn) +// res, err := txClient.BroadcastTx(context.Background(), &tx.BroadcastTxRequest{ +// Mode: tx.BroadcastMode_BROADCAST_MODE_BLOCK, +// TxBytes: txBytes, +// }) +// if err != nil { +// return nil, fmt.Errorf("[SubmitProof][BroadcastTx] err: %s", err) +// } +// return res, err +//} +// +//func (n NodeClient) buildSimTx(gasPrice uint64, msgs ...sdk.Msg) ([]byte, error) { +// encCfg := simapp.MakeTestEncodingConfig() +// txBuilder := encCfg.TxConfig.NewTxBuilder() +// err := txBuilder.SetMsgs(msgs...) +// if err != nil { +// return nil, fmt.Errorf("[BuildSimTx][SetMsgs] err: %s", err) +// } +// ethAccount, err := n.GetAccountInfo(n.Address) +// if nil != err { +// return nil, fmt.Errorf("[BuildSimTx][GetAccountInfo]err: %s", err) +// } +// signV2 := signing.SignatureV2{ +// PubKey: n.PrivateKey.PubKey(), +// Data: &signing.SingleSignatureData{ +// SignMode: encCfg.TxConfig.SignModeHandler().DefaultMode(), +// }, +// Sequence: ethAccount.BaseAccount.Sequence, +// } +// err = txBuilder.SetSignatures(signV2) +// if err != nil { +// return nil, fmt.Errorf("[BuildSimTx][SetSignatures 1]err: %s", err) +// } +// txBuilder.SetGasLimit(DefaultBaseGasPrice) +// txBuilder.SetFeeAmount(sdk.NewCoins(sdk.Coin{ +// Denom: n.Denom, +// Amount: sdkmath.NewIntFromUint64(gasPrice * DefaultBaseGasPrice), +// })) +// +// signerData := xauthsigning.SignerData{ +// ChainID: n.ChainID, +// AccountNumber: ethAccount.BaseAccount.AccountNumber, +// Sequence: ethAccount.BaseAccount.Sequence, +// } +// +// sigV2, err := clientTx.SignWithPrivKey( +// encCfg.TxConfig.SignModeHandler().DefaultMode(), signerData, +// txBuilder, &n.PrivateKey, encCfg.TxConfig, ethAccount.BaseAccount.Sequence) +// if err != nil { +// return nil, fmt.Errorf("[BuildSimTx][SignWithPrivKey] err: %s", err) +// } +// +// err = txBuilder.SetSignatures(sigV2) +// if err != nil { +// return nil, fmt.Errorf("[BuildSimTx][SetSignatures 2] err: %s", err) +// } +// txBytes, err := encCfg.TxConfig.TxEncoder()(txBuilder.GetTx()) +// if err != nil { +// return nil, fmt.Errorf("[BuildSimTx][GetTx] err: %s", err) +// } +// return txBytes, err +//} +// +//func (n NodeClient) QueryLastProposalID() (uint64, uint64, error) { +// queryClient := committerTypes.NewQueryClient(n.GrpcConn) +// res, err := queryClient.LastProposalID(context.Background(), &committerTypes.QueryLastProposalIdRequest{}) +// if err != nil { +// return 0, 0, fmt.Errorf("[QueryLastProposalID] err: %s", err) +// } +// return res.LastProposalId, res.EndIndex, nil +//} +// +//func (n NodeClient) QueryProposalByID(id uint64) (*committerTypes.Proposal, error) { +// queryClient := committerTypes.NewQueryClient(n.GrpcConn) +// res, err := queryClient.Proposal(context.Background(), &committerTypes.QueryProposalRequest{ProposalId: id}) +// if err != nil { +// return nil, fmt.Errorf("[QueryProposalByID] err: %s", err) +// } +// return res.Proposal, nil +//} +// +//func (n NodeClient) CommitterBitcoinTx(msg *committerTypes.MsgBitcoinTx) (*tx.BroadcastTxResponse, error) { +// gasPrice, err := n.GetGasPrice() +// if err != nil { +// return nil, fmt.Errorf("[CommitterBitcoinTx][GetGasPrice] err: %s", err) +// } +// txBytes, err := n.buildSimTx(gasPrice, msg) +// if err != nil { +// return nil, fmt.Errorf("[SubmitProof] err: %s", err) +// } +// txClient := tx.NewServiceClient(n.GrpcConn) +// res, err := txClient.BroadcastTx(context.Background(), &tx.BroadcastTxRequest{ +// Mode: tx.BroadcastMode_BROADCAST_MODE_BLOCK, +// TxBytes: txBytes, +// }) +// if err != nil { +// return nil, fmt.Errorf("[SubmitProof][BroadcastTx] err: %s", err) +// } +// return res, err +//} +// +//func (n NodeClient) TimeoutProposal(id uint64) error { +// msg := &committerTypes.MsgTimeoutProposal{Id: id, From: n.Address} +// _, err := n.broadcastTx(msg) +// if err != nil { +// return fmt.Errorf("[TimeoutProposal] err: %s", err) +// } +// return nil +//} diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index 4ed4487..a30a1d3 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -1,164 +1,336 @@ package b2node import ( - "encoding/hex" "fmt" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/b2network/b2committer/pkg/contract" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" + "math/big" + "testing" +) - "github.com/b2network/b2committer/internal/types" - xcommitterTypes "github.com/evmos/ethermint/x/committer/types" +const ( + creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" + creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" + contractAddress = "0xb5f343da85c2FdA56811f628A537244793280F63" + URL = "https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512" + chainID = 11155111 ) -func TestGetAccountInfo(t *testing.T) { - privateKeHex := "234def6d66bb45c288521bbbd20b7b3cd542e5b6e26386dcec24f8e918251f5a" - chainID := "ethermint_9000-1" - address := "ethm1jvqt5echmshc8gjsqdzk9unclt8qkx4knxcjdj" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - addInfo, err := nodeClient.GetAccountInfo(address) - // - fmt.Println(addInfo.CodeHash) - fmt.Println(addInfo.BaseAccount.Sequence) - fmt.Println(addInfo.BaseAccount.Address) +func TestQueryTimeoutPeriod(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + time, _ := committer.TimeoutPeriod(&bind.CallOpts{ + From: common.HexToAddress(creatorAddress), + }) + fmt.Println(time) } -func TestSubmitProof(t *testing.T) { - privateKeHex := "234def6d66bb45c288521bbbd20b7b3cd542e5b6e26386dcec24f8e918251f5a" - chainID := "ethermint_9000-1" - address := "ethm1jvqt5echmshc8gjsqdzk9unclt8qkx4knxcjdj" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - proposalID, err := nodeClient.SubmitProof(0, address, "proof7", "stateRoot", 1, 70) - require.NoError(t, err) - fmt.Println(proposalID) +func TestSetTimeoutPeriod(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.SetTimeoutPeriod(&bind.TransactOpts{ + From: common.HexToAddress(creatorAddress), + Signer: auth.Signer, + }, big.NewInt(60*60*24)) + require.NoError(t, err) + fmt.Println(tx.Hash()) +} + +func TestAddCommitter(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.AddProposer(&bind.TransactOpts{ + From: auth.From, + Signer: auth.Signer, + }, common.HexToAddress(creatorAddress)) + require.NoError(t, err) + require.NotEmpty(t, tx.Hash()) } -func TestDecodeTxResponseData(t *testing.T) { - byteData, _ := hex.DecodeString("12370A312F65766D6F732E65746865726D696E742E636F6D6D69747465722E4D73675375626D697450726F6F66526573706F6E736512020808") - pbMsg := &sdk.TxMsgData{} - // proto.Marshal(&sdk.TxMsgData{MsgResponses: msgResponses}) - pbMsg.Unmarshal(byteData) - fmt.Println(pbMsg.MsgResponses[0].TypeUrl) - resMsgRes := &xcommitterTypes.MsgSubmitProofResponse{} - resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) - fmt.Println(resMsgRes.Id) +func TestQueryAllCommitter(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + res, err := committer.AllProposers(&bind.CallOpts{ + From: common.HexToAddress(creatorAddress), + }) + fmt.Println(res) + require.NoError(t, err) + require.Containsf(t, res, common.HexToAddress(creatorAddress), "error message %s") +} + +func TestRemoveCommitter(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.RemoveProposer(&bind.TransactOpts{ + From: auth.From, + Signer: auth.Signer, + }, common.HexToAddress(creatorAddress)) + require.NotEmpty(t, tx.Hash()) } func TestQueryLastProposalID(t *testing.T) { - privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" - chainID := "ethermint_9000-1" - address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - lastID, endIndex, err := nodeClient.QueryLastProposalID() - if err != nil { - panic(err) - } - fmt.Println("lastID:", lastID) - fmt.Println("index:", endIndex) + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + proposal, err := committer.GetLastProposal(&bind.CallOpts{ + From: common.HexToAddress(creatorAddress), + }) + require.NoError(t, err) + fmt.Println(proposal) } func TestQueryProposalByID(t *testing.T) { - privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" - chainID := "ethermint_9000-1" - address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - proposal, err := nodeClient.QueryProposalByID(6) - fmt.Println("id:", proposal.Id) - fmt.Println("proposer:", proposal.Proposer) - fmt.Println("status:", proposal.Status) - fmt.Println("stateRootHash:", proposal.StateRootHash) - fmt.Println("winner:", proposal.Winner) - fmt.Println("voteList:", proposal.VotedListPhaseCommit) - fmt.Println("start index:", proposal.StartIndex) - fmt.Println("end index:", proposal.EndIndex) - fmt.Println("bitcoinTx:", proposal.BitcoinTxHash) -} + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() -func TestCommitterBitcoinTx(t *testing.T) { - privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" - chainID := "ethermint_9000-1" - address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - res, err := nodeClient.CommitterBitcoinTx(&xcommitterTypes.MsgBitcoinTx{Id: 1, From: "ethm10ky5utnz5ddlmus5t2mm5ftxal3u0u6rsnx5nl", BitcoinTxHash: "1234567890"}) + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) - fmt.Println(res) + proposal, err := committer.Proposal(&bind.CallOpts{ + From: common.HexToAddress(creatorAddress), + }, 1) + require.NoError(t, err) + fmt.Println(proposal) } -func TestGetETHGasPrice(t *testing.T) { - privateKeHex := "0c993419ff40521f20370c45721c92626c2f1fd35267258fb3d093ed0826b611" - chainID := "ethermint_9000-1" - address := "ethm1mffw0yzmusgm9fwd40jaal3vwustuhhx8rh03q" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - gasprice, err := nodeClient.GetEthGasPrice() - require.NoError(t, err) - fmt.Println(gasprice) +func TestSubmitProof(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.SubmitProof(&bind.TransactOpts{ + From: common.HexToAddress(creatorAddress), + Signer: auth.Signer, + }, 1, "proofHash", "stateRoot", 1, 10) + require.NoError(t, err) + fmt.Println(tx.Hash()) } -func TestGetGasPrice(t *testing.T) { - privateKeHex := "37927fcde10259a7114a58487cb6303d04c33291ba29bbb8e488eef150e6a59a" - chainID := "ethermint_9000-1" - address := "ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - gasPrice, err := nodeClient.GetGasPrice() - require.NoError(t, err) - fmt.Println(gasPrice) +func TestBitcoinTxHash(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.BitcoinTx(&bind.TransactOpts{ + From: common.HexToAddress(creatorAddress), + Signer: auth.Signer, + }, 1, "txHash") + require.NoError(t, err) + fmt.Println(tx.Hash()) } -func TestAddCommitter(t *testing.T) { - privateKeHex := "37927fcde10259a7114a58487cb6303d04c33291ba29bbb8e488eef150e6a59a" - chainID := "ethermint_9000-1" - address := "ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a" - rpcUrl := "http://localhost:8545" - denom := "aphoton" - grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) - if err != nil { - panic(err) - } - nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) - add, err := nodeClient.AddCommitter("ethm1c3csplac80qt22p5qwx3l5telv6ge9ycmzwe3w") - require.NoError(t, err) - fmt.Println(add) +func TestTimeoutProposal(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.TimeoutProposal(&bind.TransactOpts{ + From: common.HexToAddress(creatorAddress), + Signer: auth.Signer, + }, 1) + require.NoError(t, err) + fmt.Println(tx.Hash()) } + +//func TestGetAccountInfo(t *testing.T) { +// privateKeHex := "234def6d66bb45c288521bbbd20b7b3cd542e5b6e26386dcec24f8e918251f5a" +// chainID := "ethermint_9000-1" +// address := "ethm1jvqt5echmshc8gjsqdzk9unclt8qkx4knxcjdj" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// addInfo, err := nodeClient.GetAccountInfo(address) +// // +// fmt.Println(addInfo.CodeHash) +// fmt.Println(addInfo.BaseAccount.Sequence) +// fmt.Println(addInfo.BaseAccount.Address) +//} +// +//func TestSubmitProof(t *testing.T) { +// privateKeHex := "234def6d66bb45c288521bbbd20b7b3cd542e5b6e26386dcec24f8e918251f5a" +// chainID := "ethermint_9000-1" +// address := "ethm1jvqt5echmshc8gjsqdzk9unclt8qkx4knxcjdj" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// proposalID, err := nodeClient.SubmitProof(0, address, "proof7", "stateRoot", 1, 70) +// require.NoError(t, err) +// fmt.Println(proposalID) +//} +// +//func TestDecodeTxResponseData(t *testing.T) { +// byteData, _ := hex.DecodeString("12370A312F65766D6F732E65746865726D696E742E636F6D6D69747465722E4D73675375626D697450726F6F66526573706F6E736512020808") +// pbMsg := &sdk.TxMsgData{} +// // proto.Marshal(&sdk.TxMsgData{MsgResponses: msgResponses}) +// pbMsg.Unmarshal(byteData) +// fmt.Println(pbMsg.MsgResponses[0].TypeUrl) +// resMsgRes := &xcommitterTypes.MsgSubmitProofResponse{} +// resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) +// fmt.Println(resMsgRes.Id) +//} +// +//func TestQueryLastProposalID(t *testing.T) { +// privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" +// chainID := "ethermint_9000-1" +// address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// lastID, endIndex, err := nodeClient.QueryLastProposalID() +// if err != nil { +// panic(err) +// } +// fmt.Println("lastID:", lastID) +// fmt.Println("index:", endIndex) +//} +// +//func TestQueryProposalByID(t *testing.T) { +// privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" +// chainID := "ethermint_9000-1" +// address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// proposal, err := nodeClient.QueryProposalByID(6) +// fmt.Println("id:", proposal.Id) +// fmt.Println("proposer:", proposal.Proposer) +// fmt.Println("status:", proposal.Status) +// fmt.Println("stateRootHash:", proposal.StateRootHash) +// fmt.Println("winner:", proposal.Winner) +// fmt.Println("voteList:", proposal.VotedListPhaseCommit) +// fmt.Println("start index:", proposal.StartIndex) +// fmt.Println("end index:", proposal.EndIndex) +// fmt.Println("bitcoinTx:", proposal.BitcoinTxHash) +//} +// +//func TestCommitterBitcoinTx(t *testing.T) { +// privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" +// chainID := "ethermint_9000-1" +// address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// res, err := nodeClient.CommitterBitcoinTx(&xcommitterTypes.MsgBitcoinTx{Id: 1, From: "ethm10ky5utnz5ddlmus5t2mm5ftxal3u0u6rsnx5nl", BitcoinTxHash: "1234567890"}) +// require.NoError(t, err) +// fmt.Println(res) +//} +// +//func TestGetETHGasPrice(t *testing.T) { +// privateKeHex := "0c993419ff40521f20370c45721c92626c2f1fd35267258fb3d093ed0826b611" +// chainID := "ethermint_9000-1" +// address := "ethm1mffw0yzmusgm9fwd40jaal3vwustuhhx8rh03q" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// gasprice, err := nodeClient.GetEthGasPrice() +// require.NoError(t, err) +// fmt.Println(gasprice) +//} +// +//func TestGetGasPrice(t *testing.T) { +// privateKeHex := "37927fcde10259a7114a58487cb6303d04c33291ba29bbb8e488eef150e6a59a" +// chainID := "ethermint_9000-1" +// address := "ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// gasPrice, err := nodeClient.GetGasPrice() +// require.NoError(t, err) +// fmt.Println(gasPrice) +//} +// +//func TestAddCommitter(t *testing.T) { +// privateKeHex := "37927fcde10259a7114a58487cb6303d04c33291ba29bbb8e488eef150e6a59a" +// chainID := "ethermint_9000-1" +// address := "ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a" +// rpcUrl := "http://localhost:8545" +// denom := "aphoton" +// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) +// if err != nil { +// panic(err) +// } +// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) +// add, err := nodeClient.AddCommitter("ethm1c3csplac80qt22p5qwx3l5telv6ge9ycmzwe3w") +// require.NoError(t, err) +// fmt.Println(add) +//} diff --git a/pkg/contract/committer.go b/pkg/contract/committer.go new file mode 100644 index 0000000..650eca3 --- /dev/null +++ b/pkg/contract/committer.go @@ -0,0 +1,2179 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// CommitterProposal is an auto generated low-level Go binding around an user-defined struct. +type CommitterProposal struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +} + +// CommitterMetaData contains all meta data concerning the Committer contract. +var CommitterMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ProposalTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"phase\",\"type\":\"uint8\"}],\"name\":\"VoteProposal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"addProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allCommitPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allProposers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allTimeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"bitcoinTx\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"commitPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isProposer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnCommitPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnTimeoutPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"proposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"proposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proposers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proposersList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"removeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"}],\"name\":\"submitProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"timeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"timeoutProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// CommitterABI is the input ABI used to generate the binding from. +// Deprecated: Use CommitterMetaData.ABI instead. +var CommitterABI = CommitterMetaData.ABI + +// Committer is an auto generated Go binding around an Ethereum contract. +type Committer struct { + CommitterCaller // Read-only binding to the contract + CommitterTransactor // Write-only binding to the contract + CommitterFilterer // Log filterer for contract events +} + +// CommitterCaller is an auto generated read-only Go binding around an Ethereum contract. +type CommitterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommitterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CommitterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommitterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CommitterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommitterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CommitterSession struct { + Contract *Committer // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CommitterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CommitterCallerSession struct { + Contract *CommitterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CommitterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CommitterTransactorSession struct { + Contract *CommitterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CommitterRaw is an auto generated low-level Go binding around an Ethereum contract. +type CommitterRaw struct { + Contract *Committer // Generic contract binding to access the raw methods on +} + +// CommitterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CommitterCallerRaw struct { + Contract *CommitterCaller // Generic read-only contract binding to access the raw methods on +} + +// CommitterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CommitterTransactorRaw struct { + Contract *CommitterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCommitter creates a new instance of Committer, bound to a specific deployed contract. +func NewCommitter(address common.Address, backend bind.ContractBackend) (*Committer, error) { + contract, err := bindCommitter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Committer{CommitterCaller: CommitterCaller{contract: contract}, CommitterTransactor: CommitterTransactor{contract: contract}, CommitterFilterer: CommitterFilterer{contract: contract}}, nil +} + +// NewCommitterCaller creates a new read-only instance of Committer, bound to a specific deployed contract. +func NewCommitterCaller(address common.Address, caller bind.ContractCaller) (*CommitterCaller, error) { + contract, err := bindCommitter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CommitterCaller{contract: contract}, nil +} + +// NewCommitterTransactor creates a new write-only instance of Committer, bound to a specific deployed contract. +func NewCommitterTransactor(address common.Address, transactor bind.ContractTransactor) (*CommitterTransactor, error) { + contract, err := bindCommitter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CommitterTransactor{contract: contract}, nil +} + +// NewCommitterFilterer creates a new log filterer instance of Committer, bound to a specific deployed contract. +func NewCommitterFilterer(address common.Address, filterer bind.ContractFilterer) (*CommitterFilterer, error) { + contract, err := bindCommitter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CommitterFilterer{contract: contract}, nil +} + +// bindCommitter binds a generic wrapper to an already deployed contract. +func bindCommitter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CommitterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Committer *CommitterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Committer.Contract.CommitterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Committer *CommitterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Committer.Contract.CommitterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Committer *CommitterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Committer.Contract.CommitterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Committer *CommitterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Committer.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Committer *CommitterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Committer.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Committer *CommitterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Committer.Contract.contract.Transact(opts, method, params...) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_Committer *CommitterCaller) ADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_Committer *CommitterSession) ADMINROLE() ([32]byte, error) { + return _Committer.Contract.ADMINROLE(&_Committer.CallOpts) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_Committer *CommitterCallerSession) ADMINROLE() ([32]byte, error) { + return _Committer.Contract.ADMINROLE(&_Committer.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Committer *CommitterCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "DEFAULT_ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Committer *CommitterSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Committer.Contract.DEFAULTADMINROLE(&_Committer.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Committer *CommitterCallerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Committer.Contract.DEFAULTADMINROLE(&_Committer.CallOpts) +} + +// AllCommitPhaseVotes is a free data retrieval call binding the contract method 0x80214794. +// +// Solidity: function allCommitPhaseVotes(uint64 id) view returns(address[]) +func (_Committer *CommitterCaller) AllCommitPhaseVotes(opts *bind.CallOpts, id uint64) ([]common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "allCommitPhaseVotes", id) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllCommitPhaseVotes is a free data retrieval call binding the contract method 0x80214794. +// +// Solidity: function allCommitPhaseVotes(uint64 id) view returns(address[]) +func (_Committer *CommitterSession) AllCommitPhaseVotes(id uint64) ([]common.Address, error) { + return _Committer.Contract.AllCommitPhaseVotes(&_Committer.CallOpts, id) +} + +// AllCommitPhaseVotes is a free data retrieval call binding the contract method 0x80214794. +// +// Solidity: function allCommitPhaseVotes(uint64 id) view returns(address[]) +func (_Committer *CommitterCallerSession) AllCommitPhaseVotes(id uint64) ([]common.Address, error) { + return _Committer.Contract.AllCommitPhaseVotes(&_Committer.CallOpts, id) +} + +// AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. +// +// Solidity: function allProposers() view returns(address[]) +func (_Committer *CommitterCaller) AllProposers(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "allProposers") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. +// +// Solidity: function allProposers() view returns(address[]) +func (_Committer *CommitterSession) AllProposers() ([]common.Address, error) { + return _Committer.Contract.AllProposers(&_Committer.CallOpts) +} + +// AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. +// +// Solidity: function allProposers() view returns(address[]) +func (_Committer *CommitterCallerSession) AllProposers() ([]common.Address, error) { + return _Committer.Contract.AllProposers(&_Committer.CallOpts) +} + +// AllTimeoutPhaseVotes is a free data retrieval call binding the contract method 0xd1264f6b. +// +// Solidity: function allTimeoutPhaseVotes(uint64 id) view returns(address[]) +func (_Committer *CommitterCaller) AllTimeoutPhaseVotes(opts *bind.CallOpts, id uint64) ([]common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "allTimeoutPhaseVotes", id) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllTimeoutPhaseVotes is a free data retrieval call binding the contract method 0xd1264f6b. +// +// Solidity: function allTimeoutPhaseVotes(uint64 id) view returns(address[]) +func (_Committer *CommitterSession) AllTimeoutPhaseVotes(id uint64) ([]common.Address, error) { + return _Committer.Contract.AllTimeoutPhaseVotes(&_Committer.CallOpts, id) +} + +// AllTimeoutPhaseVotes is a free data retrieval call binding the contract method 0xd1264f6b. +// +// Solidity: function allTimeoutPhaseVotes(uint64 id) view returns(address[]) +func (_Committer *CommitterCallerSession) AllTimeoutPhaseVotes(id uint64) ([]common.Address, error) { + return _Committer.Contract.AllTimeoutPhaseVotes(&_Committer.CallOpts, id) +} + +// CommitPhaseVotes is a free data retrieval call binding the contract method 0xf5033e0d. +// +// Solidity: function commitPhaseVotes(uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCaller) CommitPhaseVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "commitPhaseVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// CommitPhaseVotes is a free data retrieval call binding the contract method 0xf5033e0d. +// +// Solidity: function commitPhaseVotes(uint64 , uint256 ) view returns(address) +func (_Committer *CommitterSession) CommitPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _Committer.Contract.CommitPhaseVotes(&_Committer.CallOpts, arg0, arg1) +} + +// CommitPhaseVotes is a free data retrieval call binding the contract method 0xf5033e0d. +// +// Solidity: function commitPhaseVotes(uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCallerSession) CommitPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _Committer.Contract.CommitPhaseVotes(&_Committer.CallOpts, arg0, arg1) +} + +// GetLastProposal is a free data retrieval call binding the contract method 0xf0ab3dd9. +// +// Solidity: function getLastProposal() view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) +func (_Committer *CommitterCaller) GetLastProposal(opts *bind.CallOpts) (CommitterProposal, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "getLastProposal") + + if err != nil { + return *new(CommitterProposal), err + } + + out0 := *abi.ConvertType(out[0], new(CommitterProposal)).(*CommitterProposal) + + return out0, err + +} + +// GetLastProposal is a free data retrieval call binding the contract method 0xf0ab3dd9. +// +// Solidity: function getLastProposal() view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) +func (_Committer *CommitterSession) GetLastProposal() (CommitterProposal, error) { + return _Committer.Contract.GetLastProposal(&_Committer.CallOpts) +} + +// GetLastProposal is a free data retrieval call binding the contract method 0xf0ab3dd9. +// +// Solidity: function getLastProposal() view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) +func (_Committer *CommitterCallerSession) GetLastProposal() (CommitterProposal, error) { + return _Committer.Contract.GetLastProposal(&_Committer.CallOpts) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Committer *CommitterCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "getRoleAdmin", role) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Committer *CommitterSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Committer.Contract.GetRoleAdmin(&_Committer.CallOpts, role) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Committer *CommitterCallerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Committer.Contract.GetRoleAdmin(&_Committer.CallOpts, role) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Committer *CommitterCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "hasRole", role, account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Committer *CommitterSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Committer.Contract.HasRole(&_Committer.CallOpts, role, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Committer *CommitterCallerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Committer.Contract.HasRole(&_Committer.CallOpts, role, account) +} + +// IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. +// +// Solidity: function isProposer(address sender) view returns(bool) +func (_Committer *CommitterCaller) IsProposer(opts *bind.CallOpts, sender common.Address) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "isProposer", sender) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. +// +// Solidity: function isProposer(address sender) view returns(bool) +func (_Committer *CommitterSession) IsProposer(sender common.Address) (bool, error) { + return _Committer.Contract.IsProposer(&_Committer.CallOpts, sender) +} + +// IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. +// +// Solidity: function isProposer(address sender) view returns(bool) +func (_Committer *CommitterCallerSession) IsProposer(sender common.Address) (bool, error) { + return _Committer.Contract.IsProposer(&_Committer.CallOpts, sender) +} + +// IsVotedOnCommitPhase is a free data retrieval call binding the contract method 0x9cd80503. +// +// Solidity: function isVotedOnCommitPhase(uint64 id, address voter) view returns(bool) +func (_Committer *CommitterCaller) IsVotedOnCommitPhase(opts *bind.CallOpts, id uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "isVotedOnCommitPhase", id, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOnCommitPhase is a free data retrieval call binding the contract method 0x9cd80503. +// +// Solidity: function isVotedOnCommitPhase(uint64 id, address voter) view returns(bool) +func (_Committer *CommitterSession) IsVotedOnCommitPhase(id uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnCommitPhase(&_Committer.CallOpts, id, voter) +} + +// IsVotedOnCommitPhase is a free data retrieval call binding the contract method 0x9cd80503. +// +// Solidity: function isVotedOnCommitPhase(uint64 id, address voter) view returns(bool) +func (_Committer *CommitterCallerSession) IsVotedOnCommitPhase(id uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnCommitPhase(&_Committer.CallOpts, id, voter) +} + +// IsVotedOnTimeoutPhase is a free data retrieval call binding the contract method 0xee253cf5. +// +// Solidity: function isVotedOnTimeoutPhase(uint64 id, address voter) view returns(bool) +func (_Committer *CommitterCaller) IsVotedOnTimeoutPhase(opts *bind.CallOpts, id uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "isVotedOnTimeoutPhase", id, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOnTimeoutPhase is a free data retrieval call binding the contract method 0xee253cf5. +// +// Solidity: function isVotedOnTimeoutPhase(uint64 id, address voter) view returns(bool) +func (_Committer *CommitterSession) IsVotedOnTimeoutPhase(id uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnTimeoutPhase(&_Committer.CallOpts, id, voter) +} + +// IsVotedOnTimeoutPhase is a free data retrieval call binding the contract method 0xee253cf5. +// +// Solidity: function isVotedOnTimeoutPhase(uint64 id, address voter) view returns(bool) +func (_Committer *CommitterCallerSession) IsVotedOnTimeoutPhase(id uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnTimeoutPhase(&_Committer.CallOpts, id, voter) +} + +// LastProposal is a free data retrieval call binding the contract method 0xd6740cdb. +// +// Solidity: function lastProposal() view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) +func (_Committer *CommitterCaller) LastProposal(opts *bind.CallOpts) (struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +}, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "lastProposal") + + outstruct := new(struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string + }) + if err != nil { + return *outstruct, err + } + + outstruct.Id = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.StartIndex = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.EndIndex = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.Status = *abi.ConvertType(out[3], new(uint8)).(*uint8) + outstruct.Timeout = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + outstruct.Winner = *abi.ConvertType(out[5], new(common.Address)).(*common.Address) + outstruct.ProofHash = *abi.ConvertType(out[6], new(string)).(*string) + outstruct.StateRootHash = *abi.ConvertType(out[7], new(string)).(*string) + outstruct.TxHash = *abi.ConvertType(out[8], new(string)).(*string) + + return *outstruct, err + +} + +// LastProposal is a free data retrieval call binding the contract method 0xd6740cdb. +// +// Solidity: function lastProposal() view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) +func (_Committer *CommitterSession) LastProposal() (struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +}, error) { + return _Committer.Contract.LastProposal(&_Committer.CallOpts) +} + +// LastProposal is a free data retrieval call binding the contract method 0xd6740cdb. +// +// Solidity: function lastProposal() view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) +func (_Committer *CommitterCallerSession) LastProposal() (struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +}, error) { + return _Committer.Contract.LastProposal(&_Committer.CallOpts) +} + +// Proposal is a free data retrieval call binding the contract method 0x7afa0aa3. +// +// Solidity: function proposal(uint64 id) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) +func (_Committer *CommitterCaller) Proposal(opts *bind.CallOpts, id uint64) (CommitterProposal, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "proposal", id) + + if err != nil { + return *new(CommitterProposal), err + } + + out0 := *abi.ConvertType(out[0], new(CommitterProposal)).(*CommitterProposal) + + return out0, err + +} + +// Proposal is a free data retrieval call binding the contract method 0x7afa0aa3. +// +// Solidity: function proposal(uint64 id) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) +func (_Committer *CommitterSession) Proposal(id uint64) (CommitterProposal, error) { + return _Committer.Contract.Proposal(&_Committer.CallOpts, id) +} + +// Proposal is a free data retrieval call binding the contract method 0x7afa0aa3. +// +// Solidity: function proposal(uint64 id) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) +func (_Committer *CommitterCallerSession) Proposal(id uint64) (CommitterProposal, error) { + return _Committer.Contract.Proposal(&_Committer.CallOpts, id) +} + +// Proposals is a free data retrieval call binding the contract method 0x31c5eec8. +// +// Solidity: function proposals(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) +func (_Committer *CommitterCaller) Proposals(opts *bind.CallOpts, arg0 uint64) (struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +}, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "proposals", arg0) + + outstruct := new(struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string + }) + if err != nil { + return *outstruct, err + } + + outstruct.Id = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.StartIndex = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.EndIndex = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.Status = *abi.ConvertType(out[3], new(uint8)).(*uint8) + outstruct.Timeout = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + outstruct.Winner = *abi.ConvertType(out[5], new(common.Address)).(*common.Address) + outstruct.ProofHash = *abi.ConvertType(out[6], new(string)).(*string) + outstruct.StateRootHash = *abi.ConvertType(out[7], new(string)).(*string) + outstruct.TxHash = *abi.ConvertType(out[8], new(string)).(*string) + + return *outstruct, err + +} + +// Proposals is a free data retrieval call binding the contract method 0x31c5eec8. +// +// Solidity: function proposals(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) +func (_Committer *CommitterSession) Proposals(arg0 uint64) (struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +}, error) { + return _Committer.Contract.Proposals(&_Committer.CallOpts, arg0) +} + +// Proposals is a free data retrieval call binding the contract method 0x31c5eec8. +// +// Solidity: function proposals(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) +func (_Committer *CommitterCallerSession) Proposals(arg0 uint64) (struct { + Id uint64 + StartIndex uint64 + EndIndex uint64 + Status uint8 + Timeout *big.Int + Winner common.Address + ProofHash string + StateRootHash string + TxHash string +}, error) { + return _Committer.Contract.Proposals(&_Committer.CallOpts, arg0) +} + +// Proposers is a free data retrieval call binding the contract method 0x18177497. +// +// Solidity: function proposers(address ) view returns(bool) +func (_Committer *CommitterCaller) Proposers(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "proposers", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Proposers is a free data retrieval call binding the contract method 0x18177497. +// +// Solidity: function proposers(address ) view returns(bool) +func (_Committer *CommitterSession) Proposers(arg0 common.Address) (bool, error) { + return _Committer.Contract.Proposers(&_Committer.CallOpts, arg0) +} + +// Proposers is a free data retrieval call binding the contract method 0x18177497. +// +// Solidity: function proposers(address ) view returns(bool) +func (_Committer *CommitterCallerSession) Proposers(arg0 common.Address) (bool, error) { + return _Committer.Contract.Proposers(&_Committer.CallOpts, arg0) +} + +// ProposersList is a free data retrieval call binding the contract method 0x5ad97dd8. +// +// Solidity: function proposersList(uint256 ) view returns(address) +func (_Committer *CommitterCaller) ProposersList(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "proposersList", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ProposersList is a free data retrieval call binding the contract method 0x5ad97dd8. +// +// Solidity: function proposersList(uint256 ) view returns(address) +func (_Committer *CommitterSession) ProposersList(arg0 *big.Int) (common.Address, error) { + return _Committer.Contract.ProposersList(&_Committer.CallOpts, arg0) +} + +// ProposersList is a free data retrieval call binding the contract method 0x5ad97dd8. +// +// Solidity: function proposersList(uint256 ) view returns(address) +func (_Committer *CommitterCallerSession) ProposersList(arg0 *big.Int) (common.Address, error) { + return _Committer.Contract.ProposersList(&_Committer.CallOpts, arg0) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Committer *CommitterCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Committer *CommitterSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Committer.Contract.SupportsInterface(&_Committer.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Committer *CommitterCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Committer.Contract.SupportsInterface(&_Committer.CallOpts, interfaceId) +} + +// TimeoutPeriod is a free data retrieval call binding the contract method 0x6cea6b82. +// +// Solidity: function timeoutPeriod() view returns(uint256) +func (_Committer *CommitterCaller) TimeoutPeriod(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "timeoutPeriod") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TimeoutPeriod is a free data retrieval call binding the contract method 0x6cea6b82. +// +// Solidity: function timeoutPeriod() view returns(uint256) +func (_Committer *CommitterSession) TimeoutPeriod() (*big.Int, error) { + return _Committer.Contract.TimeoutPeriod(&_Committer.CallOpts) +} + +// TimeoutPeriod is a free data retrieval call binding the contract method 0x6cea6b82. +// +// Solidity: function timeoutPeriod() view returns(uint256) +func (_Committer *CommitterCallerSession) TimeoutPeriod() (*big.Int, error) { + return _Committer.Contract.TimeoutPeriod(&_Committer.CallOpts) +} + +// TimeoutPhaseVotes is a free data retrieval call binding the contract method 0xae223c04. +// +// Solidity: function timeoutPhaseVotes(uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCaller) TimeoutPhaseVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "timeoutPhaseVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TimeoutPhaseVotes is a free data retrieval call binding the contract method 0xae223c04. +// +// Solidity: function timeoutPhaseVotes(uint64 , uint256 ) view returns(address) +func (_Committer *CommitterSession) TimeoutPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _Committer.Contract.TimeoutPhaseVotes(&_Committer.CallOpts, arg0, arg1) +} + +// TimeoutPhaseVotes is a free data retrieval call binding the contract method 0xae223c04. +// +// Solidity: function timeoutPhaseVotes(uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCallerSession) TimeoutPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _Committer.Contract.TimeoutPhaseVotes(&_Committer.CallOpts, arg0, arg1) +} + +// AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. +// +// Solidity: function addProposer(address proposer) returns() +func (_Committer *CommitterTransactor) AddProposer(opts *bind.TransactOpts, proposer common.Address) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "addProposer", proposer) +} + +// AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. +// +// Solidity: function addProposer(address proposer) returns() +func (_Committer *CommitterSession) AddProposer(proposer common.Address) (*types.Transaction, error) { + return _Committer.Contract.AddProposer(&_Committer.TransactOpts, proposer) +} + +// AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. +// +// Solidity: function addProposer(address proposer) returns() +func (_Committer *CommitterTransactorSession) AddProposer(proposer common.Address) (*types.Transaction, error) { + return _Committer.Contract.AddProposer(&_Committer.TransactOpts, proposer) +} + +// BitcoinTx is a paid mutator transaction binding the contract method 0x4b6ea54e. +// +// Solidity: function bitcoinTx(uint64 id, string txHash) returns() +func (_Committer *CommitterTransactor) BitcoinTx(opts *bind.TransactOpts, id uint64, txHash string) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "bitcoinTx", id, txHash) +} + +// BitcoinTx is a paid mutator transaction binding the contract method 0x4b6ea54e. +// +// Solidity: function bitcoinTx(uint64 id, string txHash) returns() +func (_Committer *CommitterSession) BitcoinTx(id uint64, txHash string) (*types.Transaction, error) { + return _Committer.Contract.BitcoinTx(&_Committer.TransactOpts, id, txHash) +} + +// BitcoinTx is a paid mutator transaction binding the contract method 0x4b6ea54e. +// +// Solidity: function bitcoinTx(uint64 id, string txHash) returns() +func (_Committer *CommitterTransactorSession) BitcoinTx(id uint64, txHash string) (*types.Transaction, error) { + return _Committer.Contract.BitcoinTx(&_Committer.TransactOpts, id, txHash) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Committer *CommitterTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "grantRole", role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Committer *CommitterSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Committer.Contract.GrantRole(&_Committer.TransactOpts, role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Committer *CommitterTransactorSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Committer.Contract.GrantRole(&_Committer.TransactOpts, role, account) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Committer *CommitterTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Committer *CommitterSession) Initialize() (*types.Transaction, error) { + return _Committer.Contract.Initialize(&_Committer.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Committer *CommitterTransactorSession) Initialize() (*types.Transaction, error) { + return _Committer.Contract.Initialize(&_Committer.TransactOpts) +} + +// RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. +// +// Solidity: function removeProposer(address proposer) returns() +func (_Committer *CommitterTransactor) RemoveProposer(opts *bind.TransactOpts, proposer common.Address) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "removeProposer", proposer) +} + +// RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. +// +// Solidity: function removeProposer(address proposer) returns() +func (_Committer *CommitterSession) RemoveProposer(proposer common.Address) (*types.Transaction, error) { + return _Committer.Contract.RemoveProposer(&_Committer.TransactOpts, proposer) +} + +// RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. +// +// Solidity: function removeProposer(address proposer) returns() +func (_Committer *CommitterTransactorSession) RemoveProposer(proposer common.Address) (*types.Transaction, error) { + return _Committer.Contract.RemoveProposer(&_Committer.TransactOpts, proposer) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Committer *CommitterTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "renounceRole", role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Committer *CommitterSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Committer.Contract.RenounceRole(&_Committer.TransactOpts, role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Committer *CommitterTransactorSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Committer.Contract.RenounceRole(&_Committer.TransactOpts, role, callerConfirmation) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Committer *CommitterTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "revokeRole", role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Committer *CommitterSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Committer.Contract.RevokeRole(&_Committer.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Committer *CommitterTransactorSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Committer.Contract.RevokeRole(&_Committer.TransactOpts, role, account) +} + +// SetTimeoutPeriod is a paid mutator transaction binding the contract method 0x227c6dfa. +// +// Solidity: function setTimeoutPeriod(uint256 period) returns() +func (_Committer *CommitterTransactor) SetTimeoutPeriod(opts *bind.TransactOpts, period *big.Int) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "setTimeoutPeriod", period) +} + +// SetTimeoutPeriod is a paid mutator transaction binding the contract method 0x227c6dfa. +// +// Solidity: function setTimeoutPeriod(uint256 period) returns() +func (_Committer *CommitterSession) SetTimeoutPeriod(period *big.Int) (*types.Transaction, error) { + return _Committer.Contract.SetTimeoutPeriod(&_Committer.TransactOpts, period) +} + +// SetTimeoutPeriod is a paid mutator transaction binding the contract method 0x227c6dfa. +// +// Solidity: function setTimeoutPeriod(uint256 period) returns() +func (_Committer *CommitterTransactorSession) SetTimeoutPeriod(period *big.Int) (*types.Transaction, error) { + return _Committer.Contract.SetTimeoutPeriod(&_Committer.TransactOpts, period) +} + +// SubmitProof is a paid mutator transaction binding the contract method 0xbe091822. +// +// Solidity: function submitProof(uint64 id, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() +func (_Committer *CommitterTransactor) SubmitProof(opts *bind.TransactOpts, id uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "submitProof", id, proofHash, stateRootHash, startIndex, endIndex) +} + +// SubmitProof is a paid mutator transaction binding the contract method 0xbe091822. +// +// Solidity: function submitProof(uint64 id, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() +func (_Committer *CommitterSession) SubmitProof(id uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { + return _Committer.Contract.SubmitProof(&_Committer.TransactOpts, id, proofHash, stateRootHash, startIndex, endIndex) +} + +// SubmitProof is a paid mutator transaction binding the contract method 0xbe091822. +// +// Solidity: function submitProof(uint64 id, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() +func (_Committer *CommitterTransactorSession) SubmitProof(id uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { + return _Committer.Contract.SubmitProof(&_Committer.TransactOpts, id, proofHash, stateRootHash, startIndex, endIndex) +} + +// TimeoutProposal is a paid mutator transaction binding the contract method 0x84237c46. +// +// Solidity: function timeoutProposal(uint64 id) returns() +func (_Committer *CommitterTransactor) TimeoutProposal(opts *bind.TransactOpts, id uint64) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "timeoutProposal", id) +} + +// TimeoutProposal is a paid mutator transaction binding the contract method 0x84237c46. +// +// Solidity: function timeoutProposal(uint64 id) returns() +func (_Committer *CommitterSession) TimeoutProposal(id uint64) (*types.Transaction, error) { + return _Committer.Contract.TimeoutProposal(&_Committer.TransactOpts, id) +} + +// TimeoutProposal is a paid mutator transaction binding the contract method 0x84237c46. +// +// Solidity: function timeoutProposal(uint64 id) returns() +func (_Committer *CommitterTransactorSession) TimeoutProposal(id uint64) (*types.Transaction, error) { + return _Committer.Contract.TimeoutProposal(&_Committer.TransactOpts, id) +} + +// CommitterInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Committer contract. +type CommitterInitializedIterator struct { + Event *CommitterInitialized // 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 *CommitterInitializedIterator) 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(CommitterInitialized) + 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(CommitterInitialized) + 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 *CommitterInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterInitialized represents a Initialized event raised by the Committer contract. +type CommitterInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Committer *CommitterFilterer) FilterInitialized(opts *bind.FilterOpts) (*CommitterInitializedIterator, error) { + + logs, sub, err := _Committer.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &CommitterInitializedIterator{contract: _Committer.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Committer *CommitterFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *CommitterInitialized) (event.Subscription, error) { + + logs, sub, err := _Committer.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommitterInitialized) + if err := _Committer.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Committer *CommitterFilterer) ParseInitialized(log types.Log) (*CommitterInitialized, error) { + event := new(CommitterInitialized) + if err := _Committer.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommitterProposalSubmittedIterator is returned from FilterProposalSubmitted and is used to iterate over the raw logs and unpacked data for ProposalSubmitted events raised by the Committer contract. +type CommitterProposalSubmittedIterator struct { + Event *CommitterProposalSubmitted // 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 *CommitterProposalSubmittedIterator) 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(CommitterProposalSubmitted) + 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(CommitterProposalSubmitted) + 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 *CommitterProposalSubmittedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterProposalSubmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterProposalSubmitted represents a ProposalSubmitted event raised by the Committer contract. +type CommitterProposalSubmitted struct { + Id *big.Int + Proposer common.Address + ProofHash string + StateRootHash string + StartIndex *big.Int + EndIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProposalSubmitted is a free log retrieval operation binding the contract event 0x410eb7d56800677f6951f80f562e7d42ad630918b0ff4645be6a4bc29930ef8e. +// +// Solidity: event ProposalSubmitted(uint256 indexed id, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) +func (_Committer *CommitterFilterer) FilterProposalSubmitted(opts *bind.FilterOpts, id []*big.Int, proposer []common.Address, startIndex []*big.Int) (*CommitterProposalSubmittedIterator, error) { + + var idRule []interface{} + for _, idItem := range id { + idRule = append(idRule, idItem) + } + var proposerRule []interface{} + for _, proposerItem := range proposer { + proposerRule = append(proposerRule, proposerItem) + } + + var startIndexRule []interface{} + for _, startIndexItem := range startIndex { + startIndexRule = append(startIndexRule, startIndexItem) + } + + logs, sub, err := _Committer.contract.FilterLogs(opts, "ProposalSubmitted", idRule, proposerRule, startIndexRule) + if err != nil { + return nil, err + } + return &CommitterProposalSubmittedIterator{contract: _Committer.contract, event: "ProposalSubmitted", logs: logs, sub: sub}, nil +} + +// WatchProposalSubmitted is a free log subscription operation binding the contract event 0x410eb7d56800677f6951f80f562e7d42ad630918b0ff4645be6a4bc29930ef8e. +// +// Solidity: event ProposalSubmitted(uint256 indexed id, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) +func (_Committer *CommitterFilterer) WatchProposalSubmitted(opts *bind.WatchOpts, sink chan<- *CommitterProposalSubmitted, id []*big.Int, proposer []common.Address, startIndex []*big.Int) (event.Subscription, error) { + + var idRule []interface{} + for _, idItem := range id { + idRule = append(idRule, idItem) + } + var proposerRule []interface{} + for _, proposerItem := range proposer { + proposerRule = append(proposerRule, proposerItem) + } + + var startIndexRule []interface{} + for _, startIndexItem := range startIndex { + startIndexRule = append(startIndexRule, startIndexItem) + } + + logs, sub, err := _Committer.contract.WatchLogs(opts, "ProposalSubmitted", idRule, proposerRule, startIndexRule) + 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(CommitterProposalSubmitted) + if err := _Committer.contract.UnpackLog(event, "ProposalSubmitted", 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 +} + +// ParseProposalSubmitted is a log parse operation binding the contract event 0x410eb7d56800677f6951f80f562e7d42ad630918b0ff4645be6a4bc29930ef8e. +// +// Solidity: event ProposalSubmitted(uint256 indexed id, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) +func (_Committer *CommitterFilterer) ParseProposalSubmitted(log types.Log) (*CommitterProposalSubmitted, error) { + event := new(CommitterProposalSubmitted) + if err := _Committer.contract.UnpackLog(event, "ProposalSubmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommitterProposalTimedOutIterator is returned from FilterProposalTimedOut and is used to iterate over the raw logs and unpacked data for ProposalTimedOut events raised by the Committer contract. +type CommitterProposalTimedOutIterator struct { + Event *CommitterProposalTimedOut // 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 *CommitterProposalTimedOutIterator) 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(CommitterProposalTimedOut) + 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(CommitterProposalTimedOut) + 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 *CommitterProposalTimedOutIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterProposalTimedOutIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterProposalTimedOut represents a ProposalTimedOut event raised by the Committer contract. +type CommitterProposalTimedOut struct { + Id *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProposalTimedOut is a free log retrieval operation binding the contract event 0x54b873b562a45d8ac963d9576955e8cffecb769f75cb8ac8db3fc7534b972537. +// +// Solidity: event ProposalTimedOut(uint256 id) +func (_Committer *CommitterFilterer) FilterProposalTimedOut(opts *bind.FilterOpts) (*CommitterProposalTimedOutIterator, error) { + + logs, sub, err := _Committer.contract.FilterLogs(opts, "ProposalTimedOut") + if err != nil { + return nil, err + } + return &CommitterProposalTimedOutIterator{contract: _Committer.contract, event: "ProposalTimedOut", logs: logs, sub: sub}, nil +} + +// WatchProposalTimedOut is a free log subscription operation binding the contract event 0x54b873b562a45d8ac963d9576955e8cffecb769f75cb8ac8db3fc7534b972537. +// +// Solidity: event ProposalTimedOut(uint256 id) +func (_Committer *CommitterFilterer) WatchProposalTimedOut(opts *bind.WatchOpts, sink chan<- *CommitterProposalTimedOut) (event.Subscription, error) { + + logs, sub, err := _Committer.contract.WatchLogs(opts, "ProposalTimedOut") + 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(CommitterProposalTimedOut) + if err := _Committer.contract.UnpackLog(event, "ProposalTimedOut", 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 +} + +// ParseProposalTimedOut is a log parse operation binding the contract event 0x54b873b562a45d8ac963d9576955e8cffecb769f75cb8ac8db3fc7534b972537. +// +// Solidity: event ProposalTimedOut(uint256 id) +func (_Committer *CommitterFilterer) ParseProposalTimedOut(log types.Log) (*CommitterProposalTimedOut, error) { + event := new(CommitterProposalTimedOut) + if err := _Committer.contract.UnpackLog(event, "ProposalTimedOut", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommitterRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the Committer contract. +type CommitterRoleAdminChangedIterator struct { + Event *CommitterRoleAdminChanged // 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 *CommitterRoleAdminChangedIterator) 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(CommitterRoleAdminChanged) + 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(CommitterRoleAdminChanged) + 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 *CommitterRoleAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterRoleAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterRoleAdminChanged represents a RoleAdminChanged event raised by the Committer contract. +type CommitterRoleAdminChanged struct { + Role [32]byte + PreviousAdminRole [32]byte + NewAdminRole [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Committer *CommitterFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*CommitterRoleAdminChangedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Committer.contract.FilterLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return &CommitterRoleAdminChangedIterator{contract: _Committer.contract, event: "RoleAdminChanged", logs: logs, sub: sub}, nil +} + +// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Committer *CommitterFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *CommitterRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Committer.contract.WatchLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + 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(CommitterRoleAdminChanged) + if err := _Committer.contract.UnpackLog(event, "RoleAdminChanged", 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 +} + +// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Committer *CommitterFilterer) ParseRoleAdminChanged(log types.Log) (*CommitterRoleAdminChanged, error) { + event := new(CommitterRoleAdminChanged) + if err := _Committer.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommitterRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the Committer contract. +type CommitterRoleGrantedIterator struct { + Event *CommitterRoleGranted // 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 *CommitterRoleGrantedIterator) 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(CommitterRoleGranted) + 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(CommitterRoleGranted) + 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 *CommitterRoleGrantedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterRoleGrantedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterRoleGranted represents a RoleGranted event raised by the Committer contract. +type CommitterRoleGranted struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Committer *CommitterFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*CommitterRoleGrantedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Committer.contract.FilterLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &CommitterRoleGrantedIterator{contract: _Committer.contract, event: "RoleGranted", logs: logs, sub: sub}, nil +} + +// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Committer *CommitterFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *CommitterRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Committer.contract.WatchLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommitterRoleGranted) + if err := _Committer.contract.UnpackLog(event, "RoleGranted", 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 +} + +// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Committer *CommitterFilterer) ParseRoleGranted(log types.Log) (*CommitterRoleGranted, error) { + event := new(CommitterRoleGranted) + if err := _Committer.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommitterRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the Committer contract. +type CommitterRoleRevokedIterator struct { + Event *CommitterRoleRevoked // 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 *CommitterRoleRevokedIterator) 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(CommitterRoleRevoked) + 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(CommitterRoleRevoked) + 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 *CommitterRoleRevokedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterRoleRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterRoleRevoked represents a RoleRevoked event raised by the Committer contract. +type CommitterRoleRevoked struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Committer *CommitterFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*CommitterRoleRevokedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Committer.contract.FilterLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &CommitterRoleRevokedIterator{contract: _Committer.contract, event: "RoleRevoked", logs: logs, sub: sub}, nil +} + +// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Committer *CommitterFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *CommitterRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Committer.contract.WatchLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommitterRoleRevoked) + if err := _Committer.contract.UnpackLog(event, "RoleRevoked", 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 +} + +// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Committer *CommitterFilterer) ParseRoleRevoked(log types.Log) (*CommitterRoleRevoked, error) { + event := new(CommitterRoleRevoked) + if err := _Committer.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommitterVoteProposalIterator is returned from FilterVoteProposal and is used to iterate over the raw logs and unpacked data for VoteProposal events raised by the Committer contract. +type CommitterVoteProposalIterator struct { + Event *CommitterVoteProposal // 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 *CommitterVoteProposalIterator) 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(CommitterVoteProposal) + 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(CommitterVoteProposal) + 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 *CommitterVoteProposalIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommitterVoteProposalIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommitterVoteProposal represents a VoteProposal event raised by the Committer contract. +type CommitterVoteProposal struct { + Id *big.Int + Voter common.Address + Phase uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVoteProposal is a free log retrieval operation binding the contract event 0xb3af8d0ccb8c5065b2daf8bb24b7a0ac9a8822fac445978a1524fb9a6f560e1f. +// +// Solidity: event VoteProposal(uint256 id, address voter, uint8 phase) +func (_Committer *CommitterFilterer) FilterVoteProposal(opts *bind.FilterOpts) (*CommitterVoteProposalIterator, error) { + + logs, sub, err := _Committer.contract.FilterLogs(opts, "VoteProposal") + if err != nil { + return nil, err + } + return &CommitterVoteProposalIterator{contract: _Committer.contract, event: "VoteProposal", logs: logs, sub: sub}, nil +} + +// WatchVoteProposal is a free log subscription operation binding the contract event 0xb3af8d0ccb8c5065b2daf8bb24b7a0ac9a8822fac445978a1524fb9a6f560e1f. +// +// Solidity: event VoteProposal(uint256 id, address voter, uint8 phase) +func (_Committer *CommitterFilterer) WatchVoteProposal(opts *bind.WatchOpts, sink chan<- *CommitterVoteProposal) (event.Subscription, error) { + + logs, sub, err := _Committer.contract.WatchLogs(opts, "VoteProposal") + 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(CommitterVoteProposal) + if err := _Committer.contract.UnpackLog(event, "VoteProposal", 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 +} + +// ParseVoteProposal is a log parse operation binding the contract event 0xb3af8d0ccb8c5065b2daf8bb24b7a0ac9a8822fac445978a1524fb9a6f560e1f. +// +// Solidity: event VoteProposal(uint256 id, address voter, uint8 phase) +func (_Committer *CommitterFilterer) ParseVoteProposal(log types.Log) (*CommitterVoteProposal, error) { + event := new(CommitterVoteProposal) + if err := _Committer.contract.UnpackLog(event, "VoteProposal", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/internal/handler/zkEVM.go b/pkg/contract/zkEVM.go similarity index 99% rename from internal/handler/zkEVM.go rename to pkg/contract/zkEVM.go index d644010..ba644fb 100644 --- a/internal/handler/zkEVM.go +++ b/pkg/contract/zkEVM.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package handler +package contract import ( "errors" @@ -210,6 +210,7 @@ func (_ZkEVM *ZkEVMTransactorRaw) Transact(opts *bind.TransactOpts, method strin func (_ZkEVM *ZkEVMCaller) Admin(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "admin") + if err != nil { return *new(common.Address), err } @@ -217,6 +218,7 @@ func (_ZkEVM *ZkEVMCaller) Admin(opts *bind.CallOpts) (common.Address, error) { out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // Admin is a free data retrieval call binding the contract method 0xf851a440. @@ -239,6 +241,7 @@ func (_ZkEVM *ZkEVMCallerSession) Admin() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) BatchFee(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "batchFee") + if err != nil { return *new(*big.Int), err } @@ -246,6 +249,7 @@ func (_ZkEVM *ZkEVMCaller) BatchFee(opts *bind.CallOpts) (*big.Int, error) { out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err + } // BatchFee is a free data retrieval call binding the contract method 0xf8b823e4. @@ -268,6 +272,7 @@ func (_ZkEVM *ZkEVMCallerSession) BatchFee() (*big.Int, error) { func (_ZkEVM *ZkEVMCaller) BatchNumToStateRoot(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "batchNumToStateRoot", arg0) + if err != nil { return *new([32]byte), err } @@ -275,6 +280,7 @@ func (_ZkEVM *ZkEVMCaller) BatchNumToStateRoot(opts *bind.CallOpts, arg0 uint64) out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err + } // BatchNumToStateRoot is a free data retrieval call binding the contract method 0x5392c5e0. @@ -297,6 +303,7 @@ func (_ZkEVM *ZkEVMCallerSession) BatchNumToStateRoot(arg0 uint64) ([32]byte, er func (_ZkEVM *ZkEVMCaller) BridgeAddress(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "bridgeAddress") + if err != nil { return *new(common.Address), err } @@ -304,6 +311,7 @@ func (_ZkEVM *ZkEVMCaller) BridgeAddress(opts *bind.CallOpts) (common.Address, e out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. @@ -326,6 +334,7 @@ func (_ZkEVM *ZkEVMCallerSession) BridgeAddress() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) CalculateRewardPerBatch(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "calculateRewardPerBatch") + if err != nil { return *new(*big.Int), err } @@ -333,6 +342,7 @@ func (_ZkEVM *ZkEVMCaller) CalculateRewardPerBatch(opts *bind.CallOpts) (*big.In out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err + } // CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. @@ -355,6 +365,7 @@ func (_ZkEVM *ZkEVMCallerSession) CalculateRewardPerBatch() (*big.Int, error) { func (_ZkEVM *ZkEVMCaller) ChainID(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "chainID") + if err != nil { return *new(uint64), err } @@ -362,6 +373,7 @@ func (_ZkEVM *ZkEVMCaller) ChainID(opts *bind.CallOpts) (uint64, error) { out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // ChainID is a free data retrieval call binding the contract method 0xadc879e9. @@ -384,6 +396,7 @@ func (_ZkEVM *ZkEVMCallerSession) ChainID() (uint64, error) { func (_ZkEVM *ZkEVMCaller) CheckStateRootInsidePrime(opts *bind.CallOpts, newStateRoot *big.Int) (bool, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "checkStateRootInsidePrime", newStateRoot) + if err != nil { return *new(bool), err } @@ -391,6 +404,7 @@ func (_ZkEVM *ZkEVMCaller) CheckStateRootInsidePrime(opts *bind.CallOpts, newSta out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err + } // CheckStateRootInsidePrime is a free data retrieval call binding the contract method 0xba58ae39. @@ -413,6 +427,7 @@ func (_ZkEVM *ZkEVMCallerSession) CheckStateRootInsidePrime(newStateRoot *big.In func (_ZkEVM *ZkEVMCaller) ForceBatchTimeout(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "forceBatchTimeout") + if err != nil { return *new(uint64), err } @@ -420,6 +435,7 @@ func (_ZkEVM *ZkEVMCaller) ForceBatchTimeout(opts *bind.CallOpts) (uint64, error out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. @@ -442,6 +458,7 @@ func (_ZkEVM *ZkEVMCallerSession) ForceBatchTimeout() (uint64, error) { func (_ZkEVM *ZkEVMCaller) ForcedBatches(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "forcedBatches", arg0) + if err != nil { return *new([32]byte), err } @@ -449,6 +466,7 @@ func (_ZkEVM *ZkEVMCaller) ForcedBatches(opts *bind.CallOpts, arg0 uint64) ([32] out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err + } // ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. @@ -471,6 +489,7 @@ func (_ZkEVM *ZkEVMCallerSession) ForcedBatches(arg0 uint64) ([32]byte, error) { func (_ZkEVM *ZkEVMCaller) ForkID(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "forkID") + if err != nil { return *new(uint64), err } @@ -478,6 +497,7 @@ func (_ZkEVM *ZkEVMCaller) ForkID(opts *bind.CallOpts) (uint64, error) { out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // ForkID is a free data retrieval call binding the contract method 0x831c7ead. @@ -500,6 +520,7 @@ func (_ZkEVM *ZkEVMCallerSession) ForkID() (uint64, error) { func (_ZkEVM *ZkEVMCaller) GetForcedBatchFee(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "getForcedBatchFee") + if err != nil { return *new(*big.Int), err } @@ -507,6 +528,7 @@ func (_ZkEVM *ZkEVMCaller) GetForcedBatchFee(opts *bind.CallOpts) (*big.Int, err out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err + } // GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. @@ -529,6 +551,7 @@ func (_ZkEVM *ZkEVMCallerSession) GetForcedBatchFee() (*big.Int, error) { func (_ZkEVM *ZkEVMCaller) GetInputSnarkBytes(opts *bind.CallOpts, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "getInputSnarkBytes", initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) + if err != nil { return *new([]byte), err } @@ -536,6 +559,7 @@ func (_ZkEVM *ZkEVMCaller) GetInputSnarkBytes(opts *bind.CallOpts, initNumBatch out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) return out0, err + } // GetInputSnarkBytes is a free data retrieval call binding the contract method 0x220d7899. @@ -558,6 +582,7 @@ func (_ZkEVM *ZkEVMCallerSession) GetInputSnarkBytes(initNumBatch uint64, finalN func (_ZkEVM *ZkEVMCaller) GetLastVerifiedBatch(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "getLastVerifiedBatch") + if err != nil { return *new(uint64), err } @@ -565,6 +590,7 @@ func (_ZkEVM *ZkEVMCaller) GetLastVerifiedBatch(opts *bind.CallOpts) (uint64, er out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // GetLastVerifiedBatch is a free data retrieval call binding the contract method 0xc0ed84e0. @@ -587,6 +613,7 @@ func (_ZkEVM *ZkEVMCallerSession) GetLastVerifiedBatch() (uint64, error) { func (_ZkEVM *ZkEVMCaller) GlobalExitRootManager(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "globalExitRootManager") + if err != nil { return *new(common.Address), err } @@ -594,6 +621,7 @@ func (_ZkEVM *ZkEVMCaller) GlobalExitRootManager(opts *bind.CallOpts) (common.Ad out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. @@ -616,6 +644,7 @@ func (_ZkEVM *ZkEVMCallerSession) GlobalExitRootManager() (common.Address, error func (_ZkEVM *ZkEVMCaller) IsEmergencyState(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "isEmergencyState") + if err != nil { return *new(bool), err } @@ -623,6 +652,7 @@ func (_ZkEVM *ZkEVMCaller) IsEmergencyState(opts *bind.CallOpts) (bool, error) { out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err + } // IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. @@ -645,6 +675,7 @@ func (_ZkEVM *ZkEVMCallerSession) IsEmergencyState() (bool, error) { func (_ZkEVM *ZkEVMCaller) IsForcedBatchDisallowed(opts *bind.CallOpts) (bool, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "isForcedBatchDisallowed") + if err != nil { return *new(bool), err } @@ -652,6 +683,7 @@ func (_ZkEVM *ZkEVMCaller) IsForcedBatchDisallowed(opts *bind.CallOpts) (bool, e out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err + } // IsForcedBatchDisallowed is a free data retrieval call binding the contract method 0xed6b0104. @@ -674,6 +706,7 @@ func (_ZkEVM *ZkEVMCallerSession) IsForcedBatchDisallowed() (bool, error) { func (_ZkEVM *ZkEVMCaller) IsPendingStateConsolidable(opts *bind.CallOpts, pendingStateNum uint64) (bool, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "isPendingStateConsolidable", pendingStateNum) + if err != nil { return *new(bool), err } @@ -681,6 +714,7 @@ func (_ZkEVM *ZkEVMCaller) IsPendingStateConsolidable(opts *bind.CallOpts, pendi out0 := *abi.ConvertType(out[0], new(bool)).(*bool) return out0, err + } // IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x383b3be8. @@ -703,6 +737,7 @@ func (_ZkEVM *ZkEVMCallerSession) IsPendingStateConsolidable(pendingStateNum uin func (_ZkEVM *ZkEVMCaller) LastBatchSequenced(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastBatchSequenced") + if err != nil { return *new(uint64), err } @@ -710,6 +745,7 @@ func (_ZkEVM *ZkEVMCaller) LastBatchSequenced(opts *bind.CallOpts) (uint64, erro out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastBatchSequenced is a free data retrieval call binding the contract method 0x423fa856. @@ -732,6 +768,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastBatchSequenced() (uint64, error) { func (_ZkEVM *ZkEVMCaller) LastForceBatch(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastForceBatch") + if err != nil { return *new(uint64), err } @@ -739,6 +776,7 @@ func (_ZkEVM *ZkEVMCaller) LastForceBatch(opts *bind.CallOpts) (uint64, error) { out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. @@ -761,6 +799,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastForceBatch() (uint64, error) { func (_ZkEVM *ZkEVMCaller) LastForceBatchSequenced(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastForceBatchSequenced") + if err != nil { return *new(uint64), err } @@ -768,6 +807,7 @@ func (_ZkEVM *ZkEVMCaller) LastForceBatchSequenced(opts *bind.CallOpts) (uint64, out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. @@ -790,6 +830,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastForceBatchSequenced() (uint64, error) { func (_ZkEVM *ZkEVMCaller) LastPendingState(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastPendingState") + if err != nil { return *new(uint64), err } @@ -797,6 +838,7 @@ func (_ZkEVM *ZkEVMCaller) LastPendingState(opts *bind.CallOpts) (uint64, error) out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastPendingState is a free data retrieval call binding the contract method 0x458c0477. @@ -819,6 +861,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastPendingState() (uint64, error) { func (_ZkEVM *ZkEVMCaller) LastPendingStateConsolidated(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastPendingStateConsolidated") + if err != nil { return *new(uint64), err } @@ -826,6 +869,7 @@ func (_ZkEVM *ZkEVMCaller) LastPendingStateConsolidated(opts *bind.CallOpts) (ui out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastPendingStateConsolidated is a free data retrieval call binding the contract method 0x4a1a89a7. @@ -848,6 +892,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastPendingStateConsolidated() (uint64, error) func (_ZkEVM *ZkEVMCaller) LastTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastTimestamp") + if err != nil { return *new(uint64), err } @@ -855,6 +900,7 @@ func (_ZkEVM *ZkEVMCaller) LastTimestamp(opts *bind.CallOpts) (uint64, error) { out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastTimestamp is a free data retrieval call binding the contract method 0x19d8ac61. @@ -877,6 +923,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastTimestamp() (uint64, error) { func (_ZkEVM *ZkEVMCaller) LastVerifiedBatch(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "lastVerifiedBatch") + if err != nil { return *new(uint64), err } @@ -884,6 +931,7 @@ func (_ZkEVM *ZkEVMCaller) LastVerifiedBatch(opts *bind.CallOpts) (uint64, error out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // LastVerifiedBatch is a free data retrieval call binding the contract method 0x7fcb3653. @@ -906,6 +954,7 @@ func (_ZkEVM *ZkEVMCallerSession) LastVerifiedBatch() (uint64, error) { func (_ZkEVM *ZkEVMCaller) Matic(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "matic") + if err != nil { return *new(common.Address), err } @@ -913,6 +962,7 @@ func (_ZkEVM *ZkEVMCaller) Matic(opts *bind.CallOpts) (common.Address, error) { out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // Matic is a free data retrieval call binding the contract method 0xb6b0b097. @@ -935,6 +985,7 @@ func (_ZkEVM *ZkEVMCallerSession) Matic() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) MultiplierBatchFee(opts *bind.CallOpts) (uint16, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "multiplierBatchFee") + if err != nil { return *new(uint16), err } @@ -942,6 +993,7 @@ func (_ZkEVM *ZkEVMCaller) MultiplierBatchFee(opts *bind.CallOpts) (uint16, erro out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) return out0, err + } // MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. @@ -964,6 +1016,7 @@ func (_ZkEVM *ZkEVMCallerSession) MultiplierBatchFee() (uint16, error) { func (_ZkEVM *ZkEVMCaller) NetworkName(opts *bind.CallOpts) (string, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "networkName") + if err != nil { return *new(string), err } @@ -971,6 +1024,7 @@ func (_ZkEVM *ZkEVMCaller) NetworkName(opts *bind.CallOpts) (string, error) { out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err + } // NetworkName is a free data retrieval call binding the contract method 0x107bf28c. @@ -993,6 +1047,7 @@ func (_ZkEVM *ZkEVMCallerSession) NetworkName() (string, error) { func (_ZkEVM *ZkEVMCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "owner") + if err != nil { return *new(common.Address), err } @@ -1000,6 +1055,7 @@ func (_ZkEVM *ZkEVMCaller) Owner(opts *bind.CallOpts) (common.Address, error) { out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. @@ -1022,6 +1078,7 @@ func (_ZkEVM *ZkEVMCallerSession) Owner() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) PendingAdmin(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "pendingAdmin") + if err != nil { return *new(common.Address), err } @@ -1029,6 +1086,7 @@ func (_ZkEVM *ZkEVMCaller) PendingAdmin(opts *bind.CallOpts) (common.Address, er out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // PendingAdmin is a free data retrieval call binding the contract method 0x26782247. @@ -1051,6 +1109,7 @@ func (_ZkEVM *ZkEVMCallerSession) PendingAdmin() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) PendingStateTimeout(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "pendingStateTimeout") + if err != nil { return *new(uint64), err } @@ -1058,6 +1117,7 @@ func (_ZkEVM *ZkEVMCaller) PendingStateTimeout(opts *bind.CallOpts) (uint64, err out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. @@ -1082,8 +1142,7 @@ func (_ZkEVM *ZkEVMCaller) PendingStateTransitions(opts *bind.CallOpts, arg0 *bi LastVerifiedBatch uint64 ExitRoot [32]byte StateRoot [32]byte -}, error, -) { +}, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "pendingStateTransitions", arg0) @@ -1103,6 +1162,7 @@ func (_ZkEVM *ZkEVMCaller) PendingStateTransitions(opts *bind.CallOpts, arg0 *bi outstruct.StateRoot = *abi.ConvertType(out[3], new([32]byte)).(*[32]byte) return *outstruct, err + } // PendingStateTransitions is a free data retrieval call binding the contract method 0x837a4738. @@ -1113,8 +1173,7 @@ func (_ZkEVM *ZkEVMSession) PendingStateTransitions(arg0 *big.Int) (struct { LastVerifiedBatch uint64 ExitRoot [32]byte StateRoot [32]byte -}, error, -) { +}, error) { return _ZkEVM.Contract.PendingStateTransitions(&_ZkEVM.CallOpts, arg0) } @@ -1126,8 +1185,7 @@ func (_ZkEVM *ZkEVMCallerSession) PendingStateTransitions(arg0 *big.Int) (struct LastVerifiedBatch uint64 ExitRoot [32]byte StateRoot [32]byte -}, error, -) { +}, error) { return _ZkEVM.Contract.PendingStateTransitions(&_ZkEVM.CallOpts, arg0) } @@ -1137,6 +1195,7 @@ func (_ZkEVM *ZkEVMCallerSession) PendingStateTransitions(arg0 *big.Int) (struct func (_ZkEVM *ZkEVMCaller) RollupVerifier(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "rollupVerifier") + if err != nil { return *new(common.Address), err } @@ -1144,6 +1203,7 @@ func (_ZkEVM *ZkEVMCaller) RollupVerifier(opts *bind.CallOpts) (common.Address, out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // RollupVerifier is a free data retrieval call binding the contract method 0xe8bf92ed. @@ -1167,8 +1227,7 @@ func (_ZkEVM *ZkEVMCaller) SequencedBatches(opts *bind.CallOpts, arg0 uint64) (s AccInputHash [32]byte SequencedTimestamp uint64 PreviousLastBatchSequenced uint64 -}, error, -) { +}, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "sequencedBatches", arg0) @@ -1186,6 +1245,7 @@ func (_ZkEVM *ZkEVMCaller) SequencedBatches(opts *bind.CallOpts, arg0 uint64) (s outstruct.PreviousLastBatchSequenced = *abi.ConvertType(out[2], new(uint64)).(*uint64) return *outstruct, err + } // SequencedBatches is a free data retrieval call binding the contract method 0xb4d63f58. @@ -1195,8 +1255,7 @@ func (_ZkEVM *ZkEVMSession) SequencedBatches(arg0 uint64) (struct { AccInputHash [32]byte SequencedTimestamp uint64 PreviousLastBatchSequenced uint64 -}, error, -) { +}, error) { return _ZkEVM.Contract.SequencedBatches(&_ZkEVM.CallOpts, arg0) } @@ -1207,8 +1266,7 @@ func (_ZkEVM *ZkEVMCallerSession) SequencedBatches(arg0 uint64) (struct { AccInputHash [32]byte SequencedTimestamp uint64 PreviousLastBatchSequenced uint64 -}, error, -) { +}, error) { return _ZkEVM.Contract.SequencedBatches(&_ZkEVM.CallOpts, arg0) } @@ -1218,6 +1276,7 @@ func (_ZkEVM *ZkEVMCallerSession) SequencedBatches(arg0 uint64) (struct { func (_ZkEVM *ZkEVMCaller) TrustedAggregator(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "trustedAggregator") + if err != nil { return *new(common.Address), err } @@ -1225,6 +1284,7 @@ func (_ZkEVM *ZkEVMCaller) TrustedAggregator(opts *bind.CallOpts) (common.Addres out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // TrustedAggregator is a free data retrieval call binding the contract method 0x29878983. @@ -1247,6 +1307,7 @@ func (_ZkEVM *ZkEVMCallerSession) TrustedAggregator() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) TrustedAggregatorTimeout(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "trustedAggregatorTimeout") + if err != nil { return *new(uint64), err } @@ -1254,6 +1315,7 @@ func (_ZkEVM *ZkEVMCaller) TrustedAggregatorTimeout(opts *bind.CallOpts) (uint64 out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. @@ -1276,6 +1338,7 @@ func (_ZkEVM *ZkEVMCallerSession) TrustedAggregatorTimeout() (uint64, error) { func (_ZkEVM *ZkEVMCaller) TrustedSequencer(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "trustedSequencer") + if err != nil { return *new(common.Address), err } @@ -1283,6 +1346,7 @@ func (_ZkEVM *ZkEVMCaller) TrustedSequencer(opts *bind.CallOpts) (common.Address out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) return out0, err + } // TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. @@ -1305,6 +1369,7 @@ func (_ZkEVM *ZkEVMCallerSession) TrustedSequencer() (common.Address, error) { func (_ZkEVM *ZkEVMCaller) TrustedSequencerURL(opts *bind.CallOpts) (string, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "trustedSequencerURL") + if err != nil { return *new(string), err } @@ -1312,6 +1377,7 @@ func (_ZkEVM *ZkEVMCaller) TrustedSequencerURL(opts *bind.CallOpts) (string, err out0 := *abi.ConvertType(out[0], new(string)).(*string) return out0, err + } // TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. @@ -1334,6 +1400,7 @@ func (_ZkEVM *ZkEVMCallerSession) TrustedSequencerURL() (string, error) { func (_ZkEVM *ZkEVMCaller) VerifyBatchTimeTarget(opts *bind.CallOpts) (uint64, error) { var out []interface{} err := _ZkEVM.contract.Call(opts, &out, "verifyBatchTimeTarget") + if err != nil { return *new(uint64), err } @@ -1341,6 +1408,7 @@ func (_ZkEVM *ZkEVMCaller) VerifyBatchTimeTarget(opts *bind.CallOpts) (uint64, e out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err + } // VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. @@ -1938,6 +2006,7 @@ type ZkEVMAcceptAdminRole struct { // // Solidity: event AcceptAdminRole(address newAdmin) func (_ZkEVM *ZkEVMFilterer) FilterAcceptAdminRole(opts *bind.FilterOpts) (*ZkEVMAcceptAdminRoleIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "AcceptAdminRole") if err != nil { return nil, err @@ -1949,6 +2018,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterAcceptAdminRole(opts *bind.FilterOpts) (*ZkEV // // Solidity: event AcceptAdminRole(address newAdmin) func (_ZkEVM *ZkEVMFilterer) WatchAcceptAdminRole(opts *bind.WatchOpts, sink chan<- *ZkEVMAcceptAdminRole) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "AcceptAdminRole") if err != nil { return nil, err @@ -2069,6 +2139,7 @@ type ZkEVMActivateForceBatches struct { // // Solidity: event ActivateForceBatches() func (_ZkEVM *ZkEVMFilterer) FilterActivateForceBatches(opts *bind.FilterOpts) (*ZkEVMActivateForceBatchesIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "ActivateForceBatches") if err != nil { return nil, err @@ -2080,6 +2151,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterActivateForceBatches(opts *bind.FilterOpts) ( // // Solidity: event ActivateForceBatches() func (_ZkEVM *ZkEVMFilterer) WatchActivateForceBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMActivateForceBatches) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "ActivateForceBatches") if err != nil { return nil, err @@ -2203,6 +2275,7 @@ type ZkEVMConsolidatePendingState struct { // // Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) func (_ZkEVM *ZkEVMFilterer) FilterConsolidatePendingState(opts *bind.FilterOpts, numBatch []uint64, pendingStateNum []uint64) (*ZkEVMConsolidatePendingStateIterator, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -2224,6 +2297,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterConsolidatePendingState(opts *bind.FilterOpts // // Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) func (_ZkEVM *ZkEVMFilterer) WatchConsolidatePendingState(opts *bind.WatchOpts, sink chan<- *ZkEVMConsolidatePendingState, numBatch []uint64, pendingStateNum []uint64) (event.Subscription, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -2354,6 +2428,7 @@ type ZkEVMEmergencyStateActivated struct { // // Solidity: event EmergencyStateActivated() func (_ZkEVM *ZkEVMFilterer) FilterEmergencyStateActivated(opts *bind.FilterOpts) (*ZkEVMEmergencyStateActivatedIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "EmergencyStateActivated") if err != nil { return nil, err @@ -2365,6 +2440,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterEmergencyStateActivated(opts *bind.FilterOpts // // Solidity: event EmergencyStateActivated() func (_ZkEVM *ZkEVMFilterer) WatchEmergencyStateActivated(opts *bind.WatchOpts, sink chan<- *ZkEVMEmergencyStateActivated) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "EmergencyStateActivated") if err != nil { return nil, err @@ -2485,6 +2561,7 @@ type ZkEVMEmergencyStateDeactivated struct { // // Solidity: event EmergencyStateDeactivated() func (_ZkEVM *ZkEVMFilterer) FilterEmergencyStateDeactivated(opts *bind.FilterOpts) (*ZkEVMEmergencyStateDeactivatedIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "EmergencyStateDeactivated") if err != nil { return nil, err @@ -2496,6 +2573,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterEmergencyStateDeactivated(opts *bind.FilterOp // // Solidity: event EmergencyStateDeactivated() func (_ZkEVM *ZkEVMFilterer) WatchEmergencyStateDeactivated(opts *bind.WatchOpts, sink chan<- *ZkEVMEmergencyStateDeactivated) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "EmergencyStateDeactivated") if err != nil { return nil, err @@ -2620,6 +2698,7 @@ type ZkEVMForceBatch struct { // // Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) func (_ZkEVM *ZkEVMFilterer) FilterForceBatch(opts *bind.FilterOpts, forceBatchNum []uint64) (*ZkEVMForceBatchIterator, error) { + var forceBatchNumRule []interface{} for _, forceBatchNumItem := range forceBatchNum { forceBatchNumRule = append(forceBatchNumRule, forceBatchNumItem) @@ -2636,6 +2715,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterForceBatch(opts *bind.FilterOpts, forceBatchN // // Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) func (_ZkEVM *ZkEVMFilterer) WatchForceBatch(opts *bind.WatchOpts, sink chan<- *ZkEVMForceBatch, forceBatchNum []uint64) (event.Subscription, error) { + var forceBatchNumRule []interface{} for _, forceBatchNumItem := range forceBatchNum { forceBatchNumRule = append(forceBatchNumRule, forceBatchNumItem) @@ -2762,6 +2842,7 @@ type ZkEVMInitialized struct { // // Solidity: event Initialized(uint8 version) func (_ZkEVM *ZkEVMFilterer) FilterInitialized(opts *bind.FilterOpts) (*ZkEVMInitializedIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "Initialized") if err != nil { return nil, err @@ -2773,6 +2854,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterInitialized(opts *bind.FilterOpts) (*ZkEVMIni // // Solidity: event Initialized(uint8 version) func (_ZkEVM *ZkEVMFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ZkEVMInitialized) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "Initialized") if err != nil { return nil, err @@ -2896,6 +2978,7 @@ type ZkEVMOverridePendingState struct { // // Solidity: event OverridePendingState(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) func (_ZkEVM *ZkEVMFilterer) FilterOverridePendingState(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*ZkEVMOverridePendingStateIterator, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -2917,6 +3000,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterOverridePendingState(opts *bind.FilterOpts, n // // Solidity: event OverridePendingState(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) func (_ZkEVM *ZkEVMFilterer) WatchOverridePendingState(opts *bind.WatchOpts, sink chan<- *ZkEVMOverridePendingState, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -3049,6 +3133,7 @@ type ZkEVMOwnershipTransferred struct { // // Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) func (_ZkEVM *ZkEVMFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ZkEVMOwnershipTransferredIterator, error) { + var previousOwnerRule []interface{} for _, previousOwnerItem := range previousOwner { previousOwnerRule = append(previousOwnerRule, previousOwnerItem) @@ -3069,6 +3154,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, p // // Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) func (_ZkEVM *ZkEVMFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ZkEVMOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + var previousOwnerRule []interface{} for _, previousOwnerItem := range previousOwner { previousOwnerRule = append(previousOwnerRule, previousOwnerItem) @@ -3200,6 +3286,7 @@ type ZkEVMProveNonDeterministicPendingState struct { // // Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) func (_ZkEVM *ZkEVMFilterer) FilterProveNonDeterministicPendingState(opts *bind.FilterOpts) (*ZkEVMProveNonDeterministicPendingStateIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "ProveNonDeterministicPendingState") if err != nil { return nil, err @@ -3211,6 +3298,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterProveNonDeterministicPendingState(opts *bind. // // Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) func (_ZkEVM *ZkEVMFilterer) WatchProveNonDeterministicPendingState(opts *bind.WatchOpts, sink chan<- *ZkEVMProveNonDeterministicPendingState) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "ProveNonDeterministicPendingState") if err != nil { return nil, err @@ -3332,6 +3420,7 @@ type ZkEVMSequenceBatches struct { // // Solidity: event SequenceBatches(uint64 indexed numBatch) func (_ZkEVM *ZkEVMFilterer) FilterSequenceBatches(opts *bind.FilterOpts, numBatch []uint64) (*ZkEVMSequenceBatchesIterator, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -3348,6 +3437,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSequenceBatches(opts *bind.FilterOpts, numBat // // Solidity: event SequenceBatches(uint64 indexed numBatch) func (_ZkEVM *ZkEVMFilterer) WatchSequenceBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMSequenceBatches, numBatch []uint64) (event.Subscription, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -3474,6 +3564,7 @@ type ZkEVMSequenceForceBatches struct { // // Solidity: event SequenceForceBatches(uint64 indexed numBatch) func (_ZkEVM *ZkEVMFilterer) FilterSequenceForceBatches(opts *bind.FilterOpts, numBatch []uint64) (*ZkEVMSequenceForceBatchesIterator, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -3490,6 +3581,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSequenceForceBatches(opts *bind.FilterOpts, n // // Solidity: event SequenceForceBatches(uint64 indexed numBatch) func (_ZkEVM *ZkEVMFilterer) WatchSequenceForceBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMSequenceForceBatches, numBatch []uint64) (event.Subscription, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -3616,6 +3708,7 @@ type ZkEVMSetForceBatchTimeout struct { // // Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) func (_ZkEVM *ZkEVMFilterer) FilterSetForceBatchTimeout(opts *bind.FilterOpts) (*ZkEVMSetForceBatchTimeoutIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetForceBatchTimeout") if err != nil { return nil, err @@ -3627,6 +3720,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetForceBatchTimeout(opts *bind.FilterOpts) ( // // Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) func (_ZkEVM *ZkEVMFilterer) WatchSetForceBatchTimeout(opts *bind.WatchOpts, sink chan<- *ZkEVMSetForceBatchTimeout) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetForceBatchTimeout") if err != nil { return nil, err @@ -3748,6 +3842,7 @@ type ZkEVMSetMultiplierBatchFee struct { // // Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) func (_ZkEVM *ZkEVMFilterer) FilterSetMultiplierBatchFee(opts *bind.FilterOpts) (*ZkEVMSetMultiplierBatchFeeIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetMultiplierBatchFee") if err != nil { return nil, err @@ -3759,6 +3854,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetMultiplierBatchFee(opts *bind.FilterOpts) // // Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) func (_ZkEVM *ZkEVMFilterer) WatchSetMultiplierBatchFee(opts *bind.WatchOpts, sink chan<- *ZkEVMSetMultiplierBatchFee) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetMultiplierBatchFee") if err != nil { return nil, err @@ -3880,6 +3976,7 @@ type ZkEVMSetPendingStateTimeout struct { // // Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) func (_ZkEVM *ZkEVMFilterer) FilterSetPendingStateTimeout(opts *bind.FilterOpts) (*ZkEVMSetPendingStateTimeoutIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetPendingStateTimeout") if err != nil { return nil, err @@ -3891,6 +3988,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetPendingStateTimeout(opts *bind.FilterOpts) // // Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) func (_ZkEVM *ZkEVMFilterer) WatchSetPendingStateTimeout(opts *bind.WatchOpts, sink chan<- *ZkEVMSetPendingStateTimeout) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetPendingStateTimeout") if err != nil { return nil, err @@ -4012,6 +4110,7 @@ type ZkEVMSetTrustedAggregator struct { // // Solidity: event SetTrustedAggregator(address newTrustedAggregator) func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedAggregator(opts *bind.FilterOpts) (*ZkEVMSetTrustedAggregatorIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedAggregator") if err != nil { return nil, err @@ -4023,6 +4122,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedAggregator(opts *bind.FilterOpts) ( // // Solidity: event SetTrustedAggregator(address newTrustedAggregator) func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedAggregator(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedAggregator) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedAggregator") if err != nil { return nil, err @@ -4144,6 +4244,7 @@ type ZkEVMSetTrustedAggregatorTimeout struct { // // Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedAggregatorTimeout(opts *bind.FilterOpts) (*ZkEVMSetTrustedAggregatorTimeoutIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedAggregatorTimeout") if err != nil { return nil, err @@ -4155,6 +4256,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedAggregatorTimeout(opts *bind.Filter // // Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedAggregatorTimeout(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedAggregatorTimeout) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedAggregatorTimeout") if err != nil { return nil, err @@ -4276,6 +4378,7 @@ type ZkEVMSetTrustedSequencer struct { // // Solidity: event SetTrustedSequencer(address newTrustedSequencer) func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedSequencer(opts *bind.FilterOpts) (*ZkEVMSetTrustedSequencerIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedSequencer") if err != nil { return nil, err @@ -4287,6 +4390,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedSequencer(opts *bind.FilterOpts) (* // // Solidity: event SetTrustedSequencer(address newTrustedSequencer) func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedSequencer(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedSequencer) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedSequencer") if err != nil { return nil, err @@ -4408,6 +4512,7 @@ type ZkEVMSetTrustedSequencerURL struct { // // Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedSequencerURL(opts *bind.FilterOpts) (*ZkEVMSetTrustedSequencerURLIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedSequencerURL") if err != nil { return nil, err @@ -4419,6 +4524,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedSequencerURL(opts *bind.FilterOpts) // // Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedSequencerURL(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedSequencerURL) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedSequencerURL") if err != nil { return nil, err @@ -4540,6 +4646,7 @@ type ZkEVMSetVerifyBatchTimeTarget struct { // // Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) func (_ZkEVM *ZkEVMFilterer) FilterSetVerifyBatchTimeTarget(opts *bind.FilterOpts) (*ZkEVMSetVerifyBatchTimeTargetIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetVerifyBatchTimeTarget") if err != nil { return nil, err @@ -4551,6 +4658,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterSetVerifyBatchTimeTarget(opts *bind.FilterOpt // // Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) func (_ZkEVM *ZkEVMFilterer) WatchSetVerifyBatchTimeTarget(opts *bind.WatchOpts, sink chan<- *ZkEVMSetVerifyBatchTimeTarget) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetVerifyBatchTimeTarget") if err != nil { return nil, err @@ -4672,6 +4780,7 @@ type ZkEVMTransferAdminRole struct { // // Solidity: event TransferAdminRole(address newPendingAdmin) func (_ZkEVM *ZkEVMFilterer) FilterTransferAdminRole(opts *bind.FilterOpts) (*ZkEVMTransferAdminRoleIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "TransferAdminRole") if err != nil { return nil, err @@ -4683,6 +4792,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterTransferAdminRole(opts *bind.FilterOpts) (*Zk // // Solidity: event TransferAdminRole(address newPendingAdmin) func (_ZkEVM *ZkEVMFilterer) WatchTransferAdminRole(opts *bind.WatchOpts, sink chan<- *ZkEVMTransferAdminRole) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "TransferAdminRole") if err != nil { return nil, err @@ -4806,6 +4916,7 @@ type ZkEVMUpdateZkEVMVersion struct { // // Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) func (_ZkEVM *ZkEVMFilterer) FilterUpdateZkEVMVersion(opts *bind.FilterOpts) (*ZkEVMUpdateZkEVMVersionIterator, error) { + logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "UpdateZkEVMVersion") if err != nil { return nil, err @@ -4817,6 +4928,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterUpdateZkEVMVersion(opts *bind.FilterOpts) (*Z // // Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) func (_ZkEVM *ZkEVMFilterer) WatchUpdateZkEVMVersion(opts *bind.WatchOpts, sink chan<- *ZkEVMUpdateZkEVMVersion) (event.Subscription, error) { + logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "UpdateZkEVMVersion") if err != nil { return nil, err @@ -4940,6 +5052,7 @@ type ZkEVMVerifyBatches struct { // // Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) func (_ZkEVM *ZkEVMFilterer) FilterVerifyBatches(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*ZkEVMVerifyBatchesIterator, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -4961,6 +5074,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterVerifyBatches(opts *bind.FilterOpts, numBatch // // Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) func (_ZkEVM *ZkEVMFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMVerifyBatches, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -5094,6 +5208,7 @@ type ZkEVMVerifyBatchesTrustedAggregator struct { // // Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) func (_ZkEVM *ZkEVMFilterer) FilterVerifyBatchesTrustedAggregator(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*ZkEVMVerifyBatchesTrustedAggregatorIterator, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) @@ -5115,6 +5230,7 @@ func (_ZkEVM *ZkEVMFilterer) FilterVerifyBatchesTrustedAggregator(opts *bind.Fil // // Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) func (_ZkEVM *ZkEVMFilterer) WatchVerifyBatchesTrustedAggregator(opts *bind.WatchOpts, sink chan<- *ZkEVMVerifyBatchesTrustedAggregator, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { + var numBatchRule []interface{} for _, numBatchItem := range numBatch { numBatchRule = append(numBatchRule, numBatchItem) diff --git a/pkg/event/zkevm/sequenceBatches.go b/pkg/event/zkevm/sequenceBatches.go new file mode 100644 index 0000000..af6e306 --- /dev/null +++ b/pkg/event/zkevm/sequenceBatches.go @@ -0,0 +1,46 @@ +package zkevm + +import ( + "encoding/json" + "github.com/b2network/b2committer/pkg/event" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +var ( + SequenceBatchesName = "sequenceBatches" + + SequenceBatchesNameHash = crypto.Keccak256([]byte("SequenceBatches(uint64)")) +) + +type SequenceBatches struct { + BatchNum uint64 `json:"numBatch"` +} + +func (*SequenceBatches) Name() string { + return SequenceBatchesName +} + +func (*SequenceBatches) EventHash() common.Hash { + return common.BytesToHash(SequenceBatchesNameHash) +} + +func (t *SequenceBatches) ToObj(data string) error { + err := json.Unmarshal([]byte(data), &t) + if err != nil { + return err + } + return nil +} + +func (*SequenceBatches) Data(log types.Log) (string, error) { + transfer := &SequenceBatches{ + BatchNum: uint64(event.TopicToInt64(log, 1)), + } + data, err := event.ToJSON(transfer) + if err != nil { + return "", err + } + return data, nil +} From 3015ad9d46d0b2a5f7941fb0ec3ba2ac2e399e8e Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:21:03 +0800 Subject: [PATCH 02/29] change nodeclient --- abi/Committer.json | 1670 +++++++++++++++++------------- docs/sql/listener.sql | 2 - internal/handler/checkstatus.go | 25 +- internal/handler/handler.go | 8 +- internal/handler/syncProposal.go | 44 +- internal/schema/proposal.go | 1 - internal/types/config.go | 12 +- pkg/b2node/b2node.go | 10 + pkg/b2node/b2node_test.go | 6 +- pkg/contract/committer.go | 33 +- 10 files changed, 1057 insertions(+), 754 deletions(-) diff --git a/abi/Committer.json b/abi/Committer.json index 182da31..68fe329 100644 --- a/abi/Committer.json +++ b/abi/Committer.json @@ -1,702 +1,968 @@ -[{ - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" -}, { - "inputs": [{ - "internalType": "address", - "name": "account", - "type": "address" - }, { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - }], - "name": "AccessControlUnauthorizedAccount", - "type": "error" -}, { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" -}, { - "inputs": [], - "name": "NotInitializing", - "type": "error" -}, { - "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - }], - "name": "Initialized", - "type": "event" -}, { - "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, { - "indexed": true, - "internalType": "address", - "name": "proposer", - "type": "address" - }, { - "indexed": false, - "internalType": "string", - "name": "proofHash", - "type": "string" - }, { - "indexed": false, - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, { - "indexed": true, - "internalType": "uint256", - "name": "startIndex", - "type": "uint256" - }, { - "indexed": false, - "internalType": "uint256", - "name": "endIndex", - "type": "uint256" - }], - "name": "ProposalSubmitted", - "type": "event" -}, { - "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }], - "name": "ProposalTimedOut", - "type": "event" -}, { - "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - }], - "name": "RoleAdminChanged", - "type": "event" -}, { - "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }], - "name": "RoleGranted", - "type": "event" -}, { - "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }], - "name": "RoleRevoked", - "type": "event" -}, { - "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, { - "indexed": false, - "internalType": "address", - "name": "voter", - "type": "address" - }, { - "indexed": false, - "internalType": "uint8", - "name": "phase", - "type": "uint8" - }], - "name": "VoteProposal", - "type": "event" -}, { - "inputs": [], - "name": "ADMIN_ROLE", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "address", - "name": "proposer", - "type": "address" - }], - "name": "addProposer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }], - "name": "allCommitPhaseVotes", - "outputs": [{ - "internalType": "address[]", - "name": "", - "type": "address[]" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [], - "name": "allProposers", - "outputs": [{ - "internalType": "address[]", - "name": "", - "type": "address[]" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }], - "name": "allTimeoutPhaseVotes", - "outputs": [{ - "internalType": "address[]", - "name": "", - "type": "address[]" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "string", - "name": "txHash", - "type": "string" - }], - "name": "bitcoinTx", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }, { - "internalType": "uint256", - "name": "", - "type": "uint256" - }], - "name": "commitPhaseVotes", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [], - "name": "getLastProposal", - "outputs": [{ - "components": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, { - "internalType": "address", - "name": "winner", - "type": "address" - }, { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, { - "internalType": "string", - "name": "txHash", - "type": "string" - }], - "internalType": "struct Committer.Proposal", - "name": "", - "type": "tuple" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }], - "name": "getRoleAdmin", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "internalType": "address", - "name": "account", - "type": "address" - }], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "internalType": "address", - "name": "account", - "type": "address" - }], - "name": "hasRole", - "outputs": [{ - "internalType": "bool", - "name": "", - "type": "bool" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "address", - "name": "sender", - "type": "address" - }], - "name": "isProposer", - "outputs": [{ - "internalType": "bool", - "name": "", - "type": "bool" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "address", - "name": "voter", - "type": "address" - }], - "name": "isVotedOnCommitPhase", - "outputs": [{ - "internalType": "bool", - "name": "", - "type": "bool" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "address", - "name": "voter", - "type": "address" - }], - "name": "isVotedOnTimeoutPhase", - "outputs": [{ - "internalType": "bool", - "name": "", - "type": "bool" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [], - "name": "lastProposal", - "outputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, { - "internalType": "address", - "name": "winner", - "type": "address" - }, { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, { - "internalType": "string", - "name": "txHash", - "type": "string" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }], - "name": "proposal", - "outputs": [{ - "components": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, { - "internalType": "address", - "name": "winner", - "type": "address" - }, { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, { - "internalType": "string", - "name": "txHash", - "type": "string" - }], - "internalType": "struct Committer.Proposal", - "name": "", - "type": "tuple" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }], - "name": "proposals", - "outputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, { - "internalType": "address", - "name": "winner", - "type": "address" - }, { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, { - "internalType": "string", - "name": "txHash", - "type": "string" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], - "name": "proposers", - "outputs": [{ - "internalType": "bool", - "name": "", - "type": "bool" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint256", - "name": "", - "type": "uint256" - }], - "name": "proposersList", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "address", - "name": "proposer", - "type": "address" - }], - "name": "removeProposer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - }], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, { - "internalType": "address", - "name": "account", - "type": "address" - }], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint256", - "name": "period", - "type": "uint256" - }], - "name": "setTimeoutPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }], - "name": "submitProof", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}, { - "inputs": [{ - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - }], - "name": "supportsInterface", - "outputs": [{ - "internalType": "bool", - "name": "", - "type": "bool" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [], - "name": "timeoutPeriod", - "outputs": [{ - "internalType": "uint256", - "name": "", - "type": "uint256" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }, { - "internalType": "uint256", - "name": "", - "type": "uint256" - }], - "name": "timeoutPhaseVotes", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], - "stateMutability": "view", - "type": "function" -}, { - "inputs": [{ - "internalType": "uint64", - "name": "id", - "type": "uint64" - }], - "name": "timeoutProposal", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" -}] +[ + { + "inputs": [ + + ], + "name": "AccessControlBadConfirmation", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "neededRole", + "type": "bytes32" + } + ], + "name": "AccessControlUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + + ], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + + ], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "proofHash", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "startIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endIndex", + "type": "uint256" + } + ], + "name": "ProposalSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "ProposalTimedOut", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "phase", + "type": "uint8" + } + ], + "name": "VoteProposal", + "type": "event" + }, + { + "inputs": [ + + ], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "addProposer", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "allCommitPhaseVotes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "allProposers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "allTimeoutPhaseVotes", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "string", + "name": "txHash", + "type": "string" + } + ], + "name": "bitcoinTx", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "commitPhaseVotes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "getLastProposal", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, + { + "internalType": "address", + "name": "winner", + "type": "address" + }, + { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, + { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, + { + "internalType": "string", + "name": "txHash", + "type": "string" + } + ], + "internalType": "struct Committer.Proposal", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "initialize", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "isProposalTimeout", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "isProposer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "isVotedOnCommitPhase", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "isVotedOnTimeoutPhase", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "lastProposal", + "outputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, + { + "internalType": "address", + "name": "winner", + "type": "address" + }, + { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, + { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, + { + "internalType": "string", + "name": "txHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "proposal", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, + { + "internalType": "address", + "name": "winner", + "type": "address" + }, + { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, + { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, + { + "internalType": "string", + "name": "txHash", + "type": "string" + } + ], + "internalType": "struct Committer.Proposal", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "timeout", + "type": "uint256" + }, + { + "internalType": "address", + "name": "winner", + "type": "address" + }, + { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, + { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, + { + "internalType": "string", + "name": "txHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "proposers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposersList", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "removeProposer", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerConfirmation", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "period", + "type": "uint256" + } + ], + "name": "setTimeoutPeriod", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + }, + { + "internalType": "string", + "name": "proofHash", + "type": "string" + }, + { + "internalType": "string", + "name": "stateRootHash", + "type": "string" + }, + { + "internalType": "uint64", + "name": "startIndex", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "endIndex", + "type": "uint64" + } + ], + "name": "submitProof", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "timeoutPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "timeoutPhaseVotes", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "id", + "type": "uint64" + } + ], + "name": "timeoutProposal", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index 161623e..b2a1712 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -141,14 +141,12 @@ CREATE TABLE `proposal` ( `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `proposal_id` bigint NOT NULL, - `proposer` varchar(128) NOT NULL, `state_root_hash` varchar(128) NOT NULL, `proof_root_hash` varchar(128) NOT NULL, `start_batch_num` bigint NOT NULL, `end_batch_num` bigint NOT NULL, `btc_commit_tx_hash` varchar(128) , `btc_reveal_tx_hash` varchar(128) , - `block_height` bigint NOT NULL DEFAULT 0, `winner` varchar(128), `status` bigint NOT NULL DEFAULT 0, `upload_details` tinyint(1) default 0, diff --git a/internal/handler/checkstatus.go b/internal/handler/checkstatus.go index a9b642c..cc2f8b1 100644 --- a/internal/handler/checkstatus.go +++ b/internal/handler/checkstatus.go @@ -1,7 +1,6 @@ package handler import ( - "fmt" "time" "github.com/b2network/b2committer/internal/schema" @@ -49,17 +48,17 @@ func CheckStatusTimeOut(ctx *svc.ServiceContext) { log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) continue } - fmt.Println(proposal) - //if proposal.TxHash == "" && proposal.Status == schema.ProposalPendingStatus && proposal.Winner.String() != ctx.B2NodeConfig.Address { - // num := uint64(ctx.LatestBlockNumber) - proposal.BlockHight - // if num > 10000 { - // err := ctx.NodeClient.TimeoutProposal(proposal.Id) - // if err != nil { - // log.Errorf("[Handler.CheckStatusTimeOut] TimeoutProposal err: %s\n", errors.WithStack(err)) - // continue - // } - // } - // time.Sleep(2 * time.Second) - //} + if proposal.TxHash == "" && proposal.Status == schema.ProposalPendingStatus && proposal.Winner.String() != ctx.B2NodeConfig.Address { + res, err := ctx.NodeClient.IsProposalTimeout(proposal.Id) + if err != nil { + log.Errorf("[Handler.CheckStatusTimeOut] TimeoutProposal err: %s\n", errors.WithStack(err)) + continue + } + if res { + dbProposal.Status = schema.ProposalTimeoutStatus + ctx.DB.Save(dbProposal) + } + time.Sleep(2 * time.Second) + } } } diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 15c18e1..4f0f82c 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -18,10 +18,10 @@ func Run(ctx *svc.ServiceContext) { go CheckStatus(ctx) // check and inscribe go Inscribe(ctx) - // check time out + //// check time out go CheckStatusTimeOut(ctx) - // sync proposal + //// sync proposal go SyncProposal(ctx) - // sequence batches - go SequenceBatches(ctx) + //// sequence batches + //go SequenceBatches(ctx) } diff --git a/internal/handler/syncProposal.go b/internal/handler/syncProposal.go index a584604..c4ae528 100644 --- a/internal/handler/syncProposal.go +++ b/internal/handler/syncProposal.go @@ -45,7 +45,28 @@ func SyncProposal(ctx *svc.ServiceContext) { time.Sleep(3 * time.Second) continue } - if dbProposal.ProposalID != 0 { + if errors.Is(err, gorm.ErrRecordNotFound) { + dbProposal = schema.Proposal{ + Base: schema.Base{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + ProposalID: proposal.Id, + StateRootHash: proposal.StateRootHash, + ProofRootHash: proposal.ProofHash, + StartBatchNum: proposal.StartIndex, + EndBatchNum: proposal.EndIndex, + BtcRevealTxHash: proposal.TxHash, + Winner: proposal.Winner.String(), + Status: uint64(proposal.Status), + } + err = ctx.DB.Create(&dbProposal).Error + if err != nil { + log.Errorf("[Handler.SyncProposal] db create error info:", errors.WithStack(err)) + } + } + + if dbProposal.ProposalID != 0 && dbProposal.Status != uint64(schema.ProposalVotingStatus) { log.Infof("[Handler.SyncProposal] already voted :", ctx.B2NodeConfig.Address) proposalID++ continue @@ -67,27 +88,6 @@ func SyncProposal(ctx *svc.ServiceContext) { time.Sleep(3 * time.Second) continue } - - dbProposal := &schema.Proposal{ - Base: schema.Base{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, - EndBatchNum: verifyBatchInfo.endBatchNum, - ProposalID: proposal.Id, - Status: schema.ProposalVotingStatus, - StateRootHash: verifyBatchInfo.stateRootHash, - ProofRootHash: verifyBatchInfo.proofRootHash, - StartBatchNum: verifyBatchInfo.startBatchNum, - } - - // store db - err = ctx.DB.Save(dbProposal).Error - if err != nil { - log.Errorf("[Handler.SyncProposal] vote proposal error info", errors.WithStack(err)) - time.Sleep(3 * time.Second) - continue - } proposalID++ continue } diff --git a/internal/schema/proposal.go b/internal/schema/proposal.go index 7dff948..f2a2f2e 100644 --- a/internal/schema/proposal.go +++ b/internal/schema/proposal.go @@ -16,7 +16,6 @@ type Proposal struct { EndBatchNum uint64 `json:"end_batch_num"` BtcCommitTxHash string `json:"btc_commit_tx_hash"` BtcRevealTxHash string `json:"btc_reveal_tx_hash"` - BlockHeight uint64 `json:"block_height"` Winner string `json:"winner"` Status uint64 `json:"status"` } diff --git a/internal/types/config.go b/internal/types/config.go index 3059da2..79bafcd 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -10,14 +10,14 @@ type Config struct { LogLevel string `env:"LOG_LEVEL" envDefault:"info"` // "console","json" LogFormat string `env:"LOG_FORMAT" envDefault:"console"` - MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3306)/b2_committer3?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` + MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` - RPCUrl string `env:"RPC_URL" envDefault:"https://habitat-b2-nodes.bsquared.network"` + RPCUrl string `env:"RPC_URL" envDefault:"https://ethereum-goerli-rpc.publicnode.com"` Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` - InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"70000"` - InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0xb2fa3c8011ce25bb1d261403107b58b6aeda8a2af3827e86ad70ee081966d99c"` + InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"10619156"` + InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0x401b2ba6be4133f37485c9af320be4ca88b2972523d7d816b463fb772444de10"` PolygonZKEVMAddress string `env:"POLYGON_ZKEVM_ADDRESS" envDefault:"0xa997cfD539E703921fD1e3Cf25b4c241a27a4c7A"` LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` @@ -26,8 +26,8 @@ type Config struct { type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512"` - CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0xBf0Fe27C50f7cf155888bf24Bf0a5104Db926661"` - Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0x0DD3684F0C7e6b383C7bEc2901dCDa4b5360D893"` + CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x9bb873a9772D2356192C6D299ABcfa1F69F5b3e4"` + Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go index 2335db0..2076d35 100644 --- a/pkg/b2node/b2node.go +++ b/pkg/b2node/b2node.go @@ -124,6 +124,16 @@ func (n NodeClient) TimeoutProposal(id uint64) (*types.Transaction, error) { return tx, nil } +func (n NodeClient) IsProposalTimeout(id uint64) (bool, error) { + res, err := n.Committer.IsProposalTimeout(&bind.CallOpts{ + From: common.HexToAddress(n.Address), + }, id) + if err != nil { + return false, fmt.Errorf("[IsProposalTimeout] err: %s", err) + } + return res, nil +} + // //func (n NodeClient) GetAccountInfo(address string) (*eTypes.EthAccount, error) { // authClient := authTypes.NewQueryClient(n.GrpcConn) diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index a30a1d3..9bf2869 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -15,7 +15,7 @@ import ( const ( creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" - contractAddress = "0xb5f343da85c2FdA56811f628A537244793280F63" + contractAddress = "0x9bb873a9772D2356192C6D299ABcfa1F69F5b3e4" URL = "https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512" chainID = 11155111 ) @@ -125,7 +125,7 @@ func TestQueryProposalByID(t *testing.T) { require.NoError(t, err) proposal, err := committer.Proposal(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), - }, 1) + }, 3) require.NoError(t, err) fmt.Println(proposal) } @@ -143,7 +143,7 @@ func TestSubmitProof(t *testing.T) { tx, err := committer.SubmitProof(&bind.TransactOpts{ From: common.HexToAddress(creatorAddress), Signer: auth.Signer, - }, 1, "proofHash", "stateRoot", 1, 10) + }, 1, "proofHash", "stateRoot", 1, 718154) require.NoError(t, err) fmt.Println(tx.Hash()) } diff --git a/pkg/contract/committer.go b/pkg/contract/committer.go index 650eca3..f16d8f6 100644 --- a/pkg/contract/committer.go +++ b/pkg/contract/committer.go @@ -44,7 +44,7 @@ type CommitterProposal struct { // CommitterMetaData contains all meta data concerning the Committer contract. var CommitterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ProposalTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"phase\",\"type\":\"uint8\"}],\"name\":\"VoteProposal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"addProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allCommitPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allProposers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allTimeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"bitcoinTx\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"commitPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isProposer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnCommitPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnTimeoutPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"proposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"proposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proposers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proposersList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"removeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"}],\"name\":\"submitProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"timeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"timeoutProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ProposalTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"phase\",\"type\":\"uint8\"}],\"name\":\"VoteProposal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"addProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allCommitPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allProposers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allTimeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"bitcoinTx\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"commitPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"isProposalTimeout\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isProposer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnCommitPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnTimeoutPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"proposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"proposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proposers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proposersList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"removeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"}],\"name\":\"submitProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"timeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"timeoutProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // CommitterABI is the input ABI used to generate the binding from. @@ -472,6 +472,37 @@ func (_Committer *CommitterCallerSession) HasRole(role [32]byte, account common. return _Committer.Contract.HasRole(&_Committer.CallOpts, role, account) } +// IsProposalTimeout is a free data retrieval call binding the contract method 0x6e06958d. +// +// Solidity: function isProposalTimeout(uint64 id) view returns(bool) +func (_Committer *CommitterCaller) IsProposalTimeout(opts *bind.CallOpts, id uint64) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "isProposalTimeout", id) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsProposalTimeout is a free data retrieval call binding the contract method 0x6e06958d. +// +// Solidity: function isProposalTimeout(uint64 id) view returns(bool) +func (_Committer *CommitterSession) IsProposalTimeout(id uint64) (bool, error) { + return _Committer.Contract.IsProposalTimeout(&_Committer.CallOpts, id) +} + +// IsProposalTimeout is a free data retrieval call binding the contract method 0x6e06958d. +// +// Solidity: function isProposalTimeout(uint64 id) view returns(bool) +func (_Committer *CommitterCallerSession) IsProposalTimeout(id uint64) (bool, error) { + return _Committer.Contract.IsProposalTimeout(&_Committer.CallOpts, id) +} + // IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. // // Solidity: function isProposer(address sender) view returns(bool) From d1dc8e96e9842abec1818ce348dba0d990a7dc96 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:17:46 +0800 Subject: [PATCH 03/29] change polygon-v2 --- .gitignore | 1 + abi/PolygonSequence.json | 1046 ++++ abi/{PolygonZkEVM.json => PolygonVerify.json} | 1920 +++--- docs/sql/listener.sql | 3 +- go.mod | 136 +- go.sum | 1202 +--- internal/blockchain/blockchain.go | 3 +- internal/handler/committer.go | 42 +- internal/handler/handler.go | 8 +- internal/handler/inscribe.go | 6 +- internal/handler/sequenceBatches.go | 2 +- internal/handler/syncBlock.go | 1 - internal/handler/syncEvent.go | 4 +- internal/handler/syncProposal.go | 16 +- internal/schema/proposal.go | 17 +- internal/svc/svc.go | 12 +- internal/types/config.go | 28 +- pkg/b2node/b2node_test.go | 4 +- pkg/contract/sequence.go | 3078 ++++++++++ pkg/contract/verify.go | 5036 ++++++++++++++++ pkg/contract/zkEVM.go | 5286 ----------------- pkg/event/zkevm/sequenceBatches.go | 8 +- pkg/event/zkevm/verifybatches.go | 13 +- test-docker/docker-compose.yml | 17 +- test-docker/postgres.sql | 131 + 25 files changed, 10404 insertions(+), 7616 deletions(-) create mode 100644 abi/PolygonSequence.json rename abi/{PolygonZkEVM.json => PolygonVerify.json} (54%) create mode 100644 pkg/contract/sequence.go create mode 100644 pkg/contract/verify.go delete mode 100644 pkg/contract/zkEVM.go create mode 100644 test-docker/postgres.sql diff --git a/.gitignore b/.gitignore index 1607b87..68821a3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ b2-committer test-docker/mysql1 test-docker/mysql2 +test-docker/postgres1 diff --git a/abi/PolygonSequence.json b/abi/PolygonSequence.json new file mode 100644 index 0000000..da9364c --- /dev/null +++ b/abi/PolygonSequence.json @@ -0,0 +1,1046 @@ +[{ + "inputs": [{ + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "contract PolygonRollupManager", + "name": "_rollupManager", + "type": "address" + }], + "stateMutability": "nonpayable", + "type": "constructor" +}, + { + "inputs": [], + "name": "BatchAlreadyVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchNotSequencedOrNotSequenceEnd", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesAlreadyActive", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesDecentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ForcedDataDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchAboveLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "InitSequencedBatchDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitializeTransaction", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeBatchTimeTarget", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeForceBatchTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "MaxTimestampSequenceInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughMaticAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughPOLAmount", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedAggregator", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedSequencer", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "SequenceZeroBatches", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampBelowForcedTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "StoredRootMustBeDifferentThanNewRoot", + "type": "error" + }, + { + "inputs": [], + "name": "TransactionsLengthAboveMax", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + }], + "name": "AcceptAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint64", + "name": "forceBatchNum", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }], + "name": "ForceBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + }], + "name": "InitialSequenceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + }], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + }], + "name": "SequenceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }], + "name": "SequenceForceBatches", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + }], + "name": "SetForceBatchAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + }], + "name": "SetForceBatchTimeout", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + }], + "name": "SetTrustedSequencer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + }], + "name": "SetTrustedSequencerURL", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + }], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + }], + "name": "VerifyBatches", + "type": "event" + }, + { + "inputs": [], + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [{ + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [{ + "internalType": "uint8", + "name": "", + "type": "uint8" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [{ + "internalType": "bytes", + "name": "", + "type": "bytes" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [{ + "internalType": "bytes", + "name": "", + "type": "bytes" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [{ + "internalType": "bytes", + "name": "", + "type": "bytes" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [{ + "internalType": "uint16", + "name": "", + "type": "uint16" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [{ + "internalType": "uint16", + "name": "", + "type": "uint16" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [{ + "internalType": "uint8", + "name": "", + "type": "uint8" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [{ + "internalType": "bytes1", + "name": "", + "type": "bytes1" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_R", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_S", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SIGNATURE_INITIALIZE_TX_V", + "outputs": [{ + "internalType": "uint8", + "name": "", + "type": "uint8" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TIMESTAMP_RANGE", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [{ + "internalType": "contract IPolygonZkEVMBridgeV2", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculatePolPerForceBatch", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "polAmount", + "type": "uint256" + }], + "name": "forceBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "forceBatchAddress", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "forceBatchTimeout", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "name": "forcedBatches", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [{ + "internalType": "uint32", + "name": "", + "type": "uint32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + }], + "name": "generateInitializeTransaction", + "outputs": [{ + "internalType": "bytes", + "name": "", + "type": "bytes" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [{ + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + }], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastAccInputHash", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatch", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastForceBatchSequenced", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkName", + "outputs": [{ + "internalType": "string", + "name": "", + "type": "string" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "aggregator", + "type": "address" + }], + "name": "onVerifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pol", + "outputs": [{ + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupManager", + "outputs": [{ + "internalType": "contract PolygonRollupManager", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "components": [{ + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + }], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "uint64", + "name": "maxSequenceTimestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "initSequencedBatch", + "type": "uint64" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + }], + "name": "sequenceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "components": [{ + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + }], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + }], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + }], + "name": "setForceBatchAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + }], + "name": "setForceBatchTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + }], + "name": "setTrustedSequencer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + }], + "name": "setTrustedSequencerURL", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + }], + "name": "transferAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencer", + "outputs": [{ + "internalType": "address", + "name": "", + "type": "address" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedSequencerURL", + "outputs": [{ + "internalType": "string", + "name": "", + "type": "string" + }], + "stateMutability": "view", + "type": "function" + }] diff --git a/abi/PolygonZkEVM.json b/abi/PolygonVerify.json similarity index 54% rename from abi/PolygonZkEVM.json rename to abi/PolygonVerify.json index ed26822..f24bdaa 100644 --- a/abi/PolygonZkEVM.json +++ b/abi/PolygonVerify.json @@ -1,103 +1,75 @@ -[ - { - "inputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", - "name": "_globalExitRootManager", - "type": "address" - }, - { - "internalType": "contract IERC20Upgradeable", - "name": "_matic", - "type": "address" - }, - { - "internalType": "contract IVerifierRollup", - "name": "_rollupVerifier", - "type": "address" - }, - { - "internalType": "contract IPolygonZkEVMBridge", - "name": "_bridgeAddress", - "type": "address" - }, - { - "internalType": "uint64", - "name": "_chainID", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_forkID", - "type": "uint64" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "BatchAlreadyVerified", +[{ + "inputs": [{ + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }], + "stateMutability": "nonpayable", + "type": "constructor" +}, + { + "inputs": [], + "name": "AccessControlOnlyCanRenounceRolesForSelf", "type": "error" }, { "inputs": [], - "name": "BatchNotSequencedOrNotSequenceEnd", + "name": "AddressDoNotHaveRequiredRole", "type": "error" }, { "inputs": [], - "name": "ExceedMaxVerifyBatches", + "name": "AllzkEVMSequencedBatchesMustBeVerified", "type": "error" }, { "inputs": [], - "name": "FinalNumBatchBelowLastVerifiedBatch", + "name": "BatchFeeOutOfRange", "type": "error" }, { "inputs": [], - "name": "FinalNumBatchDoesNotMatchPendingState", + "name": "ChainIDAlreadyExist", "type": "error" }, { "inputs": [], - "name": "FinalPendingStateNumInvalid", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchTimeoutNotExpired", + "name": "ExceedMaxVerifyBatches", "type": "error" }, { "inputs": [], - "name": "ForceBatchesAlreadyActive", + "name": "FinalNumBatchBelowLastVerifiedBatch", "type": "error" }, { "inputs": [], - "name": "ForceBatchesOverflow", + "name": "FinalNumBatchDoesNotMatchPendingState", "type": "error" }, { "inputs": [], - "name": "ForcedDataDoesNotMatch", + "name": "FinalPendingStateNumInvalid", "type": "error" }, { "inputs": [], - "name": "GlobalExitRootNotExist", + "name": "HaltTimeoutNotExpired", "type": "error" }, { "inputs": [], - "name": "HaltTimeoutNotExpired", + "name": "InitBatchMustMatchCurrentForkID", "type": "error" }, { @@ -122,12 +94,12 @@ }, { "inputs": [], - "name": "InvalidRangeForceBatchTimeout", + "name": "InvalidRangeMultiplierBatchFee", "type": "error" }, { "inputs": [], - "name": "InvalidRangeMultiplierBatchFee", + "name": "MustSequenceSomeBatch", "type": "error" }, { @@ -150,11 +122,6 @@ "name": "NewTrustedAggregatorTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NotEnoughMaticAmount", - "type": "error" - }, { "inputs": [], "name": "OldAccInputHashDoesNotExist", @@ -165,11 +132,6 @@ "name": "OldStateRootDoesNotExist", "type": "error" }, - { - "inputs": [], - "name": "OnlyAdmin", - "type": "error" - }, { "inputs": [], "name": "OnlyEmergencyState", @@ -182,52 +144,42 @@ }, { "inputs": [], - "name": "OnlyPendingAdmin", - "type": "error" - }, - { - "inputs": [], - "name": "OnlyTrustedAggregator", - "type": "error" - }, - { - "inputs": [], - "name": "OnlyTrustedSequencer", + "name": "PendingStateDoesNotExist", "type": "error" }, { "inputs": [], - "name": "PendingStateDoesNotExist", + "name": "PendingStateInvalid", "type": "error" }, { "inputs": [], - "name": "PendingStateInvalid", + "name": "PendingStateNotConsolidable", "type": "error" }, { "inputs": [], - "name": "PendingStateNotConsolidable", + "name": "RollupAddressAlreadyExist", "type": "error" }, { "inputs": [], - "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "name": "RollupMustExist", "type": "error" }, { "inputs": [], - "name": "SequenceZeroBatches", + "name": "RollupTypeDoesNotExist", "type": "error" }, { "inputs": [], - "name": "SequencedTimestampBelowForcedTimestamp", + "name": "RollupTypeObsolete", "type": "error" }, { "inputs": [], - "name": "SequencedTimestampInvalid", + "name": "SenderMustBeRollup", "type": "error" }, { @@ -237,43 +189,117 @@ }, { "inputs": [], - "name": "TransactionsLengthAboveMax", + "name": "TrustedAggregatorTimeoutNotExpired", "type": "error" }, { "inputs": [], - "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "name": "UpdateNotCompatible", "type": "error" }, { "inputs": [], - "name": "TrustedAggregatorTimeoutNotExpired", + "name": "UpdateToSameRollupTypeID", "type": "error" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, { "indexed": false, "internalType": "address", - "name": "newAdmin", + "name": "rollupAddress", "type": "address" - } - ], - "name": "AcceptAdminRole", + }, + { + "indexed": false, + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" + }], + "name": "AddExistingRollup", "type": "event" }, { "anonymous": false, - "inputs": [], - "name": "ActivateForceBatches", + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "consensusImplementation", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + }], + "name": "AddNewRollupType", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { - "indexed": true, + "indexed": false, "internalType": "uint64", "name": "numBatch", "type": "uint64" @@ -285,15 +311,55 @@ "type": "bytes32" }, { - "indexed": true, + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "indexed": false, "internalType": "uint64", "name": "pendingStateNum", "type": "uint64" - } - ], + }], "name": "ConsolidatePendingState", "type": "event" }, + { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "rollupAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "address", + "name": "gasTokenAddress", + "type": "address" + }], + "name": "CreateNewRollup", + "type": "event" + }, { "anonymous": false, "inputs": [], @@ -308,53 +374,53 @@ }, { "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint64", - "name": "forceBatchNum", - "type": "uint64" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - } - ], - "name": "ForceBatch", + "inputs": [{ + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + }], + "name": "Initialized", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }], + "name": "ObsoleteRollupType", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", + "internalType": "uint64", + "name": "lastBatchSequenced", + "type": "uint64" + }], + "name": "OnSequenceBatches", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { - "indexed": true, + "indexed": false, "internalType": "uint64", "name": "numBatch", "type": "uint64" @@ -366,199 +432,203 @@ "type": "bytes32" }, { - "indexed": true, + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "indexed": false, "internalType": "address", "name": "aggregator", "type": "address" - } - ], + }], "name": "OverridePendingState", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, + "inputs": [{ + "indexed": false, + "internalType": "bytes32", + "name": "storedStateRoot", + "type": "bytes32" + }, { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", + "indexed": false, + "internalType": "bytes32", + "name": "provedStateRoot", + "type": "bytes32" + }], + "name": "ProveNonDeterministicPendingState", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "indexed": false, + "indexed": true, "internalType": "bytes32", - "name": "storedStateRoot", + "name": "previousAdminRole", "type": "bytes32" }, { - "indexed": false, + "indexed": true, "internalType": "bytes32", - "name": "provedStateRoot", + "name": "newAdminRole", "type": "bytes32" - } - ], - "name": "ProveNonDeterministicPendingState", + }], + "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "indexed": true, - "internalType": "uint64", - "name": "numBatch", - "type": "uint64" - } - ], - "name": "SequenceBatches", + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }], + "name": "RoleGranted", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "indexed": true, - "internalType": "uint64", - "name": "numBatch", - "type": "uint64" - } - ], - "name": "SequenceForceBatches", + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }], + "name": "RoleRevoked", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "newforceBatchTimeout", - "type": "uint64" - } - ], - "name": "SetForceBatchTimeout", + "inputs": [{ + "indexed": false, + "internalType": "uint256", + "name": "newBatchFee", + "type": "uint256" + }], + "name": "SetBatchFee", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint16", - "name": "newMultiplierBatchFee", - "type": "uint16" - } - ], + "inputs": [{ + "indexed": false, + "internalType": "uint16", + "name": "newMultiplierBatchFee", + "type": "uint16" + }], "name": "SetMultiplierBatchFee", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "newPendingStateTimeout", - "type": "uint64" - } - ], + "inputs": [{ + "indexed": false, + "internalType": "uint64", + "name": "newPendingStateTimeout", + "type": "uint64" + }], "name": "SetPendingStateTimeout", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "newTrustedAggregator", - "type": "address" - } - ], + "inputs": [{ + "indexed": false, + "internalType": "address", + "name": "newTrustedAggregator", + "type": "address" + }], "name": "SetTrustedAggregator", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "newTrustedAggregatorTimeout", - "type": "uint64" - } - ], + "inputs": [{ + "indexed": false, + "internalType": "uint64", + "name": "newTrustedAggregatorTimeout", + "type": "uint64" + }], "name": "SetTrustedAggregatorTimeout", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "newTrustedSequencer", - "type": "address" - } - ], - "name": "SetTrustedSequencer", + "inputs": [{ + "indexed": false, + "internalType": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + }], + "name": "SetVerifyBatchTimeTarget", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "indexed": false, - "internalType": "string", - "name": "newTrustedSequencerURL", - "type": "string" - } - ], - "name": "SetTrustedSequencerURL", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "internalType": "uint32", + "name": "newRollupTypeID", + "type": "uint32" + }, { "indexed": false, "internalType": "uint64", - "name": "newVerifyBatchTimeTarget", + "name": "lastVerifiedBatchBeforeUpgrade", "type": "uint64" - } - ], - "name": "SetVerifyBatchTimeTarget", + }], + "name": "UpdateRollup", "type": "event" }, { "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "newPendingAdmin", - "type": "address" - } - ], - "name": "TransferAdminRole", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "indexed": false, "internalType": "uint64", @@ -567,33 +637,14 @@ }, { "indexed": false, - "internalType": "uint64", - "name": "forkID", - "type": "uint64" - }, - { - "indexed": false, - "internalType": "string", - "name": "version", - "type": "string" - } - ], - "name": "UpdateZkEVMVersion", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint64", - "name": "numBatch", - "type": "uint64" + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", - "name": "stateRoot", + "name": "exitRoot", "type": "bytes32" }, { @@ -601,16 +652,20 @@ "internalType": "address", "name": "aggregator", "type": "address" - } - ], + }], "name": "VerifyBatches", "type": "event" }, { "anonymous": false, - "inputs": [ + "inputs": [{ + "indexed": true, + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { - "indexed": true, + "indexed": false, "internalType": "uint64", "name": "numBatch", "type": "uint64" @@ -621,244 +676,240 @@ "name": "stateRoot", "type": "bytes32" }, + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, { "indexed": true, "internalType": "address", "name": "aggregator", "type": "address" - } - ], + }], "name": "VerifyBatchesTrustedAggregator", "type": "event" }, { "inputs": [], - "name": "acceptAdminRole", - "outputs": [], - "stateMutability": "nonpayable", + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint64", - "name": "sequencedBatchNum", - "type": "uint64" - } - ], + "inputs": [], "name": "activateEmergencyState", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "activateForceBatches", + "inputs": [{ + "internalType": "contract IPolygonRollupBase", + "name": "rollupAddress", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }], + "name": "addExistingRollup", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "admin", - "outputs": [ + "inputs": [{ + "internalType": "address", + "name": "consensusImplementation", + "type": "address" + }, { - "internalType": "address", - "name": "", + "internalType": "contract IVerifierRollup", + "name": "verifier", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "batchFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint64", - "name": "", + "name": "forkID", "type": "uint64" - } - ], - "name": "batchNumToStateRoot", - "outputs": [ + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, { "internalType": "bytes32", - "name": "", + "name": "genesis", "type": "bytes32" - } - ], - "stateMutability": "view", + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }], + "name": "addNewRollupType", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "bridgeAddress", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMBridge", - "name": "", - "type": "address" - } - ], + "outputs": [{ + "internalType": "contract IPolygonZkEVMBridge", + "name": "", + "type": "address" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "calculateRewardPerBatch", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "chainID", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "inputs": [{ + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }], + "name": "chainIDToRollupID", + "outputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "newStateRoot", - "type": "uint256" - } - ], - "name": "checkStateRootInsidePrime", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", "name": "pendingStateNum", "type": "uint64" - } - ], + }], "name": "consolidatePendingState", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "deactivateEmergencyState", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }, { - "internalType": "bytes", - "name": "transactions", - "type": "bytes" + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "sequencer", + "type": "address" + }, + { + "internalType": "address", + "name": "gasTokenAddress", + "type": "address" }, { - "internalType": "uint256", - "name": "maticAmount", - "type": "uint256" - } - ], - "name": "forceBatch", + "internalType": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "networkName", + "type": "string" + }], + "name": "createNewRollup", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "forceBatchTimeout", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "name": "forcedBatches", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "forkID", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "name": "getBatchFee", + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getForcedBatchFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], + "outputs": [{ + "internalType": "uint256", + "name": "", + "type": "uint256" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", "name": "initNumBatch", @@ -883,282 +934,356 @@ "internalType": "bytes32", "name": "newStateRoot", "type": "bytes32" - } - ], + }], "name": "getInputSnarkBytes", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], + "outputs": [{ + "internalType": "bytes", + "name": "", + "type": "bytes" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }], "name": "getLastVerifiedBatch", - "outputs": [ + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }], + "name": "getRoleAdmin", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", - "name": "", + "name": "batchNum", "type": "uint64" - } - ], + }], + "name": "getRollupBatchNumToStateRoot", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "globalExitRootManager", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", - "name": "", - "type": "address" - } - ], + "name": "getRollupExitRoot", + "outputs": [{ + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "address", - "name": "trustedSequencer", - "type": "address" - }, - { - "internalType": "uint64", - "name": "pendingStateTimeout", - "type": "uint64" - }, - { - "internalType": "address", - "name": "trustedAggregator", - "type": "address" - }, - { - "internalType": "uint64", - "name": "trustedAggregatorTimeout", - "type": "uint64" - } - ], - "internalType": "struct PolygonZkEVM.InitializePackedParameters", - "name": "initializePackedParameters", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "genesisRoot", - "type": "bytes32" - }, - { - "internalType": "string", - "name": "_trustedSequencerURL", - "type": "string" - }, + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { - "internalType": "string", - "name": "_networkName", - "type": "string" + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + }], + "name": "getRollupPendingStateTransitions", + "outputs": [{ + "components": [{ + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" }, - { - "internalType": "string", - "name": "_version", - "type": "string" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }], + "internalType": "struct LegacyZKEVMStateVariables.PendingState", + "name": "", + "type": "tuple" + }], + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "isEmergencyState", - "outputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + }], + "name": "getRollupSequencedBatches", + "outputs": [{ + "components": [{ + "internalType": "bytes32", + "name": "accInputHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "sequencedTimestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "previousLastBatchSequenced", + "type": "uint64" + }], + "internalType": "struct LegacyZKEVMStateVariables.SequencedBatchData", + "name": "", + "type": "tuple" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "isForcedBatchDisallowed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "name": "globalExitRootManager", + "outputs": [{ + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "", + "type": "address" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "uint64", - "name": "pendingStateNum", - "type": "uint64" - } - ], - "name": "isPendingStateConsolidable", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", + "internalType": "address", + "name": "account", + "type": "address" + }], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "lastBatchSequenced", - "outputs": [ + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "internalType": "address", + "name": "account", + "type": "address" + }], + "name": "hasRole", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "lastForceBatch", - "outputs": [ + "inputs": [{ + "internalType": "address", + "name": "trustedAggregator", + "type": "address" + }, { "internalType": "uint64", - "name": "", + "name": "_pendingStateTimeout", "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastForceBatchSequenced", - "outputs": [ + }, { "internalType": "uint64", - "name": "", + "name": "_trustedAggregatorTimeout", "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastPendingState", - "outputs": [ + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "timelock", + "type": "address" + }, + { + "internalType": "address", + "name": "emergencyCouncil", + "type": "address" + }, + { + "internalType": "contract PolygonZkEVMExistentEtrog", + "name": "polygonZkEVM", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "zkEVMVerifier", + "type": "address" + }, { "internalType": "uint64", - "name": "", + "name": "zkEVMForkID", "type": "uint64" - } - ], - "stateMutability": "view", + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" + }], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "lastPendingStateConsolidated", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "name": "isEmergencyState", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", - "name": "", + "name": "pendingStateNum", "type": "uint64" - } - ], + }], + "name": "isPendingStateConsolidable", + "outputs": [{ + "internalType": "bool", + "name": "", + "type": "bool" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "lastVerifiedBatch", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "name": "lastAggregationTimestamp", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "matic", - "outputs": [ - { - "internalType": "contract IERC20Upgradeable", - "name": "", - "type": "address" - } - ], + "name": "lastDeactivatedEmergencyStateTimestamp", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "multiplierBatchFee", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], + "outputs": [{ + "internalType": "uint16", + "name": "", + "type": "uint16" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "networkName", - "outputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }], + "name": "obsoleteRollupType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ + "internalType": "uint64", + "name": "newSequencedBatches", + "type": "uint64" + }, { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", + "internalType": "bytes32", + "name": "newAccInputHash", + "type": "bytes32" + }], + "name": "onSequenceBatches", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", "name": "initPendingStateNum", @@ -1193,88 +1318,40 @@ "internalType": "bytes32[24]", "name": "proof", "type": "bytes32[24]" - } - ], + }], "name": "overridePendingState", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "pendingStateTimeout", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "pendingStateTransitions", - "outputs": [ - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "lastVerifiedBatch", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "exitRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" - } - ], + "inputs": [], + "name": "pol", + "outputs": [{ + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", "name": "initPendingStateNum", @@ -1309,329 +1386,317 @@ "internalType": "bytes32[24]", "name": "proof", "type": "bytes32[24]" - } - ], + }], "name": "proveNonDeterministicPendingState", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rollupVerifier", - "outputs": [ + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { - "internalType": "contract IVerifierRollup", - "name": "", + "internalType": "address", + "name": "account", "type": "address" - } - ], - "stateMutability": "view", + }], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "components": [ - { - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "globalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "minForcedTimestamp", - "type": "uint64" - } - ], - "internalType": "struct PolygonZkEVM.BatchData[]", - "name": "batches", - "type": "tuple[]" - }, + "inputs": [{ + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "l2Coinbase", + "name": "account", "type": "address" - } - ], - "name": "sequenceBatches", + }], + "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "components": [ - { - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "globalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "minForcedTimestamp", - "type": "uint64" - } - ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", - "name": "batches", - "type": "tuple[]" - } - ], - "name": "sequenceForceBatches", - "outputs": [], - "stateMutability": "nonpayable", + "inputs": [{ + "internalType": "address", + "name": "rollupAddress", + "type": "address" + }], + "name": "rollupAddressToID", + "outputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rollupCount", + "outputs": [{ + "internalType": "uint32", + "name": "", + "type": "uint32" + }], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }], + "name": "rollupIDToRollupData", + "outputs": [{ + "internalType": "contract IPolygonRollupBase", + "name": "rollupContract", + "type": "address" + }, + { + "internalType": "uint64", + "name": "chainID", + "type": "uint64" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, { "internalType": "uint64", - "name": "", + "name": "forkID", "type": "uint64" - } - ], - "name": "sequencedBatches", - "outputs": [ + }, { "internalType": "bytes32", - "name": "accInputHash", + "name": "lastLocalExitRoot", "type": "bytes32" }, { "internalType": "uint64", - "name": "sequencedTimestamp", + "name": "lastBatchSequenced", "type": "uint64" }, { "internalType": "uint64", - "name": "previousLastBatchSequenced", + "name": "lastVerifiedBatch", "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint64", - "name": "newforceBatchTimeout", + "name": "lastPendingState", "type": "uint64" - } - ], - "name": "setForceBatchTimeout", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "uint16", - "name": "newMultiplierBatchFee", - "type": "uint16" - } - ], - "name": "setMultiplierBatchFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "internalType": "uint64", + "name": "lastPendingStateConsolidated", + "type": "uint64" + }, { "internalType": "uint64", - "name": "newPendingStateTimeout", + "name": "lastVerifiedBatchBeforeUpgrade", "type": "uint64" - } - ], - "name": "setPendingStateTimeout", - "outputs": [], - "stateMutability": "nonpayable", + }, + { + "internalType": "uint64", + "name": "rollupTypeID", + "type": "uint64" + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }], + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newTrustedAggregator", - "type": "address" - } - ], - "name": "setTrustedAggregator", - "outputs": [], - "stateMutability": "nonpayable", + "inputs": [], + "name": "rollupTypeCount", + "outputs": [{ + "internalType": "uint32", + "name": "", + "type": "uint32" + }], + "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupTypeID", + "type": "uint32" + }], + "name": "rollupTypeMap", + "outputs": [{ + "internalType": "address", + "name": "consensusImplementation", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "verifier", + "type": "address" + }, { "internalType": "uint64", - "name": "newTrustedAggregatorTimeout", + "name": "forkID", "type": "uint64" - } - ], - "name": "setTrustedAggregatorTimeout", - "outputs": [], - "stateMutability": "nonpayable", + }, + { + "internalType": "uint8", + "name": "rollupCompatibilityID", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "obsolete", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "genesis", + "type": "bytes32" + }], + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newTrustedSequencer", - "type": "address" - } - ], - "name": "setTrustedSequencer", + "inputs": [{ + "internalType": "uint256", + "name": "newBatchFee", + "type": "uint256" + }], + "name": "setBatchFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "string", - "name": "newTrustedSequencerURL", - "type": "string" - } - ], - "name": "setTrustedSequencerURL", + "inputs": [{ + "internalType": "uint16", + "name": "newMultiplierBatchFee", + "type": "uint16" + }], + "name": "setMultiplierBatchFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "uint64", - "name": "newVerifyBatchTimeTarget", - "type": "uint64" - } - ], - "name": "setVerifyBatchTimeTarget", + "inputs": [{ + "internalType": "uint64", + "name": "newPendingStateTimeout", + "type": "uint64" + }], + "name": "setPendingStateTimeout", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newPendingAdmin", - "type": "address" - } - ], - "name": "transferAdminRole", + "inputs": [{ + "internalType": "uint64", + "name": "newTrustedAggregatorTimeout", + "type": "uint64" + }], + "name": "setTrustedAggregatorTimeout", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", + "inputs": [{ + "internalType": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + }], + "name": "setVerifyBatchTimeTarget", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "trustedAggregator", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], + "name": "totalSequencedBatches", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "trustedAggregatorTimeout", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "name": "totalVerifiedBatches", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { "inputs": [], - "name": "trustedSequencer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], + "name": "trustedAggregatorTimeout", + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "trustedSequencerURL", - "outputs": [ + "inputs": [{ + "internalType": "contract ITransparentUpgradeableProxy", + "name": "rollupContract", + "type": "address" + }, { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", + "internalType": "uint32", + "name": "newRollupTypeID", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "upgradeData", + "type": "bytes" + }], + "name": "updateRollup", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "verifyBatchTimeTarget", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], + "outputs": [{ + "internalType": "uint64", + "name": "", + "type": "uint64" + }], "stateMutability": "view", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", "name": "pendingStateNum", @@ -1657,19 +1722,27 @@ "name": "newStateRoot", "type": "bytes32" }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, { "internalType": "bytes32[24]", "name": "proof", "type": "bytes32[24]" - } - ], + }], "name": "verifyBatches", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ + "inputs": [{ + "internalType": "uint32", + "name": "rollupID", + "type": "uint32" + }, { "internalType": "uint64", "name": "pendingStateNum", @@ -1695,15 +1768,18 @@ "name": "newStateRoot", "type": "bytes32" }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + }, { "internalType": "bytes32[24]", "name": "proof", "type": "bytes32[24]" - } - ], + }], "name": "verifyBatchesTrustedAggregator", "outputs": [], "stateMutability": "nonpayable", "type": "function" - } -] + }] diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index b2a1712..71815e5 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -145,8 +145,7 @@ CREATE TABLE `proposal` ( `proof_root_hash` varchar(128) NOT NULL, `start_batch_num` bigint NOT NULL, `end_batch_num` bigint NOT NULL, - `btc_commit_tx_hash` varchar(128) , - `btc_reveal_tx_hash` varchar(128) , + `btc_tx_hash` varchar(128) , `winner` varchar(128), `status` bigint NOT NULL DEFAULT 0, `upload_details` tinyint(1) default 0, diff --git a/go.mod b/go.mod index bac179c..7b0f58a 100644 --- a/go.mod +++ b/go.mod @@ -3,197 +3,77 @@ module github.com/b2network/b2committer go 1.21 require ( - cosmossdk.io/math v1.0.0-rc.0 github.com/btcsuite/btcd v0.23.4 github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/caarlos0/env/v6 v6.10.1 - github.com/cosmos/cosmos-sdk v0.46.11 github.com/ethereum/go-ethereum v1.13.14 - github.com/evmos/ethermint v0.22.0 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.4 github.com/txaty/go-merkletree v0.2.2 go.uber.org/zap v1.23.0 google.golang.org/grpc v1.60.1 - gorm.io/driver/mysql v1.5.2 - gorm.io/gorm v1.25.5 + gorm.io/driver/postgres v1.5.7 + gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde ) require ( - cloud.google.com/go v0.111.0 // indirect - cloud.google.com/go/compute v1.23.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect - cloud.google.com/go/storage v1.30.1 // indirect - cosmossdk.io/errors v1.0.0-beta.7 // indirect - filippo.io/edwards25519 v1.0.0-rc.1 // indirect - github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/99designs/keyring v1.2.1 // indirect - github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/aead/siphash v1.0.1 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go v1.44.122 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect - github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/confio/ics23/go v0.9.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect - github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gogoproto v1.4.7 // indirect - github.com/cosmos/gorocksdb v1.2.0 // indirect - github.com/cosmos/iavl v0.19.5 // indirect - github.com/cosmos/ledger-cosmos-go v0.12.2 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/felixge/httpsnoop v1.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/gogo/gateway v1.1.0 // indirect github.com/gogo/protobuf v1.3.3 // indirect - github.com/golang/glog v1.1.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.4.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gorilla/handlers v1.5.1 // indirect - github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/gtank/merlin v0.1.1 // indirect - github.com/gtank/ristretto255 v0.1.2 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect github.com/holiman/uint256 v1.2.4 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.4.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/jmhodges/levigo v1.0.0 // indirect github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rakyll/statik v0.1.7 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/rs/cors v1.8.2 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/tendermint/go-amino v0.16.0 // indirect - github.com/tendermint/tendermint v0.34.27 // indirect - github.com/tendermint/tm-db v0.6.7 // indirect - github.com/tidwall/btree v1.5.0 // indirect - github.com/tidwall/gjson v1.14.4 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/sjson v1.2.5 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/ulikunitz/xz v0.5.10 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.20.0 // indirect - golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.17.0 // indirect - google.golang.org/api v0.149.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/protobuf v1.32.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.4 // indirect rsc.io/tmplfunc v0.0.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect ) -replace ( - github.com/evmos/ethermint => github.com/b2network/b2-node v0.0.0-20240204125823-c364bff9b6f1 - github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.27 - -) +replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/go.sum b/go.sum index 642aa51..3d68ea9 100644 --- a/go.sum +++ b/go.sum @@ -1,249 +1,21 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= -cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-rc.0 h1:ml46ukocrAAoBpYKMidF0R2tQJ1Uxfns0yH8wqgMAFc= -cosmossdk.io/math v1.0.0-rc.0/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= -filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= -github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= -github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= -github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/agiledragon/gomonkey/v2 v2.11.0 h1:5oxSgA+tC1xuGsrIorR+sYiziYltmJyEZ9qA25b6l5U= github.com/agiledragon/gomonkey/v2 v2.11.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/b2network/b2-node v0.0.0-20240204125823-c364bff9b6f1 h1:qBbJcGEcqVqF9pPi62Af7cwZx8oW7mNcGpaltM0p36A= -github.com/b2network/b2-node v0.0.0-20240204125823-c364bff9b6f1/go.mod h1:5JgEd35fH7HW6rqfYOpvHS7SlUoQUCCPoCiOzTo/EME= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= -github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= @@ -276,39 +48,13 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/caarlos0/env/v6 v6.10.1 h1:t1mPSxNpei6M5yAeu1qtRdPAK29Nbcf/n3G7x+b3/II= github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= @@ -321,52 +67,16 @@ github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeS github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= -github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft v0.34.27 h1:ri6BvmwjWR0gurYjywcBqRe4bbwc3QVs9KRcCzgh/J0= -github.com/cometbft/cometbft v0.34.27/go.mod h1:BcCbhKv7ieM0KEddnYXvQZR+pZykTKReJJYf7YC7qhw= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= -github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= -github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.46.11 h1:csMJQHtcb/EIu2EJmeg/2NaGkGw3ZScFwa4CRpCCw18= -github.com/cosmos/cosmos-sdk v0.46.11/go.mod h1:bG4AkW9bqc8ycrryyKGQEl3YV9BY2wr6HggGq8kvcgM= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= -github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= -github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.4.7 h1:RzYKVnsEC7UIkDnhTIkqEB7LnIQbsySvmNEqPCiPevk= -github.com/cosmos/gogoproto v1.4.7/go.mod h1:gxGePp9qedovvl/StQL2BIJ6qlIBn1+9YxR0IulGBKA= -github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= -github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= -github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v6 v6.1.0 h1:o7oXws2vKkKfOFzJI+oNylRn44PCNt5wzHd/zKQKbvQ= -github.com/cosmos/ibc-go/v6 v6.1.0/go.mod h1:CY3zh2HLfetRiW8LY6kVHMATe90Wj/UOoY8T6cuB0is= -github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= -github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= -github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -378,53 +88,16 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= -github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= -github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -433,206 +106,49 @@ github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqG github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= -github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= -github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= -github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= -github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= -github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= -github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.0 h1:bzrYP+qu/gMrL1au7/aDvkoOVGUJpeKBgbqRHACAFDY= -github.com/hashicorp/go-getter v1.7.0/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= -github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= @@ -642,13 +158,12 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= +github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -657,77 +172,29 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -735,817 +202,189 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= -github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= -github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= -github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= -github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= -github.com/tidwall/btree v1.5.0 h1:iV0yVY/frd7r6qGBXfEYs7DH0gTDgrKTrDjS7xt/IyQ= -github.com/tidwall/btree v1.5.0/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/txaty/go-merkletree v0.2.2 h1:K5bHDFK+Q3KK+gEJeyTOECKuIwl/LVo4CI+cm0/p34g= github.com/txaty/go-merkletree v0.2.2/go.mod h1:w5HPEu7ubNw5LzS+91m+1/GtuZcWHKiPU3vEGi+ThJM= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1553,26 +392,13 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= -gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= -gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= -gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/driver/mysql v1.5.4 h1:igQmHfKcbaTVyAIHNhhB888vvxh8EdQ2uSUT0LPcBso= +gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tvs= +gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= +gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde h1:9DShaph9qhkIYw7QF91I/ynrr4cOO2PZra2PFD7Mfeg= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/internal/blockchain/blockchain.go b/internal/blockchain/blockchain.go index 1a8a384..f9ad55b 100644 --- a/internal/blockchain/blockchain.go +++ b/internal/blockchain/blockchain.go @@ -25,7 +25,8 @@ func init() { register(&zkevm.VerifyBatches{}) register(&zkevm.SequenceBatches{}) cfg := config.GetConfig() - addContract(cfg.PolygonZKEVMAddress) + addContract(cfg.PolygonSequenceContract) + addContract(cfg.PolygonVerifyBatchContract) } func register(event Event) { diff --git a/internal/handler/committer.go b/internal/handler/committer.go index ce4fe8c..4d63304 100644 --- a/internal/handler/committer.go +++ b/internal/handler/committer.go @@ -44,7 +44,7 @@ type VerifyRangBatchInfo struct { // Committer find verifyBatchesTrustedAggregator event and commit stateRoot proof to b2node func Committer(ctx *svc.ServiceContext) { for { - var proposals []schema.Proposal + //var proposals []schema.Proposal proposal, err := ctx.NodeClient.QueryLastProposal() lastProposalID, lastFinalBatchNum := proposal.Id, proposal.EndIndex if err != nil { @@ -52,16 +52,16 @@ func Committer(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) continue } - err = ctx.DB.Where("end_batch_num > ?", lastFinalBatchNum).Find(&proposals).Error - if err != nil { - log.Errorf("[Handler.Committer][DB] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - if len(proposals) > 0 { - log.Errorf("[Handler.Committer] proposal already is existed, lastFinalBatchNum: %s", lastFinalBatchNum) - continue - } + //err = ctx.DB.Where("end_batch_num > ?", lastFinalBatchNum).Find(&proposals).Error + //if err != nil { + // log.Errorf("[Handler.Committer][DB] error info: %s", errors.WithStack(err).Error()) + // time.Sleep(10 * time.Second) + // continue + //} + //if len(proposals) > 0 { + // log.Errorf("[Handler.Committer] proposal already is existed, lastFinalBatchNum: %s", lastFinalBatchNum) + // continue + //} verifyBatchInfo, err := GetVerifyBatchInfoByLastBatchNum(ctx, lastFinalBatchNum) if err != nil { log.Errorf("[Handler.Committer] error info: %s", errors.WithStack(err).Error()) @@ -106,24 +106,6 @@ func committerProposal(ctx *svc.ServiceContext, verifyBatchInfo *VerifyRangBatch if err != nil { return fmt.Errorf("[committerProposal] submit proof error info: %s", errors.WithStack(err)) } - dbProposal := &schema.Proposal{ - Base: schema.Base{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, - EndBatchNum: verifyBatchInfo.endBatchNum, - ProposalID: proposalID, - Status: schema.ProposalVotingStatus, - StateRootHash: verifyBatchInfo.stateRootHash, - ProofRootHash: verifyBatchInfo.proofRootHash, - StartBatchNum: verifyBatchInfo.startBatchNum, - } - - // store db - err = ctx.DB.Save(dbProposal).Error - if err != nil { - return fmt.Errorf("[committerProposal] save proposal error info: %s", errors.WithStack(err)) - } return nil } @@ -213,7 +195,7 @@ func DecodeTransactionInputData(contractABI abi.ABI, data []byte) (map[string]in } func GetVerifyBatchesParamsByTxHash(ctx *svc.ServiceContext, txHash common.Hash) (*VerifyBatchesTrustedAggregatorParams, error) { - abiObject, err := abi.JSON(strings.NewReader(contract.ZkEVMMetaData.ABI)) + abiObject, err := abi.JSON(strings.NewReader(contract.VerifyMetaData.ABI)) if err != nil { return nil, fmt.Errorf("[GetVerifyBatchesParamsByTxHash] parse abi error: %s", errors.WithStack(err)) } diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 4f0f82c..a01213b 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -10,7 +10,7 @@ func Run(ctx *svc.ServiceContext) { go LatestBlackNumber(ctx) // sync blocks go SyncBlock(ctx) - // sync events + //sync events go SyncEvent(ctx) // execute committer go Committer(ctx) @@ -18,10 +18,10 @@ func Run(ctx *svc.ServiceContext) { go CheckStatus(ctx) // check and inscribe go Inscribe(ctx) - //// check time out + // check time out go CheckStatusTimeOut(ctx) - //// sync proposal + // sync proposal go SyncProposal(ctx) - //// sequence batches + //sequence batches //go SequenceBatches(ctx) } diff --git a/internal/handler/inscribe.go b/internal/handler/inscribe.go index dcd5daf..029a601 100644 --- a/internal/handler/inscribe.go +++ b/internal/handler/inscribe.go @@ -33,7 +33,7 @@ func Inscribe(ctx *svc.ServiceContext) { if proposal.Status == schema.ProposalSucceedStatus { dbProposal.Status = uint64(proposal.Status) dbProposal.Winner = proposal.Winner.String() - dbProposal.BtcRevealTxHash = proposal.TxHash + dbProposal.BtcTxHash = proposal.TxHash ctx.DB.Save(dbProposal) } if proposal.Status == schema.ProposalPendingStatus && @@ -57,9 +57,7 @@ func Inscribe(ctx *svc.ServiceContext) { log.Errorf("[Handler.Inscribe] BitcoinTx err: %s\n", errors.WithStack(err).Error()) continue } - dbProposal.BtcRevealTxHash = bitcoinTxHash - dbProposal.BtcCommitTxHash = rs.CommitTxHash.String() - + dbProposal.BtcTxHash = bitcoinTxHash ctx.DB.Save(dbProposal) } if proposal.Status == schema.ProposalPendingStatus && proposal.TxHash != "" && proposal.Winner.String() != ctx.B2NodeConfig.Address { diff --git a/internal/handler/sequenceBatches.go b/internal/handler/sequenceBatches.go index 8626317..1298390 100644 --- a/internal/handler/sequenceBatches.go +++ b/internal/handler/sequenceBatches.go @@ -93,7 +93,7 @@ func GetSequenceBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum } func GetSequenceBatchesDetails(ctx *svc.ServiceContext, sequenceBatches []*SequenceBatchesAndTxHash) (map[uint64]map[string]interface{}, error) { - abiObject, err := abi.JSON(strings.NewReader(contract.ZkEVMMetaData.ABI)) + abiObject, err := abi.JSON(strings.NewReader(contract.SequenceMetaData.ABI)) if err != nil { return nil, fmt.Errorf("[GetSequenceBatchesDetails] parse abi error: %s", errors.WithStack(err)) diff --git a/internal/handler/syncBlock.go b/internal/handler/syncBlock.go index a549122..254cc35 100644 --- a/internal/handler/syncBlock.go +++ b/internal/handler/syncBlock.go @@ -19,7 +19,6 @@ func SyncBlock(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) var syncedBlock schema.SyncBlock err := ctx.DB.Where("status = ? or status = ? ", schema.BlockValid, schema.BlockPending).Order("block_number desc").First(&syncedBlock).Error - if err != nil && err != gorm.ErrRecordNotFound { panic(err) } diff --git a/internal/handler/syncEvent.go b/internal/handler/syncEvent.go index 5dcc37c..63836d7 100644 --- a/internal/handler/syncEvent.go +++ b/internal/handler/syncEvent.go @@ -57,8 +57,8 @@ func SyncEvent(ctx *svc.ServiceContext) { func HandlePendingBlock(ctx *svc.ServiceContext, block schema.SyncBlock) error { log.Infof("[Handler.SyncEvent.PendingBlock]Start: %d, %s \n", block.BlockNumber, block.BlockHash) - //log.Infof("[Handler.SyncEvent.PendingBlock]GetContracts: %v\n", blockchain.GetContracts()) - //log.Infof("[Handler.SyncEvent.PendingBlock]GetEvents: %v\n", blockchain.GetEvents()) + log.Infof("[Handler.SyncEvent.PendingBlock]GetContracts: %v\n", blockchain.GetContracts()) + log.Infof("[Handler.SyncEvent.PendingBlock]GetEvents: %v\n", blockchain.GetEvents()) events, err := LogFilter(ctx, block, blockchain.GetContracts(), [][]common.Hash{blockchain.GetEvents()}) log.Infof("[Handler.SyncEvent.PendingBlock] block %d, events number is %d:", block.BlockNumber, len(events)) if err != nil { diff --git a/internal/handler/syncProposal.go b/internal/handler/syncProposal.go index c4ae528..03611d3 100644 --- a/internal/handler/syncProposal.go +++ b/internal/handler/syncProposal.go @@ -51,14 +51,14 @@ func SyncProposal(ctx *svc.ServiceContext) { CreatedAt: time.Now(), UpdatedAt: time.Now(), }, - ProposalID: proposal.Id, - StateRootHash: proposal.StateRootHash, - ProofRootHash: proposal.ProofHash, - StartBatchNum: proposal.StartIndex, - EndBatchNum: proposal.EndIndex, - BtcRevealTxHash: proposal.TxHash, - Winner: proposal.Winner.String(), - Status: uint64(proposal.Status), + ProposalID: proposal.Id, + StateRootHash: proposal.StateRootHash, + ProofRootHash: proposal.ProofHash, + StartBatchNum: proposal.StartIndex, + EndBatchNum: proposal.EndIndex, + BtcTxHash: proposal.TxHash, + Winner: proposal.Winner.String(), + Status: uint64(proposal.Status), } err = ctx.DB.Create(&dbProposal).Error if err != nil { diff --git a/internal/schema/proposal.go b/internal/schema/proposal.go index f2a2f2e..6e781e6 100644 --- a/internal/schema/proposal.go +++ b/internal/schema/proposal.go @@ -9,15 +9,14 @@ const ( type Proposal struct { Base - ProposalID uint64 `json:"proposal_id"` - StateRootHash string `json:"state_root_hash"` - ProofRootHash string `json:"proof_root_hash"` - StartBatchNum uint64 `json:"start_batch_num"` - EndBatchNum uint64 `json:"end_batch_num"` - BtcCommitTxHash string `json:"btc_commit_tx_hash"` - BtcRevealTxHash string `json:"btc_reveal_tx_hash"` - Winner string `json:"winner"` - Status uint64 `json:"status"` + ProposalID uint64 `json:"proposal_id"` + StateRootHash string `json:"state_root_hash"` + ProofRootHash string `json:"proof_root_hash"` + StartBatchNum uint64 `json:"start_batch_num"` + EndBatchNum uint64 `json:"end_batch_num"` + BtcTxHash string `json:"btc_tx_hash"` + Winner string `json:"winner"` + Status uint64 `json:"status"` } func (Proposal) TableName() string { diff --git a/internal/svc/svc.go b/internal/svc/svc.go index b5d4b5a..bad6814 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -1,17 +1,15 @@ package svc import ( + "github.com/b2network/b2committer/internal/types" "github.com/b2network/b2committer/pkg/b2node" - "time" - "github.com/b2network/b2committer/pkg/log" - - "github.com/b2network/b2committer/internal/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + "time" ) var svc *ServiceContext @@ -41,11 +39,11 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 if err != nil { log.Panicf("[svc]gorm get sqlDB panic: %s\n", err) } - // SetMaxIdleConns 设置空闲连接池中连接的最大数量 + // SetMaxIdleConns sqlDB.SetMaxIdleConns(cfg.MySQLMaxIdleConns) - // SetMaxOpenConns 设置打开数据库连接的最大数量。 + // SetMaxOpenConns sqlDB.SetMaxOpenConns(cfg.MySQLMaxOpenConns) - // SetConnMaxLifetime 设置了连接可复用的最大时间。 + // SetConnMaxLifetime sqlDB.SetConnMaxLifetime(time.Duration(cfg.MySQLConnMaxLifetime) * time.Second) rpc, err := ethclient.Dial(cfg.RPCUrl) diff --git a/internal/types/config.go b/internal/types/config.go index 79bafcd..58a0b0d 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -9,24 +9,26 @@ type Config struct { // debug", "info", "warn", "error", "panic", "fatal" LogLevel string `env:"LOG_LEVEL" envDefault:"info"` // "console","json" - LogFormat string `env:"LOG_FORMAT" envDefault:"console"` - MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` - MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` - MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` - MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` - RPCUrl string `env:"RPC_URL" envDefault:"https://ethereum-goerli-rpc.publicnode.com"` - Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` - InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"10619156"` - InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0x401b2ba6be4133f37485c9af320be4ca88b2972523d7d816b463fb772444de10"` - PolygonZKEVMAddress string `env:"POLYGON_ZKEVM_ADDRESS" envDefault:"0xa997cfD539E703921fD1e3Cf25b4c241a27a4c7A"` - LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` - InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` + LogFormat string `env:"LOG_FORMAT" envDefault:"console"` + PostgresqlDataSource string `env:"POSTGRESQL_DATA_SOURCE" envDefault:"host=localhost port=5433 user=postgres password=postgres dbname=b2_committer sslmode=disable"` + MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` + MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` + MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` + MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` + RPCUrl string `env:"RPC_URL" envDefault:"https://sepolia.drpc.org"` + Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` + InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"5158900"` + InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0xc05e1c7dd54b60c5bc13ad09bad119f49a2fc82cc60215dd7eb9b1d68e147ab0"` + PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xA13Ddb14437A8F34897131367ad3ca78416d6bCa"` + PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0x32d33D5137a7cFFb54c5Bf8371172bcEc5f310ff"` + LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` + InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` } type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512"` - CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x9bb873a9772D2356192C6D299ABcfa1F69F5b3e4"` + CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x12BBD3f7EF1ABEd6B9DB12A3dE77b00aE10618E0"` Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index 9bf2869..6e7cd8b 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -15,7 +15,7 @@ import ( const ( creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" - contractAddress = "0x9bb873a9772D2356192C6D299ABcfa1F69F5b3e4" + contractAddress = "0x12BBD3f7EF1ABEd6B9DB12A3dE77b00aE10618E0" URL = "https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512" chainID = 11155111 ) @@ -143,7 +143,7 @@ func TestSubmitProof(t *testing.T) { tx, err := committer.SubmitProof(&bind.TransactOpts{ From: common.HexToAddress(creatorAddress), Signer: auth.Signer, - }, 1, "proofHash", "stateRoot", 1, 718154) + }, 1, "proofHash", "stateRoot", 1, 53893) require.NoError(t, err) fmt.Println(tx.Hash()) } diff --git a/pkg/contract/sequence.go b/pkg/contract/sequence.go new file mode 100644 index 0000000..67b5fdb --- /dev/null +++ b/pkg/contract/sequence.go @@ -0,0 +1,3078 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// PolygonRollupBaseEtrogBatchData is an auto generated low-level Go binding around an user-defined struct. +type PolygonRollupBaseEtrogBatchData struct { + Transactions []byte + ForcedGlobalExitRoot [32]byte + ForcedTimestamp uint64 + ForcedBlockHashL1 [32]byte +} + +// SequenceMetaData contains all meta data concerning the Sequence contract. +var SequenceMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRootV2\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"_pol\",\"type\":\"address\"},{\"internalType\":\"contractIPolygonZkEVMBridgeV2\",\"name\":\"_bridgeAddress\",\"type\":\"address\"},{\"internalType\":\"contractPolygonRollupManager\",\"name\":\"_rollupManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BatchAlreadyVerified\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BatchNotSequencedOrNotSequenceEnd\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExceedMaxVerifyBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchBelowLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalPendingStateNumInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesAlreadyActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesDecentralized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesNotAllowedOnEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForcedDataDoesNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasTokenNetworkMustBeZeroOnEther\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HaltTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HaltTimeoutNotExpiredAfterEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HugeTokenMetadataNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchAboveLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitSequencedBatchDoesNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializeTransaction\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeBatchTimeTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeForceBatchTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeMultiplierBatchFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxTimestampSequenceInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewPendingStateTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewStateRootNotInsidePrime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewTrustedAggregatorTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughMaticAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughPOLAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldStateRootDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPendingAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyRollupManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyTrustedAggregator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyTrustedSequencer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateNotConsolidable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateTimeoutExceedHaltAggregationTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequenceZeroBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequencedTimestampBelowForcedTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequencedTimestampInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StoredRootMustBeDifferentThanNewRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransactionsLengthAboveMax\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutExceedHaltAggregationTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutNotExpired\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AcceptAdminRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"forceBatchNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastGlobalExitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"}],\"name\":\"ForceBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastGlobalExitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"}],\"name\":\"InitialSequenceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"l1InfoRoot\",\"type\":\"bytes32\"}],\"name\":\"SequenceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceForceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newForceBatchAddress\",\"type\":\"address\"}],\"name\":\"SetForceBatchAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newforceBatchTimeout\",\"type\":\"uint64\"}],\"name\":\"SetForceBatchTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"SetTrustedSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"SetTrustedSequencerURL\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPendingAdmin\",\"type\":\"address\"}],\"name\":\"TransferAdminRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatches\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GLOBAL_EXIT_ROOT_MANAGER_L2\",\"outputs\":[{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_BRIDGE_LIST_LEN_LEN\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_BRIDGE_PARAMS\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_CONSTANT_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_DATA_LEN_EMPTY_METADATA\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIALIZE_TX_EFFECTIVE_PERCENTAGE\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"\",\"type\":\"bytes1\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SIGNATURE_INITIALIZE_TX_R\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SIGNATURE_INITIALIZE_TX_S\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SIGNATURE_INITIALIZE_TX_V\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMESTAMP_RANGE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMBridgeV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"calculatePolPerForceBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"polAmount\",\"type\":\"uint256\"}],\"name\":\"forceBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceBatchAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceBatchTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"forcedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasTokenNetwork\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"networkID\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_gasTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_gasTokenNetwork\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"_gasTokenMetadata\",\"type\":\"bytes\"}],\"name\":\"generateInitializeTransaction\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRootV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkID\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_gasTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"sequencerURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_networkName\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastAccInputHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"onVerifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pol\",\"outputs\":[{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupManager\",\"outputs\":[{\"internalType\":\"contractPolygonRollupManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"forcedGlobalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"forcedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"forcedBlockHashL1\",\"type\":\"bytes32\"}],\"internalType\":\"structPolygonRollupBaseEtrog.BatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"maxSequenceTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initSequencedBatch\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"l2Coinbase\",\"type\":\"address\"}],\"name\":\"sequenceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"forcedGlobalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"forcedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"forcedBlockHashL1\",\"type\":\"bytes32\"}],\"internalType\":\"structPolygonRollupBaseEtrog.BatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"}],\"name\":\"sequenceForceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newForceBatchAddress\",\"type\":\"address\"}],\"name\":\"setForceBatchAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newforceBatchTimeout\",\"type\":\"uint64\"}],\"name\":\"setForceBatchTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"setTrustedSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"setTrustedSequencerURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPendingAdmin\",\"type\":\"address\"}],\"name\":\"transferAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencerURL\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// SequenceABI is the input ABI used to generate the binding from. +// Deprecated: Use SequenceMetaData.ABI instead. +var SequenceABI = SequenceMetaData.ABI + +// Sequence is an auto generated Go binding around an Ethereum contract. +type Sequence struct { + SequenceCaller // Read-only binding to the contract + SequenceTransactor // Write-only binding to the contract + SequenceFilterer // Log filterer for contract events +} + +// SequenceCaller is an auto generated read-only Go binding around an Ethereum contract. +type SequenceCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SequenceTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SequenceTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SequenceFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SequenceFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SequenceSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SequenceSession struct { + Contract *Sequence // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SequenceCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SequenceCallerSession struct { + Contract *SequenceCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SequenceTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SequenceTransactorSession struct { + Contract *SequenceTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SequenceRaw is an auto generated low-level Go binding around an Ethereum contract. +type SequenceRaw struct { + Contract *Sequence // Generic contract binding to access the raw methods on +} + +// SequenceCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SequenceCallerRaw struct { + Contract *SequenceCaller // Generic read-only contract binding to access the raw methods on +} + +// SequenceTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SequenceTransactorRaw struct { + Contract *SequenceTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSequence creates a new instance of Sequence, bound to a specific deployed contract. +func NewSequence(address common.Address, backend bind.ContractBackend) (*Sequence, error) { + contract, err := bindSequence(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Sequence{SequenceCaller: SequenceCaller{contract: contract}, SequenceTransactor: SequenceTransactor{contract: contract}, SequenceFilterer: SequenceFilterer{contract: contract}}, nil +} + +// NewSequenceCaller creates a new read-only instance of Sequence, bound to a specific deployed contract. +func NewSequenceCaller(address common.Address, caller bind.ContractCaller) (*SequenceCaller, error) { + contract, err := bindSequence(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SequenceCaller{contract: contract}, nil +} + +// NewSequenceTransactor creates a new write-only instance of Sequence, bound to a specific deployed contract. +func NewSequenceTransactor(address common.Address, transactor bind.ContractTransactor) (*SequenceTransactor, error) { + contract, err := bindSequence(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SequenceTransactor{contract: contract}, nil +} + +// NewSequenceFilterer creates a new log filterer instance of Sequence, bound to a specific deployed contract. +func NewSequenceFilterer(address common.Address, filterer bind.ContractFilterer) (*SequenceFilterer, error) { + contract, err := bindSequence(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SequenceFilterer{contract: contract}, nil +} + +// bindSequence binds a generic wrapper to an already deployed contract. +func bindSequence(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := SequenceMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Sequence *SequenceRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Sequence.Contract.SequenceCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Sequence *SequenceRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Sequence.Contract.SequenceTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Sequence *SequenceRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Sequence.Contract.SequenceTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Sequence *SequenceCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Sequence.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Sequence *SequenceTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Sequence.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Sequence *SequenceTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Sequence.Contract.contract.Transact(opts, method, params...) +} + +// GLOBALEXITROOTMANAGERL2 is a free data retrieval call binding the contract method 0x9e001877. +// +// Solidity: function GLOBAL_EXIT_ROOT_MANAGER_L2() view returns(address) +func (_Sequence *SequenceCaller) GLOBALEXITROOTMANAGERL2(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "GLOBAL_EXIT_ROOT_MANAGER_L2") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GLOBALEXITROOTMANAGERL2 is a free data retrieval call binding the contract method 0x9e001877. +// +// Solidity: function GLOBAL_EXIT_ROOT_MANAGER_L2() view returns(address) +func (_Sequence *SequenceSession) GLOBALEXITROOTMANAGERL2() (common.Address, error) { + return _Sequence.Contract.GLOBALEXITROOTMANAGERL2(&_Sequence.CallOpts) +} + +// GLOBALEXITROOTMANAGERL2 is a free data retrieval call binding the contract method 0x9e001877. +// +// Solidity: function GLOBAL_EXIT_ROOT_MANAGER_L2() view returns(address) +func (_Sequence *SequenceCallerSession) GLOBALEXITROOTMANAGERL2() (common.Address, error) { + return _Sequence.Contract.GLOBALEXITROOTMANAGERL2(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGELISTLENLEN is a free data retrieval call binding the contract method 0x11e892d4. +// +// Solidity: function INITIALIZE_TX_BRIDGE_LIST_LEN_LEN() view returns(uint8) +func (_Sequence *SequenceCaller) INITIALIZETXBRIDGELISTLENLEN(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// INITIALIZETXBRIDGELISTLENLEN is a free data retrieval call binding the contract method 0x11e892d4. +// +// Solidity: function INITIALIZE_TX_BRIDGE_LIST_LEN_LEN() view returns(uint8) +func (_Sequence *SequenceSession) INITIALIZETXBRIDGELISTLENLEN() (uint8, error) { + return _Sequence.Contract.INITIALIZETXBRIDGELISTLENLEN(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGELISTLENLEN is a free data retrieval call binding the contract method 0x11e892d4. +// +// Solidity: function INITIALIZE_TX_BRIDGE_LIST_LEN_LEN() view returns(uint8) +func (_Sequence *SequenceCallerSession) INITIALIZETXBRIDGELISTLENLEN() (uint8, error) { + return _Sequence.Contract.INITIALIZETXBRIDGELISTLENLEN(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGEPARAMS is a free data retrieval call binding the contract method 0x05835f37. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS() view returns(bytes) +func (_Sequence *SequenceCaller) INITIALIZETXBRIDGEPARAMS(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_BRIDGE_PARAMS") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// INITIALIZETXBRIDGEPARAMS is a free data retrieval call binding the contract method 0x05835f37. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS() view returns(bytes) +func (_Sequence *SequenceSession) INITIALIZETXBRIDGEPARAMS() ([]byte, error) { + return _Sequence.Contract.INITIALIZETXBRIDGEPARAMS(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGEPARAMS is a free data retrieval call binding the contract method 0x05835f37. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS() view returns(bytes) +func (_Sequence *SequenceCallerSession) INITIALIZETXBRIDGEPARAMS() ([]byte, error) { + return _Sequence.Contract.INITIALIZETXBRIDGEPARAMS(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS is a free data retrieval call binding the contract method 0x7a5460c5. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS() view returns(bytes) +func (_Sequence *SequenceCaller) INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS is a free data retrieval call binding the contract method 0x7a5460c5. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS() view returns(bytes) +func (_Sequence *SequenceSession) INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS() ([]byte, error) { + return _Sequence.Contract.INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS is a free data retrieval call binding the contract method 0x7a5460c5. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS() view returns(bytes) +func (_Sequence *SequenceCallerSession) INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS() ([]byte, error) { + return _Sequence.Contract.INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESS(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA is a free data retrieval call binding the contract method 0x52bdeb6d. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA() view returns(bytes) +func (_Sequence *SequenceCaller) INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA is a free data retrieval call binding the contract method 0x52bdeb6d. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA() view returns(bytes) +func (_Sequence *SequenceSession) INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA() ([]byte, error) { + return _Sequence.Contract.INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA(&_Sequence.CallOpts) +} + +// INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA is a free data retrieval call binding the contract method 0x52bdeb6d. +// +// Solidity: function INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA() view returns(bytes) +func (_Sequence *SequenceCallerSession) INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA() ([]byte, error) { + return _Sequence.Contract.INITIALIZETXBRIDGEPARAMSAFTERBRIDGEADDRESSEMPTYMETADATA(&_Sequence.CallOpts) +} + +// INITIALIZETXCONSTANTBYTES is a free data retrieval call binding the contract method 0x03508963. +// +// Solidity: function INITIALIZE_TX_CONSTANT_BYTES() view returns(uint16) +func (_Sequence *SequenceCaller) INITIALIZETXCONSTANTBYTES(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_CONSTANT_BYTES") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// INITIALIZETXCONSTANTBYTES is a free data retrieval call binding the contract method 0x03508963. +// +// Solidity: function INITIALIZE_TX_CONSTANT_BYTES() view returns(uint16) +func (_Sequence *SequenceSession) INITIALIZETXCONSTANTBYTES() (uint16, error) { + return _Sequence.Contract.INITIALIZETXCONSTANTBYTES(&_Sequence.CallOpts) +} + +// INITIALIZETXCONSTANTBYTES is a free data retrieval call binding the contract method 0x03508963. +// +// Solidity: function INITIALIZE_TX_CONSTANT_BYTES() view returns(uint16) +func (_Sequence *SequenceCallerSession) INITIALIZETXCONSTANTBYTES() (uint16, error) { + return _Sequence.Contract.INITIALIZETXCONSTANTBYTES(&_Sequence.CallOpts) +} + +// INITIALIZETXCONSTANTBYTESEMPTYMETADATA is a free data retrieval call binding the contract method 0x676870d2. +// +// Solidity: function INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA() view returns(uint16) +func (_Sequence *SequenceCaller) INITIALIZETXCONSTANTBYTESEMPTYMETADATA(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// INITIALIZETXCONSTANTBYTESEMPTYMETADATA is a free data retrieval call binding the contract method 0x676870d2. +// +// Solidity: function INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA() view returns(uint16) +func (_Sequence *SequenceSession) INITIALIZETXCONSTANTBYTESEMPTYMETADATA() (uint16, error) { + return _Sequence.Contract.INITIALIZETXCONSTANTBYTESEMPTYMETADATA(&_Sequence.CallOpts) +} + +// INITIALIZETXCONSTANTBYTESEMPTYMETADATA is a free data retrieval call binding the contract method 0x676870d2. +// +// Solidity: function INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA() view returns(uint16) +func (_Sequence *SequenceCallerSession) INITIALIZETXCONSTANTBYTESEMPTYMETADATA() (uint16, error) { + return _Sequence.Contract.INITIALIZETXCONSTANTBYTESEMPTYMETADATA(&_Sequence.CallOpts) +} + +// INITIALIZETXDATALENEMPTYMETADATA is a free data retrieval call binding the contract method 0xc7fffd4b. +// +// Solidity: function INITIALIZE_TX_DATA_LEN_EMPTY_METADATA() view returns(uint8) +func (_Sequence *SequenceCaller) INITIALIZETXDATALENEMPTYMETADATA(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// INITIALIZETXDATALENEMPTYMETADATA is a free data retrieval call binding the contract method 0xc7fffd4b. +// +// Solidity: function INITIALIZE_TX_DATA_LEN_EMPTY_METADATA() view returns(uint8) +func (_Sequence *SequenceSession) INITIALIZETXDATALENEMPTYMETADATA() (uint8, error) { + return _Sequence.Contract.INITIALIZETXDATALENEMPTYMETADATA(&_Sequence.CallOpts) +} + +// INITIALIZETXDATALENEMPTYMETADATA is a free data retrieval call binding the contract method 0xc7fffd4b. +// +// Solidity: function INITIALIZE_TX_DATA_LEN_EMPTY_METADATA() view returns(uint8) +func (_Sequence *SequenceCallerSession) INITIALIZETXDATALENEMPTYMETADATA() (uint8, error) { + return _Sequence.Contract.INITIALIZETXDATALENEMPTYMETADATA(&_Sequence.CallOpts) +} + +// INITIALIZETXEFFECTIVEPERCENTAGE is a free data retrieval call binding the contract method 0x40b5de6c. +// +// Solidity: function INITIALIZE_TX_EFFECTIVE_PERCENTAGE() view returns(bytes1) +func (_Sequence *SequenceCaller) INITIALIZETXEFFECTIVEPERCENTAGE(opts *bind.CallOpts) ([1]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "INITIALIZE_TX_EFFECTIVE_PERCENTAGE") + + if err != nil { + return *new([1]byte), err + } + + out0 := *abi.ConvertType(out[0], new([1]byte)).(*[1]byte) + + return out0, err + +} + +// INITIALIZETXEFFECTIVEPERCENTAGE is a free data retrieval call binding the contract method 0x40b5de6c. +// +// Solidity: function INITIALIZE_TX_EFFECTIVE_PERCENTAGE() view returns(bytes1) +func (_Sequence *SequenceSession) INITIALIZETXEFFECTIVEPERCENTAGE() ([1]byte, error) { + return _Sequence.Contract.INITIALIZETXEFFECTIVEPERCENTAGE(&_Sequence.CallOpts) +} + +// INITIALIZETXEFFECTIVEPERCENTAGE is a free data retrieval call binding the contract method 0x40b5de6c. +// +// Solidity: function INITIALIZE_TX_EFFECTIVE_PERCENTAGE() view returns(bytes1) +func (_Sequence *SequenceCallerSession) INITIALIZETXEFFECTIVEPERCENTAGE() ([1]byte, error) { + return _Sequence.Contract.INITIALIZETXEFFECTIVEPERCENTAGE(&_Sequence.CallOpts) +} + +// SIGNATUREINITIALIZETXR is a free data retrieval call binding the contract method 0xb0afe154. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_R() view returns(bytes32) +func (_Sequence *SequenceCaller) SIGNATUREINITIALIZETXR(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "SIGNATURE_INITIALIZE_TX_R") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// SIGNATUREINITIALIZETXR is a free data retrieval call binding the contract method 0xb0afe154. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_R() view returns(bytes32) +func (_Sequence *SequenceSession) SIGNATUREINITIALIZETXR() ([32]byte, error) { + return _Sequence.Contract.SIGNATUREINITIALIZETXR(&_Sequence.CallOpts) +} + +// SIGNATUREINITIALIZETXR is a free data retrieval call binding the contract method 0xb0afe154. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_R() view returns(bytes32) +func (_Sequence *SequenceCallerSession) SIGNATUREINITIALIZETXR() ([32]byte, error) { + return _Sequence.Contract.SIGNATUREINITIALIZETXR(&_Sequence.CallOpts) +} + +// SIGNATUREINITIALIZETXS is a free data retrieval call binding the contract method 0xd7bc90ff. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_S() view returns(bytes32) +func (_Sequence *SequenceCaller) SIGNATUREINITIALIZETXS(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "SIGNATURE_INITIALIZE_TX_S") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// SIGNATUREINITIALIZETXS is a free data retrieval call binding the contract method 0xd7bc90ff. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_S() view returns(bytes32) +func (_Sequence *SequenceSession) SIGNATUREINITIALIZETXS() ([32]byte, error) { + return _Sequence.Contract.SIGNATUREINITIALIZETXS(&_Sequence.CallOpts) +} + +// SIGNATUREINITIALIZETXS is a free data retrieval call binding the contract method 0xd7bc90ff. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_S() view returns(bytes32) +func (_Sequence *SequenceCallerSession) SIGNATUREINITIALIZETXS() ([32]byte, error) { + return _Sequence.Contract.SIGNATUREINITIALIZETXS(&_Sequence.CallOpts) +} + +// SIGNATUREINITIALIZETXV is a free data retrieval call binding the contract method 0xf35dda47. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_V() view returns(uint8) +func (_Sequence *SequenceCaller) SIGNATUREINITIALIZETXV(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "SIGNATURE_INITIALIZE_TX_V") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// SIGNATUREINITIALIZETXV is a free data retrieval call binding the contract method 0xf35dda47. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_V() view returns(uint8) +func (_Sequence *SequenceSession) SIGNATUREINITIALIZETXV() (uint8, error) { + return _Sequence.Contract.SIGNATUREINITIALIZETXV(&_Sequence.CallOpts) +} + +// SIGNATUREINITIALIZETXV is a free data retrieval call binding the contract method 0xf35dda47. +// +// Solidity: function SIGNATURE_INITIALIZE_TX_V() view returns(uint8) +func (_Sequence *SequenceCallerSession) SIGNATUREINITIALIZETXV() (uint8, error) { + return _Sequence.Contract.SIGNATUREINITIALIZETXV(&_Sequence.CallOpts) +} + +// TIMESTAMPRANGE is a free data retrieval call binding the contract method 0x42308fab. +// +// Solidity: function TIMESTAMP_RANGE() view returns(uint256) +func (_Sequence *SequenceCaller) TIMESTAMPRANGE(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "TIMESTAMP_RANGE") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TIMESTAMPRANGE is a free data retrieval call binding the contract method 0x42308fab. +// +// Solidity: function TIMESTAMP_RANGE() view returns(uint256) +func (_Sequence *SequenceSession) TIMESTAMPRANGE() (*big.Int, error) { + return _Sequence.Contract.TIMESTAMPRANGE(&_Sequence.CallOpts) +} + +// TIMESTAMPRANGE is a free data retrieval call binding the contract method 0x42308fab. +// +// Solidity: function TIMESTAMP_RANGE() view returns(uint256) +func (_Sequence *SequenceCallerSession) TIMESTAMPRANGE() (*big.Int, error) { + return _Sequence.Contract.TIMESTAMPRANGE(&_Sequence.CallOpts) +} + +// Admin is a free data retrieval call binding the contract method 0xf851a440. +// +// Solidity: function admin() view returns(address) +func (_Sequence *SequenceCaller) Admin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "admin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Admin is a free data retrieval call binding the contract method 0xf851a440. +// +// Solidity: function admin() view returns(address) +func (_Sequence *SequenceSession) Admin() (common.Address, error) { + return _Sequence.Contract.Admin(&_Sequence.CallOpts) +} + +// Admin is a free data retrieval call binding the contract method 0xf851a440. +// +// Solidity: function admin() view returns(address) +func (_Sequence *SequenceCallerSession) Admin() (common.Address, error) { + return _Sequence.Contract.Admin(&_Sequence.CallOpts) +} + +// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. +// +// Solidity: function bridgeAddress() view returns(address) +func (_Sequence *SequenceCaller) BridgeAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "bridgeAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. +// +// Solidity: function bridgeAddress() view returns(address) +func (_Sequence *SequenceSession) BridgeAddress() (common.Address, error) { + return _Sequence.Contract.BridgeAddress(&_Sequence.CallOpts) +} + +// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. +// +// Solidity: function bridgeAddress() view returns(address) +func (_Sequence *SequenceCallerSession) BridgeAddress() (common.Address, error) { + return _Sequence.Contract.BridgeAddress(&_Sequence.CallOpts) +} + +// CalculatePolPerForceBatch is a free data retrieval call binding the contract method 0x00d0295d. +// +// Solidity: function calculatePolPerForceBatch() view returns(uint256) +func (_Sequence *SequenceCaller) CalculatePolPerForceBatch(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "calculatePolPerForceBatch") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculatePolPerForceBatch is a free data retrieval call binding the contract method 0x00d0295d. +// +// Solidity: function calculatePolPerForceBatch() view returns(uint256) +func (_Sequence *SequenceSession) CalculatePolPerForceBatch() (*big.Int, error) { + return _Sequence.Contract.CalculatePolPerForceBatch(&_Sequence.CallOpts) +} + +// CalculatePolPerForceBatch is a free data retrieval call binding the contract method 0x00d0295d. +// +// Solidity: function calculatePolPerForceBatch() view returns(uint256) +func (_Sequence *SequenceCallerSession) CalculatePolPerForceBatch() (*big.Int, error) { + return _Sequence.Contract.CalculatePolPerForceBatch(&_Sequence.CallOpts) +} + +// ForceBatchAddress is a free data retrieval call binding the contract method 0x2c111c06. +// +// Solidity: function forceBatchAddress() view returns(address) +func (_Sequence *SequenceCaller) ForceBatchAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "forceBatchAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ForceBatchAddress is a free data retrieval call binding the contract method 0x2c111c06. +// +// Solidity: function forceBatchAddress() view returns(address) +func (_Sequence *SequenceSession) ForceBatchAddress() (common.Address, error) { + return _Sequence.Contract.ForceBatchAddress(&_Sequence.CallOpts) +} + +// ForceBatchAddress is a free data retrieval call binding the contract method 0x2c111c06. +// +// Solidity: function forceBatchAddress() view returns(address) +func (_Sequence *SequenceCallerSession) ForceBatchAddress() (common.Address, error) { + return _Sequence.Contract.ForceBatchAddress(&_Sequence.CallOpts) +} + +// ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. +// +// Solidity: function forceBatchTimeout() view returns(uint64) +func (_Sequence *SequenceCaller) ForceBatchTimeout(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "forceBatchTimeout") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. +// +// Solidity: function forceBatchTimeout() view returns(uint64) +func (_Sequence *SequenceSession) ForceBatchTimeout() (uint64, error) { + return _Sequence.Contract.ForceBatchTimeout(&_Sequence.CallOpts) +} + +// ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. +// +// Solidity: function forceBatchTimeout() view returns(uint64) +func (_Sequence *SequenceCallerSession) ForceBatchTimeout() (uint64, error) { + return _Sequence.Contract.ForceBatchTimeout(&_Sequence.CallOpts) +} + +// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. +// +// Solidity: function forcedBatches(uint64 ) view returns(bytes32) +func (_Sequence *SequenceCaller) ForcedBatches(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "forcedBatches", arg0) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. +// +// Solidity: function forcedBatches(uint64 ) view returns(bytes32) +func (_Sequence *SequenceSession) ForcedBatches(arg0 uint64) ([32]byte, error) { + return _Sequence.Contract.ForcedBatches(&_Sequence.CallOpts, arg0) +} + +// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. +// +// Solidity: function forcedBatches(uint64 ) view returns(bytes32) +func (_Sequence *SequenceCallerSession) ForcedBatches(arg0 uint64) ([32]byte, error) { + return _Sequence.Contract.ForcedBatches(&_Sequence.CallOpts, arg0) +} + +// GasTokenAddress is a free data retrieval call binding the contract method 0x3c351e10. +// +// Solidity: function gasTokenAddress() view returns(address) +func (_Sequence *SequenceCaller) GasTokenAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "gasTokenAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GasTokenAddress is a free data retrieval call binding the contract method 0x3c351e10. +// +// Solidity: function gasTokenAddress() view returns(address) +func (_Sequence *SequenceSession) GasTokenAddress() (common.Address, error) { + return _Sequence.Contract.GasTokenAddress(&_Sequence.CallOpts) +} + +// GasTokenAddress is a free data retrieval call binding the contract method 0x3c351e10. +// +// Solidity: function gasTokenAddress() view returns(address) +func (_Sequence *SequenceCallerSession) GasTokenAddress() (common.Address, error) { + return _Sequence.Contract.GasTokenAddress(&_Sequence.CallOpts) +} + +// GasTokenNetwork is a free data retrieval call binding the contract method 0x3cbc795b. +// +// Solidity: function gasTokenNetwork() view returns(uint32) +func (_Sequence *SequenceCaller) GasTokenNetwork(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "gasTokenNetwork") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// GasTokenNetwork is a free data retrieval call binding the contract method 0x3cbc795b. +// +// Solidity: function gasTokenNetwork() view returns(uint32) +func (_Sequence *SequenceSession) GasTokenNetwork() (uint32, error) { + return _Sequence.Contract.GasTokenNetwork(&_Sequence.CallOpts) +} + +// GasTokenNetwork is a free data retrieval call binding the contract method 0x3cbc795b. +// +// Solidity: function gasTokenNetwork() view returns(uint32) +func (_Sequence *SequenceCallerSession) GasTokenNetwork() (uint32, error) { + return _Sequence.Contract.GasTokenNetwork(&_Sequence.CallOpts) +} + +// GenerateInitializeTransaction is a free data retrieval call binding the contract method 0xa652f26c. +// +// Solidity: function generateInitializeTransaction(uint32 networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, bytes _gasTokenMetadata) view returns(bytes) +func (_Sequence *SequenceCaller) GenerateInitializeTransaction(opts *bind.CallOpts, networkID uint32, _gasTokenAddress common.Address, _gasTokenNetwork uint32, _gasTokenMetadata []byte) ([]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "generateInitializeTransaction", networkID, _gasTokenAddress, _gasTokenNetwork, _gasTokenMetadata) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GenerateInitializeTransaction is a free data retrieval call binding the contract method 0xa652f26c. +// +// Solidity: function generateInitializeTransaction(uint32 networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, bytes _gasTokenMetadata) view returns(bytes) +func (_Sequence *SequenceSession) GenerateInitializeTransaction(networkID uint32, _gasTokenAddress common.Address, _gasTokenNetwork uint32, _gasTokenMetadata []byte) ([]byte, error) { + return _Sequence.Contract.GenerateInitializeTransaction(&_Sequence.CallOpts, networkID, _gasTokenAddress, _gasTokenNetwork, _gasTokenMetadata) +} + +// GenerateInitializeTransaction is a free data retrieval call binding the contract method 0xa652f26c. +// +// Solidity: function generateInitializeTransaction(uint32 networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, bytes _gasTokenMetadata) view returns(bytes) +func (_Sequence *SequenceCallerSession) GenerateInitializeTransaction(networkID uint32, _gasTokenAddress common.Address, _gasTokenNetwork uint32, _gasTokenMetadata []byte) ([]byte, error) { + return _Sequence.Contract.GenerateInitializeTransaction(&_Sequence.CallOpts, networkID, _gasTokenAddress, _gasTokenNetwork, _gasTokenMetadata) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Sequence *SequenceCaller) GlobalExitRootManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "globalExitRootManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Sequence *SequenceSession) GlobalExitRootManager() (common.Address, error) { + return _Sequence.Contract.GlobalExitRootManager(&_Sequence.CallOpts) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Sequence *SequenceCallerSession) GlobalExitRootManager() (common.Address, error) { + return _Sequence.Contract.GlobalExitRootManager(&_Sequence.CallOpts) +} + +// LastAccInputHash is a free data retrieval call binding the contract method 0x6e05d2cd. +// +// Solidity: function lastAccInputHash() view returns(bytes32) +func (_Sequence *SequenceCaller) LastAccInputHash(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "lastAccInputHash") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// LastAccInputHash is a free data retrieval call binding the contract method 0x6e05d2cd. +// +// Solidity: function lastAccInputHash() view returns(bytes32) +func (_Sequence *SequenceSession) LastAccInputHash() ([32]byte, error) { + return _Sequence.Contract.LastAccInputHash(&_Sequence.CallOpts) +} + +// LastAccInputHash is a free data retrieval call binding the contract method 0x6e05d2cd. +// +// Solidity: function lastAccInputHash() view returns(bytes32) +func (_Sequence *SequenceCallerSession) LastAccInputHash() ([32]byte, error) { + return _Sequence.Contract.LastAccInputHash(&_Sequence.CallOpts) +} + +// LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. +// +// Solidity: function lastForceBatch() view returns(uint64) +func (_Sequence *SequenceCaller) LastForceBatch(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "lastForceBatch") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. +// +// Solidity: function lastForceBatch() view returns(uint64) +func (_Sequence *SequenceSession) LastForceBatch() (uint64, error) { + return _Sequence.Contract.LastForceBatch(&_Sequence.CallOpts) +} + +// LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. +// +// Solidity: function lastForceBatch() view returns(uint64) +func (_Sequence *SequenceCallerSession) LastForceBatch() (uint64, error) { + return _Sequence.Contract.LastForceBatch(&_Sequence.CallOpts) +} + +// LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. +// +// Solidity: function lastForceBatchSequenced() view returns(uint64) +func (_Sequence *SequenceCaller) LastForceBatchSequenced(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "lastForceBatchSequenced") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. +// +// Solidity: function lastForceBatchSequenced() view returns(uint64) +func (_Sequence *SequenceSession) LastForceBatchSequenced() (uint64, error) { + return _Sequence.Contract.LastForceBatchSequenced(&_Sequence.CallOpts) +} + +// LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. +// +// Solidity: function lastForceBatchSequenced() view returns(uint64) +func (_Sequence *SequenceCallerSession) LastForceBatchSequenced() (uint64, error) { + return _Sequence.Contract.LastForceBatchSequenced(&_Sequence.CallOpts) +} + +// NetworkName is a free data retrieval call binding the contract method 0x107bf28c. +// +// Solidity: function networkName() view returns(string) +func (_Sequence *SequenceCaller) NetworkName(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "networkName") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// NetworkName is a free data retrieval call binding the contract method 0x107bf28c. +// +// Solidity: function networkName() view returns(string) +func (_Sequence *SequenceSession) NetworkName() (string, error) { + return _Sequence.Contract.NetworkName(&_Sequence.CallOpts) +} + +// NetworkName is a free data retrieval call binding the contract method 0x107bf28c. +// +// Solidity: function networkName() view returns(string) +func (_Sequence *SequenceCallerSession) NetworkName() (string, error) { + return _Sequence.Contract.NetworkName(&_Sequence.CallOpts) +} + +// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. +// +// Solidity: function pendingAdmin() view returns(address) +func (_Sequence *SequenceCaller) PendingAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "pendingAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. +// +// Solidity: function pendingAdmin() view returns(address) +func (_Sequence *SequenceSession) PendingAdmin() (common.Address, error) { + return _Sequence.Contract.PendingAdmin(&_Sequence.CallOpts) +} + +// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. +// +// Solidity: function pendingAdmin() view returns(address) +func (_Sequence *SequenceCallerSession) PendingAdmin() (common.Address, error) { + return _Sequence.Contract.PendingAdmin(&_Sequence.CallOpts) +} + +// Pol is a free data retrieval call binding the contract method 0xe46761c4. +// +// Solidity: function pol() view returns(address) +func (_Sequence *SequenceCaller) Pol(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "pol") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Pol is a free data retrieval call binding the contract method 0xe46761c4. +// +// Solidity: function pol() view returns(address) +func (_Sequence *SequenceSession) Pol() (common.Address, error) { + return _Sequence.Contract.Pol(&_Sequence.CallOpts) +} + +// Pol is a free data retrieval call binding the contract method 0xe46761c4. +// +// Solidity: function pol() view returns(address) +func (_Sequence *SequenceCallerSession) Pol() (common.Address, error) { + return _Sequence.Contract.Pol(&_Sequence.CallOpts) +} + +// RollupManager is a free data retrieval call binding the contract method 0x49b7b802. +// +// Solidity: function rollupManager() view returns(address) +func (_Sequence *SequenceCaller) RollupManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "rollupManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// RollupManager is a free data retrieval call binding the contract method 0x49b7b802. +// +// Solidity: function rollupManager() view returns(address) +func (_Sequence *SequenceSession) RollupManager() (common.Address, error) { + return _Sequence.Contract.RollupManager(&_Sequence.CallOpts) +} + +// RollupManager is a free data retrieval call binding the contract method 0x49b7b802. +// +// Solidity: function rollupManager() view returns(address) +func (_Sequence *SequenceCallerSession) RollupManager() (common.Address, error) { + return _Sequence.Contract.RollupManager(&_Sequence.CallOpts) +} + +// TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. +// +// Solidity: function trustedSequencer() view returns(address) +func (_Sequence *SequenceCaller) TrustedSequencer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "trustedSequencer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. +// +// Solidity: function trustedSequencer() view returns(address) +func (_Sequence *SequenceSession) TrustedSequencer() (common.Address, error) { + return _Sequence.Contract.TrustedSequencer(&_Sequence.CallOpts) +} + +// TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. +// +// Solidity: function trustedSequencer() view returns(address) +func (_Sequence *SequenceCallerSession) TrustedSequencer() (common.Address, error) { + return _Sequence.Contract.TrustedSequencer(&_Sequence.CallOpts) +} + +// TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. +// +// Solidity: function trustedSequencerURL() view returns(string) +func (_Sequence *SequenceCaller) TrustedSequencerURL(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Sequence.contract.Call(opts, &out, "trustedSequencerURL") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. +// +// Solidity: function trustedSequencerURL() view returns(string) +func (_Sequence *SequenceSession) TrustedSequencerURL() (string, error) { + return _Sequence.Contract.TrustedSequencerURL(&_Sequence.CallOpts) +} + +// TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. +// +// Solidity: function trustedSequencerURL() view returns(string) +func (_Sequence *SequenceCallerSession) TrustedSequencerURL() (string, error) { + return _Sequence.Contract.TrustedSequencerURL(&_Sequence.CallOpts) +} + +// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. +// +// Solidity: function acceptAdminRole() returns() +func (_Sequence *SequenceTransactor) AcceptAdminRole(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "acceptAdminRole") +} + +// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. +// +// Solidity: function acceptAdminRole() returns() +func (_Sequence *SequenceSession) AcceptAdminRole() (*types.Transaction, error) { + return _Sequence.Contract.AcceptAdminRole(&_Sequence.TransactOpts) +} + +// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. +// +// Solidity: function acceptAdminRole() returns() +func (_Sequence *SequenceTransactorSession) AcceptAdminRole() (*types.Transaction, error) { + return _Sequence.Contract.AcceptAdminRole(&_Sequence.TransactOpts) +} + +// ForceBatch is a paid mutator transaction binding the contract method 0xeaeb077b. +// +// Solidity: function forceBatch(bytes transactions, uint256 polAmount) returns() +func (_Sequence *SequenceTransactor) ForceBatch(opts *bind.TransactOpts, transactions []byte, polAmount *big.Int) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "forceBatch", transactions, polAmount) +} + +// ForceBatch is a paid mutator transaction binding the contract method 0xeaeb077b. +// +// Solidity: function forceBatch(bytes transactions, uint256 polAmount) returns() +func (_Sequence *SequenceSession) ForceBatch(transactions []byte, polAmount *big.Int) (*types.Transaction, error) { + return _Sequence.Contract.ForceBatch(&_Sequence.TransactOpts, transactions, polAmount) +} + +// ForceBatch is a paid mutator transaction binding the contract method 0xeaeb077b. +// +// Solidity: function forceBatch(bytes transactions, uint256 polAmount) returns() +func (_Sequence *SequenceTransactorSession) ForceBatch(transactions []byte, polAmount *big.Int) (*types.Transaction, error) { + return _Sequence.Contract.ForceBatch(&_Sequence.TransactOpts, transactions, polAmount) +} + +// Initialize is a paid mutator transaction binding the contract method 0x71257022. +// +// Solidity: function initialize(address _admin, address sequencer, uint32 networkID, address _gasTokenAddress, string sequencerURL, string _networkName) returns() +func (_Sequence *SequenceTransactor) Initialize(opts *bind.TransactOpts, _admin common.Address, sequencer common.Address, networkID uint32, _gasTokenAddress common.Address, sequencerURL string, _networkName string) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "initialize", _admin, sequencer, networkID, _gasTokenAddress, sequencerURL, _networkName) +} + +// Initialize is a paid mutator transaction binding the contract method 0x71257022. +// +// Solidity: function initialize(address _admin, address sequencer, uint32 networkID, address _gasTokenAddress, string sequencerURL, string _networkName) returns() +func (_Sequence *SequenceSession) Initialize(_admin common.Address, sequencer common.Address, networkID uint32, _gasTokenAddress common.Address, sequencerURL string, _networkName string) (*types.Transaction, error) { + return _Sequence.Contract.Initialize(&_Sequence.TransactOpts, _admin, sequencer, networkID, _gasTokenAddress, sequencerURL, _networkName) +} + +// Initialize is a paid mutator transaction binding the contract method 0x71257022. +// +// Solidity: function initialize(address _admin, address sequencer, uint32 networkID, address _gasTokenAddress, string sequencerURL, string _networkName) returns() +func (_Sequence *SequenceTransactorSession) Initialize(_admin common.Address, sequencer common.Address, networkID uint32, _gasTokenAddress common.Address, sequencerURL string, _networkName string) (*types.Transaction, error) { + return _Sequence.Contract.Initialize(&_Sequence.TransactOpts, _admin, sequencer, networkID, _gasTokenAddress, sequencerURL, _networkName) +} + +// OnVerifyBatches is a paid mutator transaction binding the contract method 0x32c2d153. +// +// Solidity: function onVerifyBatches(uint64 lastVerifiedBatch, bytes32 newStateRoot, address aggregator) returns() +func (_Sequence *SequenceTransactor) OnVerifyBatches(opts *bind.TransactOpts, lastVerifiedBatch uint64, newStateRoot [32]byte, aggregator common.Address) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "onVerifyBatches", lastVerifiedBatch, newStateRoot, aggregator) +} + +// OnVerifyBatches is a paid mutator transaction binding the contract method 0x32c2d153. +// +// Solidity: function onVerifyBatches(uint64 lastVerifiedBatch, bytes32 newStateRoot, address aggregator) returns() +func (_Sequence *SequenceSession) OnVerifyBatches(lastVerifiedBatch uint64, newStateRoot [32]byte, aggregator common.Address) (*types.Transaction, error) { + return _Sequence.Contract.OnVerifyBatches(&_Sequence.TransactOpts, lastVerifiedBatch, newStateRoot, aggregator) +} + +// OnVerifyBatches is a paid mutator transaction binding the contract method 0x32c2d153. +// +// Solidity: function onVerifyBatches(uint64 lastVerifiedBatch, bytes32 newStateRoot, address aggregator) returns() +func (_Sequence *SequenceTransactorSession) OnVerifyBatches(lastVerifiedBatch uint64, newStateRoot [32]byte, aggregator common.Address) (*types.Transaction, error) { + return _Sequence.Contract.OnVerifyBatches(&_Sequence.TransactOpts, lastVerifiedBatch, newStateRoot, aggregator) +} + +// SequenceBatches is a paid mutator transaction binding the contract method 0xdef57e54. +// +// Solidity: function sequenceBatches((bytes,bytes32,uint64,bytes32)[] batches, uint64 maxSequenceTimestamp, uint64 initSequencedBatch, address l2Coinbase) returns() +func (_Sequence *SequenceTransactor) SequenceBatches(opts *bind.TransactOpts, batches []PolygonRollupBaseEtrogBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "sequenceBatches", batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) +} + +// SequenceBatches is a paid mutator transaction binding the contract method 0xdef57e54. +// +// Solidity: function sequenceBatches((bytes,bytes32,uint64,bytes32)[] batches, uint64 maxSequenceTimestamp, uint64 initSequencedBatch, address l2Coinbase) returns() +func (_Sequence *SequenceSession) SequenceBatches(batches []PolygonRollupBaseEtrogBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address) (*types.Transaction, error) { + return _Sequence.Contract.SequenceBatches(&_Sequence.TransactOpts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) +} + +// SequenceBatches is a paid mutator transaction binding the contract method 0xdef57e54. +// +// Solidity: function sequenceBatches((bytes,bytes32,uint64,bytes32)[] batches, uint64 maxSequenceTimestamp, uint64 initSequencedBatch, address l2Coinbase) returns() +func (_Sequence *SequenceTransactorSession) SequenceBatches(batches []PolygonRollupBaseEtrogBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address) (*types.Transaction, error) { + return _Sequence.Contract.SequenceBatches(&_Sequence.TransactOpts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) +} + +// SequenceForceBatches is a paid mutator transaction binding the contract method 0x9f26f840. +// +// Solidity: function sequenceForceBatches((bytes,bytes32,uint64,bytes32)[] batches) returns() +func (_Sequence *SequenceTransactor) SequenceForceBatches(opts *bind.TransactOpts, batches []PolygonRollupBaseEtrogBatchData) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "sequenceForceBatches", batches) +} + +// SequenceForceBatches is a paid mutator transaction binding the contract method 0x9f26f840. +// +// Solidity: function sequenceForceBatches((bytes,bytes32,uint64,bytes32)[] batches) returns() +func (_Sequence *SequenceSession) SequenceForceBatches(batches []PolygonRollupBaseEtrogBatchData) (*types.Transaction, error) { + return _Sequence.Contract.SequenceForceBatches(&_Sequence.TransactOpts, batches) +} + +// SequenceForceBatches is a paid mutator transaction binding the contract method 0x9f26f840. +// +// Solidity: function sequenceForceBatches((bytes,bytes32,uint64,bytes32)[] batches) returns() +func (_Sequence *SequenceTransactorSession) SequenceForceBatches(batches []PolygonRollupBaseEtrogBatchData) (*types.Transaction, error) { + return _Sequence.Contract.SequenceForceBatches(&_Sequence.TransactOpts, batches) +} + +// SetForceBatchAddress is a paid mutator transaction binding the contract method 0x91cafe32. +// +// Solidity: function setForceBatchAddress(address newForceBatchAddress) returns() +func (_Sequence *SequenceTransactor) SetForceBatchAddress(opts *bind.TransactOpts, newForceBatchAddress common.Address) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "setForceBatchAddress", newForceBatchAddress) +} + +// SetForceBatchAddress is a paid mutator transaction binding the contract method 0x91cafe32. +// +// Solidity: function setForceBatchAddress(address newForceBatchAddress) returns() +func (_Sequence *SequenceSession) SetForceBatchAddress(newForceBatchAddress common.Address) (*types.Transaction, error) { + return _Sequence.Contract.SetForceBatchAddress(&_Sequence.TransactOpts, newForceBatchAddress) +} + +// SetForceBatchAddress is a paid mutator transaction binding the contract method 0x91cafe32. +// +// Solidity: function setForceBatchAddress(address newForceBatchAddress) returns() +func (_Sequence *SequenceTransactorSession) SetForceBatchAddress(newForceBatchAddress common.Address) (*types.Transaction, error) { + return _Sequence.Contract.SetForceBatchAddress(&_Sequence.TransactOpts, newForceBatchAddress) +} + +// SetForceBatchTimeout is a paid mutator transaction binding the contract method 0x4e487706. +// +// Solidity: function setForceBatchTimeout(uint64 newforceBatchTimeout) returns() +func (_Sequence *SequenceTransactor) SetForceBatchTimeout(opts *bind.TransactOpts, newforceBatchTimeout uint64) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "setForceBatchTimeout", newforceBatchTimeout) +} + +// SetForceBatchTimeout is a paid mutator transaction binding the contract method 0x4e487706. +// +// Solidity: function setForceBatchTimeout(uint64 newforceBatchTimeout) returns() +func (_Sequence *SequenceSession) SetForceBatchTimeout(newforceBatchTimeout uint64) (*types.Transaction, error) { + return _Sequence.Contract.SetForceBatchTimeout(&_Sequence.TransactOpts, newforceBatchTimeout) +} + +// SetForceBatchTimeout is a paid mutator transaction binding the contract method 0x4e487706. +// +// Solidity: function setForceBatchTimeout(uint64 newforceBatchTimeout) returns() +func (_Sequence *SequenceTransactorSession) SetForceBatchTimeout(newforceBatchTimeout uint64) (*types.Transaction, error) { + return _Sequence.Contract.SetForceBatchTimeout(&_Sequence.TransactOpts, newforceBatchTimeout) +} + +// SetTrustedSequencer is a paid mutator transaction binding the contract method 0x6ff512cc. +// +// Solidity: function setTrustedSequencer(address newTrustedSequencer) returns() +func (_Sequence *SequenceTransactor) SetTrustedSequencer(opts *bind.TransactOpts, newTrustedSequencer common.Address) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "setTrustedSequencer", newTrustedSequencer) +} + +// SetTrustedSequencer is a paid mutator transaction binding the contract method 0x6ff512cc. +// +// Solidity: function setTrustedSequencer(address newTrustedSequencer) returns() +func (_Sequence *SequenceSession) SetTrustedSequencer(newTrustedSequencer common.Address) (*types.Transaction, error) { + return _Sequence.Contract.SetTrustedSequencer(&_Sequence.TransactOpts, newTrustedSequencer) +} + +// SetTrustedSequencer is a paid mutator transaction binding the contract method 0x6ff512cc. +// +// Solidity: function setTrustedSequencer(address newTrustedSequencer) returns() +func (_Sequence *SequenceTransactorSession) SetTrustedSequencer(newTrustedSequencer common.Address) (*types.Transaction, error) { + return _Sequence.Contract.SetTrustedSequencer(&_Sequence.TransactOpts, newTrustedSequencer) +} + +// SetTrustedSequencerURL is a paid mutator transaction binding the contract method 0xc89e42df. +// +// Solidity: function setTrustedSequencerURL(string newTrustedSequencerURL) returns() +func (_Sequence *SequenceTransactor) SetTrustedSequencerURL(opts *bind.TransactOpts, newTrustedSequencerURL string) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "setTrustedSequencerURL", newTrustedSequencerURL) +} + +// SetTrustedSequencerURL is a paid mutator transaction binding the contract method 0xc89e42df. +// +// Solidity: function setTrustedSequencerURL(string newTrustedSequencerURL) returns() +func (_Sequence *SequenceSession) SetTrustedSequencerURL(newTrustedSequencerURL string) (*types.Transaction, error) { + return _Sequence.Contract.SetTrustedSequencerURL(&_Sequence.TransactOpts, newTrustedSequencerURL) +} + +// SetTrustedSequencerURL is a paid mutator transaction binding the contract method 0xc89e42df. +// +// Solidity: function setTrustedSequencerURL(string newTrustedSequencerURL) returns() +func (_Sequence *SequenceTransactorSession) SetTrustedSequencerURL(newTrustedSequencerURL string) (*types.Transaction, error) { + return _Sequence.Contract.SetTrustedSequencerURL(&_Sequence.TransactOpts, newTrustedSequencerURL) +} + +// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. +// +// Solidity: function transferAdminRole(address newPendingAdmin) returns() +func (_Sequence *SequenceTransactor) TransferAdminRole(opts *bind.TransactOpts, newPendingAdmin common.Address) (*types.Transaction, error) { + return _Sequence.contract.Transact(opts, "transferAdminRole", newPendingAdmin) +} + +// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. +// +// Solidity: function transferAdminRole(address newPendingAdmin) returns() +func (_Sequence *SequenceSession) TransferAdminRole(newPendingAdmin common.Address) (*types.Transaction, error) { + return _Sequence.Contract.TransferAdminRole(&_Sequence.TransactOpts, newPendingAdmin) +} + +// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. +// +// Solidity: function transferAdminRole(address newPendingAdmin) returns() +func (_Sequence *SequenceTransactorSession) TransferAdminRole(newPendingAdmin common.Address) (*types.Transaction, error) { + return _Sequence.Contract.TransferAdminRole(&_Sequence.TransactOpts, newPendingAdmin) +} + +// SequenceAcceptAdminRoleIterator is returned from FilterAcceptAdminRole and is used to iterate over the raw logs and unpacked data for AcceptAdminRole events raised by the Sequence contract. +type SequenceAcceptAdminRoleIterator struct { + Event *SequenceAcceptAdminRole // 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 *SequenceAcceptAdminRoleIterator) 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(SequenceAcceptAdminRole) + 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(SequenceAcceptAdminRole) + 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 *SequenceAcceptAdminRoleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceAcceptAdminRoleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceAcceptAdminRole represents a AcceptAdminRole event raised by the Sequence contract. +type SequenceAcceptAdminRole struct { + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAcceptAdminRole is a free log retrieval operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. +// +// Solidity: event AcceptAdminRole(address newAdmin) +func (_Sequence *SequenceFilterer) FilterAcceptAdminRole(opts *bind.FilterOpts) (*SequenceAcceptAdminRoleIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "AcceptAdminRole") + if err != nil { + return nil, err + } + return &SequenceAcceptAdminRoleIterator{contract: _Sequence.contract, event: "AcceptAdminRole", logs: logs, sub: sub}, nil +} + +// WatchAcceptAdminRole is a free log subscription operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. +// +// Solidity: event AcceptAdminRole(address newAdmin) +func (_Sequence *SequenceFilterer) WatchAcceptAdminRole(opts *bind.WatchOpts, sink chan<- *SequenceAcceptAdminRole) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "AcceptAdminRole") + 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(SequenceAcceptAdminRole) + if err := _Sequence.contract.UnpackLog(event, "AcceptAdminRole", 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 +} + +// ParseAcceptAdminRole is a log parse operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. +// +// Solidity: event AcceptAdminRole(address newAdmin) +func (_Sequence *SequenceFilterer) ParseAcceptAdminRole(log types.Log) (*SequenceAcceptAdminRole, error) { + event := new(SequenceAcceptAdminRole) + if err := _Sequence.contract.UnpackLog(event, "AcceptAdminRole", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceForceBatchIterator is returned from FilterForceBatch and is used to iterate over the raw logs and unpacked data for ForceBatch events raised by the Sequence contract. +type SequenceForceBatchIterator struct { + Event *SequenceForceBatch // 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 *SequenceForceBatchIterator) 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(SequenceForceBatch) + 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(SequenceForceBatch) + 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 *SequenceForceBatchIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceForceBatchIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceForceBatch represents a ForceBatch event raised by the Sequence contract. +type SequenceForceBatch struct { + ForceBatchNum uint64 + LastGlobalExitRoot [32]byte + Sequencer common.Address + Transactions []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterForceBatch is a free log retrieval operation binding the contract event 0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931. +// +// Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) +func (_Sequence *SequenceFilterer) FilterForceBatch(opts *bind.FilterOpts, forceBatchNum []uint64) (*SequenceForceBatchIterator, error) { + + var forceBatchNumRule []interface{} + for _, forceBatchNumItem := range forceBatchNum { + forceBatchNumRule = append(forceBatchNumRule, forceBatchNumItem) + } + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "ForceBatch", forceBatchNumRule) + if err != nil { + return nil, err + } + return &SequenceForceBatchIterator{contract: _Sequence.contract, event: "ForceBatch", logs: logs, sub: sub}, nil +} + +// WatchForceBatch is a free log subscription operation binding the contract event 0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931. +// +// Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) +func (_Sequence *SequenceFilterer) WatchForceBatch(opts *bind.WatchOpts, sink chan<- *SequenceForceBatch, forceBatchNum []uint64) (event.Subscription, error) { + + var forceBatchNumRule []interface{} + for _, forceBatchNumItem := range forceBatchNum { + forceBatchNumRule = append(forceBatchNumRule, forceBatchNumItem) + } + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "ForceBatch", forceBatchNumRule) + 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(SequenceForceBatch) + if err := _Sequence.contract.UnpackLog(event, "ForceBatch", 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 +} + +// ParseForceBatch is a log parse operation binding the contract event 0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931. +// +// Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) +func (_Sequence *SequenceFilterer) ParseForceBatch(log types.Log) (*SequenceForceBatch, error) { + event := new(SequenceForceBatch) + if err := _Sequence.contract.UnpackLog(event, "ForceBatch", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceInitialSequenceBatchesIterator is returned from FilterInitialSequenceBatches and is used to iterate over the raw logs and unpacked data for InitialSequenceBatches events raised by the Sequence contract. +type SequenceInitialSequenceBatchesIterator struct { + Event *SequenceInitialSequenceBatches // 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 *SequenceInitialSequenceBatchesIterator) 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(SequenceInitialSequenceBatches) + 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(SequenceInitialSequenceBatches) + 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 *SequenceInitialSequenceBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceInitialSequenceBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceInitialSequenceBatches represents a InitialSequenceBatches event raised by the Sequence contract. +type SequenceInitialSequenceBatches struct { + Transactions []byte + LastGlobalExitRoot [32]byte + Sequencer common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialSequenceBatches is a free log retrieval operation binding the contract event 0x060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f. +// +// Solidity: event InitialSequenceBatches(bytes transactions, bytes32 lastGlobalExitRoot, address sequencer) +func (_Sequence *SequenceFilterer) FilterInitialSequenceBatches(opts *bind.FilterOpts) (*SequenceInitialSequenceBatchesIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "InitialSequenceBatches") + if err != nil { + return nil, err + } + return &SequenceInitialSequenceBatchesIterator{contract: _Sequence.contract, event: "InitialSequenceBatches", logs: logs, sub: sub}, nil +} + +// WatchInitialSequenceBatches is a free log subscription operation binding the contract event 0x060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f. +// +// Solidity: event InitialSequenceBatches(bytes transactions, bytes32 lastGlobalExitRoot, address sequencer) +func (_Sequence *SequenceFilterer) WatchInitialSequenceBatches(opts *bind.WatchOpts, sink chan<- *SequenceInitialSequenceBatches) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "InitialSequenceBatches") + 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(SequenceInitialSequenceBatches) + if err := _Sequence.contract.UnpackLog(event, "InitialSequenceBatches", 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 +} + +// ParseInitialSequenceBatches is a log parse operation binding the contract event 0x060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f. +// +// Solidity: event InitialSequenceBatches(bytes transactions, bytes32 lastGlobalExitRoot, address sequencer) +func (_Sequence *SequenceFilterer) ParseInitialSequenceBatches(log types.Log) (*SequenceInitialSequenceBatches, error) { + event := new(SequenceInitialSequenceBatches) + if err := _Sequence.contract.UnpackLog(event, "InitialSequenceBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Sequence contract. +type SequenceInitializedIterator struct { + Event *SequenceInitialized // 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 *SequenceInitializedIterator) 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(SequenceInitialized) + 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(SequenceInitialized) + 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 *SequenceInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceInitialized represents a Initialized event raised by the Sequence contract. +type SequenceInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Sequence *SequenceFilterer) FilterInitialized(opts *bind.FilterOpts) (*SequenceInitializedIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &SequenceInitializedIterator{contract: _Sequence.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Sequence *SequenceFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *SequenceInitialized) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SequenceInitialized) + if err := _Sequence.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Sequence *SequenceFilterer) ParseInitialized(log types.Log) (*SequenceInitialized, error) { + event := new(SequenceInitialized) + if err := _Sequence.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceSequenceBatchesIterator is returned from FilterSequenceBatches and is used to iterate over the raw logs and unpacked data for SequenceBatches events raised by the Sequence contract. +type SequenceSequenceBatchesIterator struct { + Event *SequenceSequenceBatches // 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 *SequenceSequenceBatchesIterator) 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(SequenceSequenceBatches) + 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(SequenceSequenceBatches) + 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 *SequenceSequenceBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceSequenceBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceSequenceBatches represents a SequenceBatches event raised by the Sequence contract. +type SequenceSequenceBatches struct { + NumBatch uint64 + L1InfoRoot [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSequenceBatches is a free log retrieval operation binding the contract event 0x3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766. +// +// Solidity: event SequenceBatches(uint64 indexed numBatch, bytes32 l1InfoRoot) +func (_Sequence *SequenceFilterer) FilterSequenceBatches(opts *bind.FilterOpts, numBatch []uint64) (*SequenceSequenceBatchesIterator, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "SequenceBatches", numBatchRule) + if err != nil { + return nil, err + } + return &SequenceSequenceBatchesIterator{contract: _Sequence.contract, event: "SequenceBatches", logs: logs, sub: sub}, nil +} + +// WatchSequenceBatches is a free log subscription operation binding the contract event 0x3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766. +// +// Solidity: event SequenceBatches(uint64 indexed numBatch, bytes32 l1InfoRoot) +func (_Sequence *SequenceFilterer) WatchSequenceBatches(opts *bind.WatchOpts, sink chan<- *SequenceSequenceBatches, numBatch []uint64) (event.Subscription, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "SequenceBatches", numBatchRule) + 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(SequenceSequenceBatches) + if err := _Sequence.contract.UnpackLog(event, "SequenceBatches", 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 +} + +// ParseSequenceBatches is a log parse operation binding the contract event 0x3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766. +// +// Solidity: event SequenceBatches(uint64 indexed numBatch, bytes32 l1InfoRoot) +func (_Sequence *SequenceFilterer) ParseSequenceBatches(log types.Log) (*SequenceSequenceBatches, error) { + event := new(SequenceSequenceBatches) + if err := _Sequence.contract.UnpackLog(event, "SequenceBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceSequenceForceBatchesIterator is returned from FilterSequenceForceBatches and is used to iterate over the raw logs and unpacked data for SequenceForceBatches events raised by the Sequence contract. +type SequenceSequenceForceBatchesIterator struct { + Event *SequenceSequenceForceBatches // 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 *SequenceSequenceForceBatchesIterator) 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(SequenceSequenceForceBatches) + 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(SequenceSequenceForceBatches) + 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 *SequenceSequenceForceBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceSequenceForceBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceSequenceForceBatches represents a SequenceForceBatches event raised by the Sequence contract. +type SequenceSequenceForceBatches struct { + NumBatch uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSequenceForceBatches is a free log retrieval operation binding the contract event 0x648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4. +// +// Solidity: event SequenceForceBatches(uint64 indexed numBatch) +func (_Sequence *SequenceFilterer) FilterSequenceForceBatches(opts *bind.FilterOpts, numBatch []uint64) (*SequenceSequenceForceBatchesIterator, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "SequenceForceBatches", numBatchRule) + if err != nil { + return nil, err + } + return &SequenceSequenceForceBatchesIterator{contract: _Sequence.contract, event: "SequenceForceBatches", logs: logs, sub: sub}, nil +} + +// WatchSequenceForceBatches is a free log subscription operation binding the contract event 0x648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4. +// +// Solidity: event SequenceForceBatches(uint64 indexed numBatch) +func (_Sequence *SequenceFilterer) WatchSequenceForceBatches(opts *bind.WatchOpts, sink chan<- *SequenceSequenceForceBatches, numBatch []uint64) (event.Subscription, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "SequenceForceBatches", numBatchRule) + 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(SequenceSequenceForceBatches) + if err := _Sequence.contract.UnpackLog(event, "SequenceForceBatches", 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 +} + +// ParseSequenceForceBatches is a log parse operation binding the contract event 0x648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4. +// +// Solidity: event SequenceForceBatches(uint64 indexed numBatch) +func (_Sequence *SequenceFilterer) ParseSequenceForceBatches(log types.Log) (*SequenceSequenceForceBatches, error) { + event := new(SequenceSequenceForceBatches) + if err := _Sequence.contract.UnpackLog(event, "SequenceForceBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceSetForceBatchAddressIterator is returned from FilterSetForceBatchAddress and is used to iterate over the raw logs and unpacked data for SetForceBatchAddress events raised by the Sequence contract. +type SequenceSetForceBatchAddressIterator struct { + Event *SequenceSetForceBatchAddress // 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 *SequenceSetForceBatchAddressIterator) 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(SequenceSetForceBatchAddress) + 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(SequenceSetForceBatchAddress) + 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 *SequenceSetForceBatchAddressIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceSetForceBatchAddressIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceSetForceBatchAddress represents a SetForceBatchAddress event raised by the Sequence contract. +type SequenceSetForceBatchAddress struct { + NewForceBatchAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetForceBatchAddress is a free log retrieval operation binding the contract event 0x5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb. +// +// Solidity: event SetForceBatchAddress(address newForceBatchAddress) +func (_Sequence *SequenceFilterer) FilterSetForceBatchAddress(opts *bind.FilterOpts) (*SequenceSetForceBatchAddressIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "SetForceBatchAddress") + if err != nil { + return nil, err + } + return &SequenceSetForceBatchAddressIterator{contract: _Sequence.contract, event: "SetForceBatchAddress", logs: logs, sub: sub}, nil +} + +// WatchSetForceBatchAddress is a free log subscription operation binding the contract event 0x5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb. +// +// Solidity: event SetForceBatchAddress(address newForceBatchAddress) +func (_Sequence *SequenceFilterer) WatchSetForceBatchAddress(opts *bind.WatchOpts, sink chan<- *SequenceSetForceBatchAddress) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "SetForceBatchAddress") + 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(SequenceSetForceBatchAddress) + if err := _Sequence.contract.UnpackLog(event, "SetForceBatchAddress", 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 +} + +// ParseSetForceBatchAddress is a log parse operation binding the contract event 0x5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb. +// +// Solidity: event SetForceBatchAddress(address newForceBatchAddress) +func (_Sequence *SequenceFilterer) ParseSetForceBatchAddress(log types.Log) (*SequenceSetForceBatchAddress, error) { + event := new(SequenceSetForceBatchAddress) + if err := _Sequence.contract.UnpackLog(event, "SetForceBatchAddress", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceSetForceBatchTimeoutIterator is returned from FilterSetForceBatchTimeout and is used to iterate over the raw logs and unpacked data for SetForceBatchTimeout events raised by the Sequence contract. +type SequenceSetForceBatchTimeoutIterator struct { + Event *SequenceSetForceBatchTimeout // 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 *SequenceSetForceBatchTimeoutIterator) 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(SequenceSetForceBatchTimeout) + 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(SequenceSetForceBatchTimeout) + 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 *SequenceSetForceBatchTimeoutIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceSetForceBatchTimeoutIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceSetForceBatchTimeout represents a SetForceBatchTimeout event raised by the Sequence contract. +type SequenceSetForceBatchTimeout struct { + NewforceBatchTimeout uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetForceBatchTimeout is a free log retrieval operation binding the contract event 0xa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b. +// +// Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) +func (_Sequence *SequenceFilterer) FilterSetForceBatchTimeout(opts *bind.FilterOpts) (*SequenceSetForceBatchTimeoutIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "SetForceBatchTimeout") + if err != nil { + return nil, err + } + return &SequenceSetForceBatchTimeoutIterator{contract: _Sequence.contract, event: "SetForceBatchTimeout", logs: logs, sub: sub}, nil +} + +// WatchSetForceBatchTimeout is a free log subscription operation binding the contract event 0xa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b. +// +// Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) +func (_Sequence *SequenceFilterer) WatchSetForceBatchTimeout(opts *bind.WatchOpts, sink chan<- *SequenceSetForceBatchTimeout) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "SetForceBatchTimeout") + 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(SequenceSetForceBatchTimeout) + if err := _Sequence.contract.UnpackLog(event, "SetForceBatchTimeout", 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 +} + +// ParseSetForceBatchTimeout is a log parse operation binding the contract event 0xa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b. +// +// Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) +func (_Sequence *SequenceFilterer) ParseSetForceBatchTimeout(log types.Log) (*SequenceSetForceBatchTimeout, error) { + event := new(SequenceSetForceBatchTimeout) + if err := _Sequence.contract.UnpackLog(event, "SetForceBatchTimeout", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceSetTrustedSequencerIterator is returned from FilterSetTrustedSequencer and is used to iterate over the raw logs and unpacked data for SetTrustedSequencer events raised by the Sequence contract. +type SequenceSetTrustedSequencerIterator struct { + Event *SequenceSetTrustedSequencer // 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 *SequenceSetTrustedSequencerIterator) 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(SequenceSetTrustedSequencer) + 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(SequenceSetTrustedSequencer) + 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 *SequenceSetTrustedSequencerIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceSetTrustedSequencerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceSetTrustedSequencer represents a SetTrustedSequencer event raised by the Sequence contract. +type SequenceSetTrustedSequencer struct { + NewTrustedSequencer common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetTrustedSequencer is a free log retrieval operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. +// +// Solidity: event SetTrustedSequencer(address newTrustedSequencer) +func (_Sequence *SequenceFilterer) FilterSetTrustedSequencer(opts *bind.FilterOpts) (*SequenceSetTrustedSequencerIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "SetTrustedSequencer") + if err != nil { + return nil, err + } + return &SequenceSetTrustedSequencerIterator{contract: _Sequence.contract, event: "SetTrustedSequencer", logs: logs, sub: sub}, nil +} + +// WatchSetTrustedSequencer is a free log subscription operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. +// +// Solidity: event SetTrustedSequencer(address newTrustedSequencer) +func (_Sequence *SequenceFilterer) WatchSetTrustedSequencer(opts *bind.WatchOpts, sink chan<- *SequenceSetTrustedSequencer) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "SetTrustedSequencer") + 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(SequenceSetTrustedSequencer) + if err := _Sequence.contract.UnpackLog(event, "SetTrustedSequencer", 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 +} + +// ParseSetTrustedSequencer is a log parse operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. +// +// Solidity: event SetTrustedSequencer(address newTrustedSequencer) +func (_Sequence *SequenceFilterer) ParseSetTrustedSequencer(log types.Log) (*SequenceSetTrustedSequencer, error) { + event := new(SequenceSetTrustedSequencer) + if err := _Sequence.contract.UnpackLog(event, "SetTrustedSequencer", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceSetTrustedSequencerURLIterator is returned from FilterSetTrustedSequencerURL and is used to iterate over the raw logs and unpacked data for SetTrustedSequencerURL events raised by the Sequence contract. +type SequenceSetTrustedSequencerURLIterator struct { + Event *SequenceSetTrustedSequencerURL // 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 *SequenceSetTrustedSequencerURLIterator) 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(SequenceSetTrustedSequencerURL) + 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(SequenceSetTrustedSequencerURL) + 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 *SequenceSetTrustedSequencerURLIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceSetTrustedSequencerURLIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceSetTrustedSequencerURL represents a SetTrustedSequencerURL event raised by the Sequence contract. +type SequenceSetTrustedSequencerURL struct { + NewTrustedSequencerURL string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetTrustedSequencerURL is a free log retrieval operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. +// +// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) +func (_Sequence *SequenceFilterer) FilterSetTrustedSequencerURL(opts *bind.FilterOpts) (*SequenceSetTrustedSequencerURLIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "SetTrustedSequencerURL") + if err != nil { + return nil, err + } + return &SequenceSetTrustedSequencerURLIterator{contract: _Sequence.contract, event: "SetTrustedSequencerURL", logs: logs, sub: sub}, nil +} + +// WatchSetTrustedSequencerURL is a free log subscription operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. +// +// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) +func (_Sequence *SequenceFilterer) WatchSetTrustedSequencerURL(opts *bind.WatchOpts, sink chan<- *SequenceSetTrustedSequencerURL) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "SetTrustedSequencerURL") + 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(SequenceSetTrustedSequencerURL) + if err := _Sequence.contract.UnpackLog(event, "SetTrustedSequencerURL", 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 +} + +// ParseSetTrustedSequencerURL is a log parse operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. +// +// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) +func (_Sequence *SequenceFilterer) ParseSetTrustedSequencerURL(log types.Log) (*SequenceSetTrustedSequencerURL, error) { + event := new(SequenceSetTrustedSequencerURL) + if err := _Sequence.contract.UnpackLog(event, "SetTrustedSequencerURL", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceTransferAdminRoleIterator is returned from FilterTransferAdminRole and is used to iterate over the raw logs and unpacked data for TransferAdminRole events raised by the Sequence contract. +type SequenceTransferAdminRoleIterator struct { + Event *SequenceTransferAdminRole // 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 *SequenceTransferAdminRoleIterator) 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(SequenceTransferAdminRole) + 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(SequenceTransferAdminRole) + 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 *SequenceTransferAdminRoleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceTransferAdminRoleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceTransferAdminRole represents a TransferAdminRole event raised by the Sequence contract. +type SequenceTransferAdminRole struct { + NewPendingAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransferAdminRole is a free log retrieval operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. +// +// Solidity: event TransferAdminRole(address newPendingAdmin) +func (_Sequence *SequenceFilterer) FilterTransferAdminRole(opts *bind.FilterOpts) (*SequenceTransferAdminRoleIterator, error) { + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "TransferAdminRole") + if err != nil { + return nil, err + } + return &SequenceTransferAdminRoleIterator{contract: _Sequence.contract, event: "TransferAdminRole", logs: logs, sub: sub}, nil +} + +// WatchTransferAdminRole is a free log subscription operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. +// +// Solidity: event TransferAdminRole(address newPendingAdmin) +func (_Sequence *SequenceFilterer) WatchTransferAdminRole(opts *bind.WatchOpts, sink chan<- *SequenceTransferAdminRole) (event.Subscription, error) { + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "TransferAdminRole") + 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(SequenceTransferAdminRole) + if err := _Sequence.contract.UnpackLog(event, "TransferAdminRole", 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 +} + +// ParseTransferAdminRole is a log parse operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. +// +// Solidity: event TransferAdminRole(address newPendingAdmin) +func (_Sequence *SequenceFilterer) ParseTransferAdminRole(log types.Log) (*SequenceTransferAdminRole, error) { + event := new(SequenceTransferAdminRole) + if err := _Sequence.contract.UnpackLog(event, "TransferAdminRole", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// SequenceVerifyBatchesIterator is returned from FilterVerifyBatches and is used to iterate over the raw logs and unpacked data for VerifyBatches events raised by the Sequence contract. +type SequenceVerifyBatchesIterator struct { + Event *SequenceVerifyBatches // 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 *SequenceVerifyBatchesIterator) 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(SequenceVerifyBatches) + 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(SequenceVerifyBatches) + 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 *SequenceVerifyBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SequenceVerifyBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SequenceVerifyBatches represents a VerifyBatches event raised by the Sequence contract. +type SequenceVerifyBatches struct { + NumBatch uint64 + StateRoot [32]byte + Aggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVerifyBatches is a free log retrieval operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. +// +// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Sequence *SequenceFilterer) FilterVerifyBatches(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*SequenceVerifyBatchesIterator, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Sequence.contract.FilterLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) + if err != nil { + return nil, err + } + return &SequenceVerifyBatchesIterator{contract: _Sequence.contract, event: "VerifyBatches", logs: logs, sub: sub}, nil +} + +// WatchVerifyBatches is a free log subscription operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. +// +// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Sequence *SequenceFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *SequenceVerifyBatches, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Sequence.contract.WatchLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) + 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(SequenceVerifyBatches) + if err := _Sequence.contract.UnpackLog(event, "VerifyBatches", 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 +} + +// ParseVerifyBatches is a log parse operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. +// +// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Sequence *SequenceFilterer) ParseVerifyBatches(log types.Log) (*SequenceVerifyBatches, error) { + event := new(SequenceVerifyBatches) + if err := _Sequence.contract.UnpackLog(event, "VerifyBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/contract/verify.go b/pkg/contract/verify.go new file mode 100644 index 0000000..b00d541 --- /dev/null +++ b/pkg/contract/verify.go @@ -0,0 +1,5036 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// LegacyZKEVMStateVariablesPendingState is an auto generated low-level Go binding around an user-defined struct. +type LegacyZKEVMStateVariablesPendingState struct { + Timestamp uint64 + LastVerifiedBatch uint64 + ExitRoot [32]byte + StateRoot [32]byte +} + +// LegacyZKEVMStateVariablesSequencedBatchData is an auto generated low-level Go binding around an user-defined struct. +type LegacyZKEVMStateVariablesSequencedBatchData struct { + AccInputHash [32]byte + SequencedTimestamp uint64 + PreviousLastBatchSequenced uint64 +} + +// VerifyMetaData contains all meta data concerning the Verify contract. +var VerifyMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRootV2\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"_pol\",\"type\":\"address\"},{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"_bridgeAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlOnlyCanRenounceRolesForSelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AddressDoNotHaveRequiredRole\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllzkEVMSequencedBatchesMustBeVerified\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BatchFeeOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainIDAlreadyExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExceedMaxVerifyBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchBelowLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalPendingStateNumInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HaltTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitBatchMustMatchCurrentForkID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchAboveLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeBatchTimeTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeMultiplierBatchFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustSequenceSomeBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewPendingStateTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewStateRootNotInsidePrime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewTrustedAggregatorTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldStateRootDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateNotConsolidable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RollupAddressAlreadyExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RollupMustExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RollupTypeDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RollupTypeObsolete\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SenderMustBeRollup\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StoredRootMustBeDifferentThanNewRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpdateNotCompatible\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpdateToSameRollupTypeID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rollupAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"rollupCompatibilityID\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatchBeforeUpgrade\",\"type\":\"uint64\"}],\"name\":\"AddExistingRollup\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupTypeID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consensusImplementation\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"rollupCompatibilityID\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"genesis\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"AddNewRollupType\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"ConsolidatePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rollupTypeID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rollupAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"gasTokenAddress\",\"type\":\"address\"}],\"name\":\"CreateNewRollup\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupTypeID\",\"type\":\"uint32\"}],\"name\":\"ObsoleteRollupType\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastBatchSequenced\",\"type\":\"uint64\"}],\"name\":\"OnSequenceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"OverridePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"storedStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"provedStateRoot\",\"type\":\"bytes32\"}],\"name\":\"ProveNonDeterministicPendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBatchFee\",\"type\":\"uint256\"}],\"name\":\"SetBatchFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"SetMultiplierBatchFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"SetPendingStateTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"SetTrustedAggregator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"SetTrustedAggregatorTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newVerifyBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"SetVerifyBatchTimeTarget\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"newRollupTypeID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatchBeforeUpgrade\",\"type\":\"uint64\"}],\"name\":\"UpdateRollup\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatchesTrustedAggregator\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPolygonRollupBase\",\"name\":\"rollupAddress\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"genesis\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"rollupCompatibilityID\",\"type\":\"uint8\"}],\"name\":\"addExistingRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"consensusImplementation\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"rollupCompatibilityID\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"genesis\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"addNewRollupType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"calculateRewardPerBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"}],\"name\":\"chainIDToRollupID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"consolidatePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupTypeID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"gasTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"sequencerURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"networkName\",\"type\":\"string\"}],\"name\":\"createNewRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBatchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getForcedBatchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"oldStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"}],\"name\":\"getInputSnarkBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"}],\"name\":\"getLastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"batchNum\",\"type\":\"uint64\"}],\"name\":\"getRollupBatchNumToStateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRollupExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"batchNum\",\"type\":\"uint64\"}],\"name\":\"getRollupPendingStateTransitions\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structLegacyZKEVMStateVariables.PendingState\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"batchNum\",\"type\":\"uint64\"}],\"name\":\"getRollupSequencedBatches\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"accInputHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequencedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"previousLastBatchSequenced\",\"type\":\"uint64\"}],\"internalType\":\"structLegacyZKEVMStateVariables.SequencedBatchData\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRootV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"trustedAggregator\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_pendingStateTimeout\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_trustedAggregatorTimeout\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"timelock\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"emergencyCouncil\",\"type\":\"address\"},{\"internalType\":\"contractPolygonZkEVMExistentEtrog\",\"name\":\"polygonZkEVM\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"zkEVMVerifier\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"zkEVMForkID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"zkEVMChainID\",\"type\":\"uint64\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"isPendingStateConsolidable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastAggregationTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastDeactivatedEmergencyStateTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"multiplierBatchFee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupTypeID\",\"type\":\"uint32\"}],\"name\":\"obsoleteRollupType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newSequencedBatches\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newAccInputHash\",\"type\":\"bytes32\"}],\"name\":\"onSequenceBatches\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"overridePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingStateTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pol\",\"outputs\":[{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"proveNonDeterministicPendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rollupAddress\",\"type\":\"address\"}],\"name\":\"rollupAddressToID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"}],\"name\":\"rollupIDToRollupData\",\"outputs\":[{\"internalType\":\"contractIPolygonRollupBase\",\"name\":\"rollupContract\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"lastLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"lastBatchSequenced\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastPendingState\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastPendingStateConsolidated\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatchBeforeUpgrade\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"rollupTypeID\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"rollupCompatibilityID\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupTypeCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupTypeID\",\"type\":\"uint32\"}],\"name\":\"rollupTypeMap\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"consensusImplementation\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"rollupCompatibilityID\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"obsolete\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"genesis\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newBatchFee\",\"type\":\"uint256\"}],\"name\":\"setBatchFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"setMultiplierBatchFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"setPendingStateTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"setTrustedAggregatorTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newVerifyBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"setVerifyBatchTimeTarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSequencedBatches\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalVerifiedBatches\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregatorTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractITransparentUpgradeableProxy\",\"name\":\"rollupContract\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"newRollupTypeID\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"upgradeData\",\"type\":\"bytes\"}],\"name\":\"updateRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyBatchTimeTarget\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"verifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"verifyBatchesTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// VerifyABI is the input ABI used to generate the binding from. +// Deprecated: Use VerifyMetaData.ABI instead. +var VerifyABI = VerifyMetaData.ABI + +// Verify is an auto generated Go binding around an Ethereum contract. +type Verify struct { + VerifyCaller // Read-only binding to the contract + VerifyTransactor // Write-only binding to the contract + VerifyFilterer // Log filterer for contract events +} + +// VerifyCaller is an auto generated read-only Go binding around an Ethereum contract. +type VerifyCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// VerifyTransactor is an auto generated write-only Go binding around an Ethereum contract. +type VerifyTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// VerifyFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type VerifyFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// VerifySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type VerifySession struct { + Contract *Verify // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// VerifyCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type VerifyCallerSession struct { + Contract *VerifyCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// VerifyTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type VerifyTransactorSession struct { + Contract *VerifyTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// VerifyRaw is an auto generated low-level Go binding around an Ethereum contract. +type VerifyRaw struct { + Contract *Verify // Generic contract binding to access the raw methods on +} + +// VerifyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type VerifyCallerRaw struct { + Contract *VerifyCaller // Generic read-only contract binding to access the raw methods on +} + +// VerifyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type VerifyTransactorRaw struct { + Contract *VerifyTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewVerify creates a new instance of Verify, bound to a specific deployed contract. +func NewVerify(address common.Address, backend bind.ContractBackend) (*Verify, error) { + contract, err := bindVerify(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Verify{VerifyCaller: VerifyCaller{contract: contract}, VerifyTransactor: VerifyTransactor{contract: contract}, VerifyFilterer: VerifyFilterer{contract: contract}}, nil +} + +// NewVerifyCaller creates a new read-only instance of Verify, bound to a specific deployed contract. +func NewVerifyCaller(address common.Address, caller bind.ContractCaller) (*VerifyCaller, error) { + contract, err := bindVerify(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &VerifyCaller{contract: contract}, nil +} + +// NewVerifyTransactor creates a new write-only instance of Verify, bound to a specific deployed contract. +func NewVerifyTransactor(address common.Address, transactor bind.ContractTransactor) (*VerifyTransactor, error) { + contract, err := bindVerify(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &VerifyTransactor{contract: contract}, nil +} + +// NewVerifyFilterer creates a new log filterer instance of Verify, bound to a specific deployed contract. +func NewVerifyFilterer(address common.Address, filterer bind.ContractFilterer) (*VerifyFilterer, error) { + contract, err := bindVerify(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &VerifyFilterer{contract: contract}, nil +} + +// bindVerify binds a generic wrapper to an already deployed contract. +func bindVerify(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := VerifyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Verify *VerifyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Verify.Contract.VerifyCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Verify *VerifyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Verify.Contract.VerifyTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Verify *VerifyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Verify.Contract.VerifyTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Verify *VerifyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Verify.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Verify *VerifyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Verify.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Verify *VerifyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Verify.Contract.contract.Transact(opts, method, params...) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Verify *VerifyCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "DEFAULT_ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Verify *VerifySession) DEFAULTADMINROLE() ([32]byte, error) { + return _Verify.Contract.DEFAULTADMINROLE(&_Verify.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Verify *VerifyCallerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Verify.Contract.DEFAULTADMINROLE(&_Verify.CallOpts) +} + +// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. +// +// Solidity: function bridgeAddress() view returns(address) +func (_Verify *VerifyCaller) BridgeAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "bridgeAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. +// +// Solidity: function bridgeAddress() view returns(address) +func (_Verify *VerifySession) BridgeAddress() (common.Address, error) { + return _Verify.Contract.BridgeAddress(&_Verify.CallOpts) +} + +// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. +// +// Solidity: function bridgeAddress() view returns(address) +func (_Verify *VerifyCallerSession) BridgeAddress() (common.Address, error) { + return _Verify.Contract.BridgeAddress(&_Verify.CallOpts) +} + +// CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. +// +// Solidity: function calculateRewardPerBatch() view returns(uint256) +func (_Verify *VerifyCaller) CalculateRewardPerBatch(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "calculateRewardPerBatch") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. +// +// Solidity: function calculateRewardPerBatch() view returns(uint256) +func (_Verify *VerifySession) CalculateRewardPerBatch() (*big.Int, error) { + return _Verify.Contract.CalculateRewardPerBatch(&_Verify.CallOpts) +} + +// CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. +// +// Solidity: function calculateRewardPerBatch() view returns(uint256) +func (_Verify *VerifyCallerSession) CalculateRewardPerBatch() (*big.Int, error) { + return _Verify.Contract.CalculateRewardPerBatch(&_Verify.CallOpts) +} + +// ChainIDToRollupID is a free data retrieval call binding the contract method 0x7fb6e76a. +// +// Solidity: function chainIDToRollupID(uint64 chainID) view returns(uint32 rollupID) +func (_Verify *VerifyCaller) ChainIDToRollupID(opts *bind.CallOpts, chainID uint64) (uint32, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "chainIDToRollupID", chainID) + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ChainIDToRollupID is a free data retrieval call binding the contract method 0x7fb6e76a. +// +// Solidity: function chainIDToRollupID(uint64 chainID) view returns(uint32 rollupID) +func (_Verify *VerifySession) ChainIDToRollupID(chainID uint64) (uint32, error) { + return _Verify.Contract.ChainIDToRollupID(&_Verify.CallOpts, chainID) +} + +// ChainIDToRollupID is a free data retrieval call binding the contract method 0x7fb6e76a. +// +// Solidity: function chainIDToRollupID(uint64 chainID) view returns(uint32 rollupID) +func (_Verify *VerifyCallerSession) ChainIDToRollupID(chainID uint64) (uint32, error) { + return _Verify.Contract.ChainIDToRollupID(&_Verify.CallOpts, chainID) +} + +// GetBatchFee is a free data retrieval call binding the contract method 0x477fa270. +// +// Solidity: function getBatchFee() view returns(uint256) +func (_Verify *VerifyCaller) GetBatchFee(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getBatchFee") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBatchFee is a free data retrieval call binding the contract method 0x477fa270. +// +// Solidity: function getBatchFee() view returns(uint256) +func (_Verify *VerifySession) GetBatchFee() (*big.Int, error) { + return _Verify.Contract.GetBatchFee(&_Verify.CallOpts) +} + +// GetBatchFee is a free data retrieval call binding the contract method 0x477fa270. +// +// Solidity: function getBatchFee() view returns(uint256) +func (_Verify *VerifyCallerSession) GetBatchFee() (*big.Int, error) { + return _Verify.Contract.GetBatchFee(&_Verify.CallOpts) +} + +// GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. +// +// Solidity: function getForcedBatchFee() view returns(uint256) +func (_Verify *VerifyCaller) GetForcedBatchFee(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getForcedBatchFee") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. +// +// Solidity: function getForcedBatchFee() view returns(uint256) +func (_Verify *VerifySession) GetForcedBatchFee() (*big.Int, error) { + return _Verify.Contract.GetForcedBatchFee(&_Verify.CallOpts) +} + +// GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. +// +// Solidity: function getForcedBatchFee() view returns(uint256) +func (_Verify *VerifyCallerSession) GetForcedBatchFee() (*big.Int, error) { + return _Verify.Contract.GetForcedBatchFee(&_Verify.CallOpts) +} + +// GetInputSnarkBytes is a free data retrieval call binding the contract method 0x7975fcfe. +// +// Solidity: function getInputSnarkBytes(uint32 rollupID, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot) view returns(bytes) +func (_Verify *VerifyCaller) GetInputSnarkBytes(opts *bind.CallOpts, rollupID uint32, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getInputSnarkBytes", rollupID, initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetInputSnarkBytes is a free data retrieval call binding the contract method 0x7975fcfe. +// +// Solidity: function getInputSnarkBytes(uint32 rollupID, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot) view returns(bytes) +func (_Verify *VerifySession) GetInputSnarkBytes(rollupID uint32, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { + return _Verify.Contract.GetInputSnarkBytes(&_Verify.CallOpts, rollupID, initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) +} + +// GetInputSnarkBytes is a free data retrieval call binding the contract method 0x7975fcfe. +// +// Solidity: function getInputSnarkBytes(uint32 rollupID, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot) view returns(bytes) +func (_Verify *VerifyCallerSession) GetInputSnarkBytes(rollupID uint32, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { + return _Verify.Contract.GetInputSnarkBytes(&_Verify.CallOpts, rollupID, initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) +} + +// GetLastVerifiedBatch is a free data retrieval call binding the contract method 0x11f6b287. +// +// Solidity: function getLastVerifiedBatch(uint32 rollupID) view returns(uint64) +func (_Verify *VerifyCaller) GetLastVerifiedBatch(opts *bind.CallOpts, rollupID uint32) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getLastVerifiedBatch", rollupID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetLastVerifiedBatch is a free data retrieval call binding the contract method 0x11f6b287. +// +// Solidity: function getLastVerifiedBatch(uint32 rollupID) view returns(uint64) +func (_Verify *VerifySession) GetLastVerifiedBatch(rollupID uint32) (uint64, error) { + return _Verify.Contract.GetLastVerifiedBatch(&_Verify.CallOpts, rollupID) +} + +// GetLastVerifiedBatch is a free data retrieval call binding the contract method 0x11f6b287. +// +// Solidity: function getLastVerifiedBatch(uint32 rollupID) view returns(uint64) +func (_Verify *VerifyCallerSession) GetLastVerifiedBatch(rollupID uint32) (uint64, error) { + return _Verify.Contract.GetLastVerifiedBatch(&_Verify.CallOpts, rollupID) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Verify *VerifyCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getRoleAdmin", role) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Verify *VerifySession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Verify.Contract.GetRoleAdmin(&_Verify.CallOpts, role) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Verify *VerifyCallerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Verify.Contract.GetRoleAdmin(&_Verify.CallOpts, role) +} + +// GetRollupBatchNumToStateRoot is a free data retrieval call binding the contract method 0x55a71ee0. +// +// Solidity: function getRollupBatchNumToStateRoot(uint32 rollupID, uint64 batchNum) view returns(bytes32) +func (_Verify *VerifyCaller) GetRollupBatchNumToStateRoot(opts *bind.CallOpts, rollupID uint32, batchNum uint64) ([32]byte, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getRollupBatchNumToStateRoot", rollupID, batchNum) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRollupBatchNumToStateRoot is a free data retrieval call binding the contract method 0x55a71ee0. +// +// Solidity: function getRollupBatchNumToStateRoot(uint32 rollupID, uint64 batchNum) view returns(bytes32) +func (_Verify *VerifySession) GetRollupBatchNumToStateRoot(rollupID uint32, batchNum uint64) ([32]byte, error) { + return _Verify.Contract.GetRollupBatchNumToStateRoot(&_Verify.CallOpts, rollupID, batchNum) +} + +// GetRollupBatchNumToStateRoot is a free data retrieval call binding the contract method 0x55a71ee0. +// +// Solidity: function getRollupBatchNumToStateRoot(uint32 rollupID, uint64 batchNum) view returns(bytes32) +func (_Verify *VerifyCallerSession) GetRollupBatchNumToStateRoot(rollupID uint32, batchNum uint64) ([32]byte, error) { + return _Verify.Contract.GetRollupBatchNumToStateRoot(&_Verify.CallOpts, rollupID, batchNum) +} + +// GetRollupExitRoot is a free data retrieval call binding the contract method 0xa2967d99. +// +// Solidity: function getRollupExitRoot() view returns(bytes32) +func (_Verify *VerifyCaller) GetRollupExitRoot(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getRollupExitRoot") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRollupExitRoot is a free data retrieval call binding the contract method 0xa2967d99. +// +// Solidity: function getRollupExitRoot() view returns(bytes32) +func (_Verify *VerifySession) GetRollupExitRoot() ([32]byte, error) { + return _Verify.Contract.GetRollupExitRoot(&_Verify.CallOpts) +} + +// GetRollupExitRoot is a free data retrieval call binding the contract method 0xa2967d99. +// +// Solidity: function getRollupExitRoot() view returns(bytes32) +func (_Verify *VerifyCallerSession) GetRollupExitRoot() ([32]byte, error) { + return _Verify.Contract.GetRollupExitRoot(&_Verify.CallOpts) +} + +// GetRollupPendingStateTransitions is a free data retrieval call binding the contract method 0xb99d0ad7. +// +// Solidity: function getRollupPendingStateTransitions(uint32 rollupID, uint64 batchNum) view returns((uint64,uint64,bytes32,bytes32)) +func (_Verify *VerifyCaller) GetRollupPendingStateTransitions(opts *bind.CallOpts, rollupID uint32, batchNum uint64) (LegacyZKEVMStateVariablesPendingState, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getRollupPendingStateTransitions", rollupID, batchNum) + + if err != nil { + return *new(LegacyZKEVMStateVariablesPendingState), err + } + + out0 := *abi.ConvertType(out[0], new(LegacyZKEVMStateVariablesPendingState)).(*LegacyZKEVMStateVariablesPendingState) + + return out0, err + +} + +// GetRollupPendingStateTransitions is a free data retrieval call binding the contract method 0xb99d0ad7. +// +// Solidity: function getRollupPendingStateTransitions(uint32 rollupID, uint64 batchNum) view returns((uint64,uint64,bytes32,bytes32)) +func (_Verify *VerifySession) GetRollupPendingStateTransitions(rollupID uint32, batchNum uint64) (LegacyZKEVMStateVariablesPendingState, error) { + return _Verify.Contract.GetRollupPendingStateTransitions(&_Verify.CallOpts, rollupID, batchNum) +} + +// GetRollupPendingStateTransitions is a free data retrieval call binding the contract method 0xb99d0ad7. +// +// Solidity: function getRollupPendingStateTransitions(uint32 rollupID, uint64 batchNum) view returns((uint64,uint64,bytes32,bytes32)) +func (_Verify *VerifyCallerSession) GetRollupPendingStateTransitions(rollupID uint32, batchNum uint64) (LegacyZKEVMStateVariablesPendingState, error) { + return _Verify.Contract.GetRollupPendingStateTransitions(&_Verify.CallOpts, rollupID, batchNum) +} + +// GetRollupSequencedBatches is a free data retrieval call binding the contract method 0x25280169. +// +// Solidity: function getRollupSequencedBatches(uint32 rollupID, uint64 batchNum) view returns((bytes32,uint64,uint64)) +func (_Verify *VerifyCaller) GetRollupSequencedBatches(opts *bind.CallOpts, rollupID uint32, batchNum uint64) (LegacyZKEVMStateVariablesSequencedBatchData, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "getRollupSequencedBatches", rollupID, batchNum) + + if err != nil { + return *new(LegacyZKEVMStateVariablesSequencedBatchData), err + } + + out0 := *abi.ConvertType(out[0], new(LegacyZKEVMStateVariablesSequencedBatchData)).(*LegacyZKEVMStateVariablesSequencedBatchData) + + return out0, err + +} + +// GetRollupSequencedBatches is a free data retrieval call binding the contract method 0x25280169. +// +// Solidity: function getRollupSequencedBatches(uint32 rollupID, uint64 batchNum) view returns((bytes32,uint64,uint64)) +func (_Verify *VerifySession) GetRollupSequencedBatches(rollupID uint32, batchNum uint64) (LegacyZKEVMStateVariablesSequencedBatchData, error) { + return _Verify.Contract.GetRollupSequencedBatches(&_Verify.CallOpts, rollupID, batchNum) +} + +// GetRollupSequencedBatches is a free data retrieval call binding the contract method 0x25280169. +// +// Solidity: function getRollupSequencedBatches(uint32 rollupID, uint64 batchNum) view returns((bytes32,uint64,uint64)) +func (_Verify *VerifyCallerSession) GetRollupSequencedBatches(rollupID uint32, batchNum uint64) (LegacyZKEVMStateVariablesSequencedBatchData, error) { + return _Verify.Contract.GetRollupSequencedBatches(&_Verify.CallOpts, rollupID, batchNum) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Verify *VerifyCaller) GlobalExitRootManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "globalExitRootManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Verify *VerifySession) GlobalExitRootManager() (common.Address, error) { + return _Verify.Contract.GlobalExitRootManager(&_Verify.CallOpts) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Verify *VerifyCallerSession) GlobalExitRootManager() (common.Address, error) { + return _Verify.Contract.GlobalExitRootManager(&_Verify.CallOpts) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Verify *VerifyCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "hasRole", role, account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Verify *VerifySession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Verify.Contract.HasRole(&_Verify.CallOpts, role, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Verify *VerifyCallerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Verify.Contract.HasRole(&_Verify.CallOpts, role, account) +} + +// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. +// +// Solidity: function isEmergencyState() view returns(bool) +func (_Verify *VerifyCaller) IsEmergencyState(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "isEmergencyState") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. +// +// Solidity: function isEmergencyState() view returns(bool) +func (_Verify *VerifySession) IsEmergencyState() (bool, error) { + return _Verify.Contract.IsEmergencyState(&_Verify.CallOpts) +} + +// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. +// +// Solidity: function isEmergencyState() view returns(bool) +func (_Verify *VerifyCallerSession) IsEmergencyState() (bool, error) { + return _Verify.Contract.IsEmergencyState(&_Verify.CallOpts) +} + +// IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x080b3111. +// +// Solidity: function isPendingStateConsolidable(uint32 rollupID, uint64 pendingStateNum) view returns(bool) +func (_Verify *VerifyCaller) IsPendingStateConsolidable(opts *bind.CallOpts, rollupID uint32, pendingStateNum uint64) (bool, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "isPendingStateConsolidable", rollupID, pendingStateNum) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x080b3111. +// +// Solidity: function isPendingStateConsolidable(uint32 rollupID, uint64 pendingStateNum) view returns(bool) +func (_Verify *VerifySession) IsPendingStateConsolidable(rollupID uint32, pendingStateNum uint64) (bool, error) { + return _Verify.Contract.IsPendingStateConsolidable(&_Verify.CallOpts, rollupID, pendingStateNum) +} + +// IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x080b3111. +// +// Solidity: function isPendingStateConsolidable(uint32 rollupID, uint64 pendingStateNum) view returns(bool) +func (_Verify *VerifyCallerSession) IsPendingStateConsolidable(rollupID uint32, pendingStateNum uint64) (bool, error) { + return _Verify.Contract.IsPendingStateConsolidable(&_Verify.CallOpts, rollupID, pendingStateNum) +} + +// LastAggregationTimestamp is a free data retrieval call binding the contract method 0xc1acbc34. +// +// Solidity: function lastAggregationTimestamp() view returns(uint64) +func (_Verify *VerifyCaller) LastAggregationTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "lastAggregationTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// LastAggregationTimestamp is a free data retrieval call binding the contract method 0xc1acbc34. +// +// Solidity: function lastAggregationTimestamp() view returns(uint64) +func (_Verify *VerifySession) LastAggregationTimestamp() (uint64, error) { + return _Verify.Contract.LastAggregationTimestamp(&_Verify.CallOpts) +} + +// LastAggregationTimestamp is a free data retrieval call binding the contract method 0xc1acbc34. +// +// Solidity: function lastAggregationTimestamp() view returns(uint64) +func (_Verify *VerifyCallerSession) LastAggregationTimestamp() (uint64, error) { + return _Verify.Contract.LastAggregationTimestamp(&_Verify.CallOpts) +} + +// LastDeactivatedEmergencyStateTimestamp is a free data retrieval call binding the contract method 0x30c27dde. +// +// Solidity: function lastDeactivatedEmergencyStateTimestamp() view returns(uint64) +func (_Verify *VerifyCaller) LastDeactivatedEmergencyStateTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "lastDeactivatedEmergencyStateTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// LastDeactivatedEmergencyStateTimestamp is a free data retrieval call binding the contract method 0x30c27dde. +// +// Solidity: function lastDeactivatedEmergencyStateTimestamp() view returns(uint64) +func (_Verify *VerifySession) LastDeactivatedEmergencyStateTimestamp() (uint64, error) { + return _Verify.Contract.LastDeactivatedEmergencyStateTimestamp(&_Verify.CallOpts) +} + +// LastDeactivatedEmergencyStateTimestamp is a free data retrieval call binding the contract method 0x30c27dde. +// +// Solidity: function lastDeactivatedEmergencyStateTimestamp() view returns(uint64) +func (_Verify *VerifyCallerSession) LastDeactivatedEmergencyStateTimestamp() (uint64, error) { + return _Verify.Contract.LastDeactivatedEmergencyStateTimestamp(&_Verify.CallOpts) +} + +// MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. +// +// Solidity: function multiplierBatchFee() view returns(uint16) +func (_Verify *VerifyCaller) MultiplierBatchFee(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "multiplierBatchFee") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. +// +// Solidity: function multiplierBatchFee() view returns(uint16) +func (_Verify *VerifySession) MultiplierBatchFee() (uint16, error) { + return _Verify.Contract.MultiplierBatchFee(&_Verify.CallOpts) +} + +// MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. +// +// Solidity: function multiplierBatchFee() view returns(uint16) +func (_Verify *VerifyCallerSession) MultiplierBatchFee() (uint16, error) { + return _Verify.Contract.MultiplierBatchFee(&_Verify.CallOpts) +} + +// PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. +// +// Solidity: function pendingStateTimeout() view returns(uint64) +func (_Verify *VerifyCaller) PendingStateTimeout(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "pendingStateTimeout") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. +// +// Solidity: function pendingStateTimeout() view returns(uint64) +func (_Verify *VerifySession) PendingStateTimeout() (uint64, error) { + return _Verify.Contract.PendingStateTimeout(&_Verify.CallOpts) +} + +// PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. +// +// Solidity: function pendingStateTimeout() view returns(uint64) +func (_Verify *VerifyCallerSession) PendingStateTimeout() (uint64, error) { + return _Verify.Contract.PendingStateTimeout(&_Verify.CallOpts) +} + +// Pol is a free data retrieval call binding the contract method 0xe46761c4. +// +// Solidity: function pol() view returns(address) +func (_Verify *VerifyCaller) Pol(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "pol") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Pol is a free data retrieval call binding the contract method 0xe46761c4. +// +// Solidity: function pol() view returns(address) +func (_Verify *VerifySession) Pol() (common.Address, error) { + return _Verify.Contract.Pol(&_Verify.CallOpts) +} + +// Pol is a free data retrieval call binding the contract method 0xe46761c4. +// +// Solidity: function pol() view returns(address) +func (_Verify *VerifyCallerSession) Pol() (common.Address, error) { + return _Verify.Contract.Pol(&_Verify.CallOpts) +} + +// RollupAddressToID is a free data retrieval call binding the contract method 0xceee281d. +// +// Solidity: function rollupAddressToID(address rollupAddress) view returns(uint32 rollupID) +func (_Verify *VerifyCaller) RollupAddressToID(opts *bind.CallOpts, rollupAddress common.Address) (uint32, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "rollupAddressToID", rollupAddress) + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// RollupAddressToID is a free data retrieval call binding the contract method 0xceee281d. +// +// Solidity: function rollupAddressToID(address rollupAddress) view returns(uint32 rollupID) +func (_Verify *VerifySession) RollupAddressToID(rollupAddress common.Address) (uint32, error) { + return _Verify.Contract.RollupAddressToID(&_Verify.CallOpts, rollupAddress) +} + +// RollupAddressToID is a free data retrieval call binding the contract method 0xceee281d. +// +// Solidity: function rollupAddressToID(address rollupAddress) view returns(uint32 rollupID) +func (_Verify *VerifyCallerSession) RollupAddressToID(rollupAddress common.Address) (uint32, error) { + return _Verify.Contract.RollupAddressToID(&_Verify.CallOpts, rollupAddress) +} + +// RollupCount is a free data retrieval call binding the contract method 0xf4e92675. +// +// Solidity: function rollupCount() view returns(uint32) +func (_Verify *VerifyCaller) RollupCount(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "rollupCount") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// RollupCount is a free data retrieval call binding the contract method 0xf4e92675. +// +// Solidity: function rollupCount() view returns(uint32) +func (_Verify *VerifySession) RollupCount() (uint32, error) { + return _Verify.Contract.RollupCount(&_Verify.CallOpts) +} + +// RollupCount is a free data retrieval call binding the contract method 0xf4e92675. +// +// Solidity: function rollupCount() view returns(uint32) +func (_Verify *VerifyCallerSession) RollupCount() (uint32, error) { + return _Verify.Contract.RollupCount(&_Verify.CallOpts) +} + +// RollupIDToRollupData is a free data retrieval call binding the contract method 0xf9c4c2ae. +// +// Solidity: function rollupIDToRollupData(uint32 rollupID) view returns(address rollupContract, uint64 chainID, address verifier, uint64 forkID, bytes32 lastLocalExitRoot, uint64 lastBatchSequenced, uint64 lastVerifiedBatch, uint64 lastPendingState, uint64 lastPendingStateConsolidated, uint64 lastVerifiedBatchBeforeUpgrade, uint64 rollupTypeID, uint8 rollupCompatibilityID) +func (_Verify *VerifyCaller) RollupIDToRollupData(opts *bind.CallOpts, rollupID uint32) (struct { + RollupContract common.Address + ChainID uint64 + Verifier common.Address + ForkID uint64 + LastLocalExitRoot [32]byte + LastBatchSequenced uint64 + LastVerifiedBatch uint64 + LastPendingState uint64 + LastPendingStateConsolidated uint64 + LastVerifiedBatchBeforeUpgrade uint64 + RollupTypeID uint64 + RollupCompatibilityID uint8 +}, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "rollupIDToRollupData", rollupID) + + outstruct := new(struct { + RollupContract common.Address + ChainID uint64 + Verifier common.Address + ForkID uint64 + LastLocalExitRoot [32]byte + LastBatchSequenced uint64 + LastVerifiedBatch uint64 + LastPendingState uint64 + LastPendingStateConsolidated uint64 + LastVerifiedBatchBeforeUpgrade uint64 + RollupTypeID uint64 + RollupCompatibilityID uint8 + }) + if err != nil { + return *outstruct, err + } + + outstruct.RollupContract = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.ChainID = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.Verifier = *abi.ConvertType(out[2], new(common.Address)).(*common.Address) + outstruct.ForkID = *abi.ConvertType(out[3], new(uint64)).(*uint64) + outstruct.LastLocalExitRoot = *abi.ConvertType(out[4], new([32]byte)).(*[32]byte) + outstruct.LastBatchSequenced = *abi.ConvertType(out[5], new(uint64)).(*uint64) + outstruct.LastVerifiedBatch = *abi.ConvertType(out[6], new(uint64)).(*uint64) + outstruct.LastPendingState = *abi.ConvertType(out[7], new(uint64)).(*uint64) + outstruct.LastPendingStateConsolidated = *abi.ConvertType(out[8], new(uint64)).(*uint64) + outstruct.LastVerifiedBatchBeforeUpgrade = *abi.ConvertType(out[9], new(uint64)).(*uint64) + outstruct.RollupTypeID = *abi.ConvertType(out[10], new(uint64)).(*uint64) + outstruct.RollupCompatibilityID = *abi.ConvertType(out[11], new(uint8)).(*uint8) + + return *outstruct, err + +} + +// RollupIDToRollupData is a free data retrieval call binding the contract method 0xf9c4c2ae. +// +// Solidity: function rollupIDToRollupData(uint32 rollupID) view returns(address rollupContract, uint64 chainID, address verifier, uint64 forkID, bytes32 lastLocalExitRoot, uint64 lastBatchSequenced, uint64 lastVerifiedBatch, uint64 lastPendingState, uint64 lastPendingStateConsolidated, uint64 lastVerifiedBatchBeforeUpgrade, uint64 rollupTypeID, uint8 rollupCompatibilityID) +func (_Verify *VerifySession) RollupIDToRollupData(rollupID uint32) (struct { + RollupContract common.Address + ChainID uint64 + Verifier common.Address + ForkID uint64 + LastLocalExitRoot [32]byte + LastBatchSequenced uint64 + LastVerifiedBatch uint64 + LastPendingState uint64 + LastPendingStateConsolidated uint64 + LastVerifiedBatchBeforeUpgrade uint64 + RollupTypeID uint64 + RollupCompatibilityID uint8 +}, error) { + return _Verify.Contract.RollupIDToRollupData(&_Verify.CallOpts, rollupID) +} + +// RollupIDToRollupData is a free data retrieval call binding the contract method 0xf9c4c2ae. +// +// Solidity: function rollupIDToRollupData(uint32 rollupID) view returns(address rollupContract, uint64 chainID, address verifier, uint64 forkID, bytes32 lastLocalExitRoot, uint64 lastBatchSequenced, uint64 lastVerifiedBatch, uint64 lastPendingState, uint64 lastPendingStateConsolidated, uint64 lastVerifiedBatchBeforeUpgrade, uint64 rollupTypeID, uint8 rollupCompatibilityID) +func (_Verify *VerifyCallerSession) RollupIDToRollupData(rollupID uint32) (struct { + RollupContract common.Address + ChainID uint64 + Verifier common.Address + ForkID uint64 + LastLocalExitRoot [32]byte + LastBatchSequenced uint64 + LastVerifiedBatch uint64 + LastPendingState uint64 + LastPendingStateConsolidated uint64 + LastVerifiedBatchBeforeUpgrade uint64 + RollupTypeID uint64 + RollupCompatibilityID uint8 +}, error) { + return _Verify.Contract.RollupIDToRollupData(&_Verify.CallOpts, rollupID) +} + +// RollupTypeCount is a free data retrieval call binding the contract method 0x1796a1ae. +// +// Solidity: function rollupTypeCount() view returns(uint32) +func (_Verify *VerifyCaller) RollupTypeCount(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "rollupTypeCount") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// RollupTypeCount is a free data retrieval call binding the contract method 0x1796a1ae. +// +// Solidity: function rollupTypeCount() view returns(uint32) +func (_Verify *VerifySession) RollupTypeCount() (uint32, error) { + return _Verify.Contract.RollupTypeCount(&_Verify.CallOpts) +} + +// RollupTypeCount is a free data retrieval call binding the contract method 0x1796a1ae. +// +// Solidity: function rollupTypeCount() view returns(uint32) +func (_Verify *VerifyCallerSession) RollupTypeCount() (uint32, error) { + return _Verify.Contract.RollupTypeCount(&_Verify.CallOpts) +} + +// RollupTypeMap is a free data retrieval call binding the contract method 0x65c0504d. +// +// Solidity: function rollupTypeMap(uint32 rollupTypeID) view returns(address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bool obsolete, bytes32 genesis) +func (_Verify *VerifyCaller) RollupTypeMap(opts *bind.CallOpts, rollupTypeID uint32) (struct { + ConsensusImplementation common.Address + Verifier common.Address + ForkID uint64 + RollupCompatibilityID uint8 + Obsolete bool + Genesis [32]byte +}, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "rollupTypeMap", rollupTypeID) + + outstruct := new(struct { + ConsensusImplementation common.Address + Verifier common.Address + ForkID uint64 + RollupCompatibilityID uint8 + Obsolete bool + Genesis [32]byte + }) + if err != nil { + return *outstruct, err + } + + outstruct.ConsensusImplementation = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.Verifier = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.ForkID = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.RollupCompatibilityID = *abi.ConvertType(out[3], new(uint8)).(*uint8) + outstruct.Obsolete = *abi.ConvertType(out[4], new(bool)).(*bool) + outstruct.Genesis = *abi.ConvertType(out[5], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +// RollupTypeMap is a free data retrieval call binding the contract method 0x65c0504d. +// +// Solidity: function rollupTypeMap(uint32 rollupTypeID) view returns(address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bool obsolete, bytes32 genesis) +func (_Verify *VerifySession) RollupTypeMap(rollupTypeID uint32) (struct { + ConsensusImplementation common.Address + Verifier common.Address + ForkID uint64 + RollupCompatibilityID uint8 + Obsolete bool + Genesis [32]byte +}, error) { + return _Verify.Contract.RollupTypeMap(&_Verify.CallOpts, rollupTypeID) +} + +// RollupTypeMap is a free data retrieval call binding the contract method 0x65c0504d. +// +// Solidity: function rollupTypeMap(uint32 rollupTypeID) view returns(address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bool obsolete, bytes32 genesis) +func (_Verify *VerifyCallerSession) RollupTypeMap(rollupTypeID uint32) (struct { + ConsensusImplementation common.Address + Verifier common.Address + ForkID uint64 + RollupCompatibilityID uint8 + Obsolete bool + Genesis [32]byte +}, error) { + return _Verify.Contract.RollupTypeMap(&_Verify.CallOpts, rollupTypeID) +} + +// TotalSequencedBatches is a free data retrieval call binding the contract method 0x066ec012. +// +// Solidity: function totalSequencedBatches() view returns(uint64) +func (_Verify *VerifyCaller) TotalSequencedBatches(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "totalSequencedBatches") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// TotalSequencedBatches is a free data retrieval call binding the contract method 0x066ec012. +// +// Solidity: function totalSequencedBatches() view returns(uint64) +func (_Verify *VerifySession) TotalSequencedBatches() (uint64, error) { + return _Verify.Contract.TotalSequencedBatches(&_Verify.CallOpts) +} + +// TotalSequencedBatches is a free data retrieval call binding the contract method 0x066ec012. +// +// Solidity: function totalSequencedBatches() view returns(uint64) +func (_Verify *VerifyCallerSession) TotalSequencedBatches() (uint64, error) { + return _Verify.Contract.TotalSequencedBatches(&_Verify.CallOpts) +} + +// TotalVerifiedBatches is a free data retrieval call binding the contract method 0xdde0ff77. +// +// Solidity: function totalVerifiedBatches() view returns(uint64) +func (_Verify *VerifyCaller) TotalVerifiedBatches(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "totalVerifiedBatches") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// TotalVerifiedBatches is a free data retrieval call binding the contract method 0xdde0ff77. +// +// Solidity: function totalVerifiedBatches() view returns(uint64) +func (_Verify *VerifySession) TotalVerifiedBatches() (uint64, error) { + return _Verify.Contract.TotalVerifiedBatches(&_Verify.CallOpts) +} + +// TotalVerifiedBatches is a free data retrieval call binding the contract method 0xdde0ff77. +// +// Solidity: function totalVerifiedBatches() view returns(uint64) +func (_Verify *VerifyCallerSession) TotalVerifiedBatches() (uint64, error) { + return _Verify.Contract.TotalVerifiedBatches(&_Verify.CallOpts) +} + +// TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. +// +// Solidity: function trustedAggregatorTimeout() view returns(uint64) +func (_Verify *VerifyCaller) TrustedAggregatorTimeout(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "trustedAggregatorTimeout") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. +// +// Solidity: function trustedAggregatorTimeout() view returns(uint64) +func (_Verify *VerifySession) TrustedAggregatorTimeout() (uint64, error) { + return _Verify.Contract.TrustedAggregatorTimeout(&_Verify.CallOpts) +} + +// TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. +// +// Solidity: function trustedAggregatorTimeout() view returns(uint64) +func (_Verify *VerifyCallerSession) TrustedAggregatorTimeout() (uint64, error) { + return _Verify.Contract.TrustedAggregatorTimeout(&_Verify.CallOpts) +} + +// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. +// +// Solidity: function verifyBatchTimeTarget() view returns(uint64) +func (_Verify *VerifyCaller) VerifyBatchTimeTarget(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _Verify.contract.Call(opts, &out, "verifyBatchTimeTarget") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. +// +// Solidity: function verifyBatchTimeTarget() view returns(uint64) +func (_Verify *VerifySession) VerifyBatchTimeTarget() (uint64, error) { + return _Verify.Contract.VerifyBatchTimeTarget(&_Verify.CallOpts) +} + +// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. +// +// Solidity: function verifyBatchTimeTarget() view returns(uint64) +func (_Verify *VerifyCallerSession) VerifyBatchTimeTarget() (uint64, error) { + return _Verify.Contract.VerifyBatchTimeTarget(&_Verify.CallOpts) +} + +// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x2072f6c5. +// +// Solidity: function activateEmergencyState() returns() +func (_Verify *VerifyTransactor) ActivateEmergencyState(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "activateEmergencyState") +} + +// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x2072f6c5. +// +// Solidity: function activateEmergencyState() returns() +func (_Verify *VerifySession) ActivateEmergencyState() (*types.Transaction, error) { + return _Verify.Contract.ActivateEmergencyState(&_Verify.TransactOpts) +} + +// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x2072f6c5. +// +// Solidity: function activateEmergencyState() returns() +func (_Verify *VerifyTransactorSession) ActivateEmergencyState() (*types.Transaction, error) { + return _Verify.Contract.ActivateEmergencyState(&_Verify.TransactOpts) +} + +// AddExistingRollup is a paid mutator transaction binding the contract method 0xe0bfd3d2. +// +// Solidity: function addExistingRollup(address rollupAddress, address verifier, uint64 forkID, uint64 chainID, bytes32 genesis, uint8 rollupCompatibilityID) returns() +func (_Verify *VerifyTransactor) AddExistingRollup(opts *bind.TransactOpts, rollupAddress common.Address, verifier common.Address, forkID uint64, chainID uint64, genesis [32]byte, rollupCompatibilityID uint8) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "addExistingRollup", rollupAddress, verifier, forkID, chainID, genesis, rollupCompatibilityID) +} + +// AddExistingRollup is a paid mutator transaction binding the contract method 0xe0bfd3d2. +// +// Solidity: function addExistingRollup(address rollupAddress, address verifier, uint64 forkID, uint64 chainID, bytes32 genesis, uint8 rollupCompatibilityID) returns() +func (_Verify *VerifySession) AddExistingRollup(rollupAddress common.Address, verifier common.Address, forkID uint64, chainID uint64, genesis [32]byte, rollupCompatibilityID uint8) (*types.Transaction, error) { + return _Verify.Contract.AddExistingRollup(&_Verify.TransactOpts, rollupAddress, verifier, forkID, chainID, genesis, rollupCompatibilityID) +} + +// AddExistingRollup is a paid mutator transaction binding the contract method 0xe0bfd3d2. +// +// Solidity: function addExistingRollup(address rollupAddress, address verifier, uint64 forkID, uint64 chainID, bytes32 genesis, uint8 rollupCompatibilityID) returns() +func (_Verify *VerifyTransactorSession) AddExistingRollup(rollupAddress common.Address, verifier common.Address, forkID uint64, chainID uint64, genesis [32]byte, rollupCompatibilityID uint8) (*types.Transaction, error) { + return _Verify.Contract.AddExistingRollup(&_Verify.TransactOpts, rollupAddress, verifier, forkID, chainID, genesis, rollupCompatibilityID) +} + +// AddNewRollupType is a paid mutator transaction binding the contract method 0xf34eb8eb. +// +// Solidity: function addNewRollupType(address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bytes32 genesis, string description) returns() +func (_Verify *VerifyTransactor) AddNewRollupType(opts *bind.TransactOpts, consensusImplementation common.Address, verifier common.Address, forkID uint64, rollupCompatibilityID uint8, genesis [32]byte, description string) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "addNewRollupType", consensusImplementation, verifier, forkID, rollupCompatibilityID, genesis, description) +} + +// AddNewRollupType is a paid mutator transaction binding the contract method 0xf34eb8eb. +// +// Solidity: function addNewRollupType(address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bytes32 genesis, string description) returns() +func (_Verify *VerifySession) AddNewRollupType(consensusImplementation common.Address, verifier common.Address, forkID uint64, rollupCompatibilityID uint8, genesis [32]byte, description string) (*types.Transaction, error) { + return _Verify.Contract.AddNewRollupType(&_Verify.TransactOpts, consensusImplementation, verifier, forkID, rollupCompatibilityID, genesis, description) +} + +// AddNewRollupType is a paid mutator transaction binding the contract method 0xf34eb8eb. +// +// Solidity: function addNewRollupType(address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bytes32 genesis, string description) returns() +func (_Verify *VerifyTransactorSession) AddNewRollupType(consensusImplementation common.Address, verifier common.Address, forkID uint64, rollupCompatibilityID uint8, genesis [32]byte, description string) (*types.Transaction, error) { + return _Verify.Contract.AddNewRollupType(&_Verify.TransactOpts, consensusImplementation, verifier, forkID, rollupCompatibilityID, genesis, description) +} + +// ConsolidatePendingState is a paid mutator transaction binding the contract method 0x1608859c. +// +// Solidity: function consolidatePendingState(uint32 rollupID, uint64 pendingStateNum) returns() +func (_Verify *VerifyTransactor) ConsolidatePendingState(opts *bind.TransactOpts, rollupID uint32, pendingStateNum uint64) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "consolidatePendingState", rollupID, pendingStateNum) +} + +// ConsolidatePendingState is a paid mutator transaction binding the contract method 0x1608859c. +// +// Solidity: function consolidatePendingState(uint32 rollupID, uint64 pendingStateNum) returns() +func (_Verify *VerifySession) ConsolidatePendingState(rollupID uint32, pendingStateNum uint64) (*types.Transaction, error) { + return _Verify.Contract.ConsolidatePendingState(&_Verify.TransactOpts, rollupID, pendingStateNum) +} + +// ConsolidatePendingState is a paid mutator transaction binding the contract method 0x1608859c. +// +// Solidity: function consolidatePendingState(uint32 rollupID, uint64 pendingStateNum) returns() +func (_Verify *VerifyTransactorSession) ConsolidatePendingState(rollupID uint32, pendingStateNum uint64) (*types.Transaction, error) { + return _Verify.Contract.ConsolidatePendingState(&_Verify.TransactOpts, rollupID, pendingStateNum) +} + +// CreateNewRollup is a paid mutator transaction binding the contract method 0x727885e9. +// +// Solidity: function createNewRollup(uint32 rollupTypeID, uint64 chainID, address admin, address sequencer, address gasTokenAddress, string sequencerURL, string networkName) returns() +func (_Verify *VerifyTransactor) CreateNewRollup(opts *bind.TransactOpts, rollupTypeID uint32, chainID uint64, admin common.Address, sequencer common.Address, gasTokenAddress common.Address, sequencerURL string, networkName string) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "createNewRollup", rollupTypeID, chainID, admin, sequencer, gasTokenAddress, sequencerURL, networkName) +} + +// CreateNewRollup is a paid mutator transaction binding the contract method 0x727885e9. +// +// Solidity: function createNewRollup(uint32 rollupTypeID, uint64 chainID, address admin, address sequencer, address gasTokenAddress, string sequencerURL, string networkName) returns() +func (_Verify *VerifySession) CreateNewRollup(rollupTypeID uint32, chainID uint64, admin common.Address, sequencer common.Address, gasTokenAddress common.Address, sequencerURL string, networkName string) (*types.Transaction, error) { + return _Verify.Contract.CreateNewRollup(&_Verify.TransactOpts, rollupTypeID, chainID, admin, sequencer, gasTokenAddress, sequencerURL, networkName) +} + +// CreateNewRollup is a paid mutator transaction binding the contract method 0x727885e9. +// +// Solidity: function createNewRollup(uint32 rollupTypeID, uint64 chainID, address admin, address sequencer, address gasTokenAddress, string sequencerURL, string networkName) returns() +func (_Verify *VerifyTransactorSession) CreateNewRollup(rollupTypeID uint32, chainID uint64, admin common.Address, sequencer common.Address, gasTokenAddress common.Address, sequencerURL string, networkName string) (*types.Transaction, error) { + return _Verify.Contract.CreateNewRollup(&_Verify.TransactOpts, rollupTypeID, chainID, admin, sequencer, gasTokenAddress, sequencerURL, networkName) +} + +// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. +// +// Solidity: function deactivateEmergencyState() returns() +func (_Verify *VerifyTransactor) DeactivateEmergencyState(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "deactivateEmergencyState") +} + +// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. +// +// Solidity: function deactivateEmergencyState() returns() +func (_Verify *VerifySession) DeactivateEmergencyState() (*types.Transaction, error) { + return _Verify.Contract.DeactivateEmergencyState(&_Verify.TransactOpts) +} + +// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. +// +// Solidity: function deactivateEmergencyState() returns() +func (_Verify *VerifyTransactorSession) DeactivateEmergencyState() (*types.Transaction, error) { + return _Verify.Contract.DeactivateEmergencyState(&_Verify.TransactOpts) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Verify *VerifyTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "grantRole", role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Verify *VerifySession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.Contract.GrantRole(&_Verify.TransactOpts, role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Verify *VerifyTransactorSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.Contract.GrantRole(&_Verify.TransactOpts, role, account) +} + +// Initialize is a paid mutator transaction binding the contract method 0x0645af09. +// +// Solidity: function initialize(address trustedAggregator, uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, address timelock, address emergencyCouncil, address polygonZkEVM, address zkEVMVerifier, uint64 zkEVMForkID, uint64 zkEVMChainID) returns() +func (_Verify *VerifyTransactor) Initialize(opts *bind.TransactOpts, trustedAggregator common.Address, _pendingStateTimeout uint64, _trustedAggregatorTimeout uint64, admin common.Address, timelock common.Address, emergencyCouncil common.Address, polygonZkEVM common.Address, zkEVMVerifier common.Address, zkEVMForkID uint64, zkEVMChainID uint64) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "initialize", trustedAggregator, _pendingStateTimeout, _trustedAggregatorTimeout, admin, timelock, emergencyCouncil, polygonZkEVM, zkEVMVerifier, zkEVMForkID, zkEVMChainID) +} + +// Initialize is a paid mutator transaction binding the contract method 0x0645af09. +// +// Solidity: function initialize(address trustedAggregator, uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, address timelock, address emergencyCouncil, address polygonZkEVM, address zkEVMVerifier, uint64 zkEVMForkID, uint64 zkEVMChainID) returns() +func (_Verify *VerifySession) Initialize(trustedAggregator common.Address, _pendingStateTimeout uint64, _trustedAggregatorTimeout uint64, admin common.Address, timelock common.Address, emergencyCouncil common.Address, polygonZkEVM common.Address, zkEVMVerifier common.Address, zkEVMForkID uint64, zkEVMChainID uint64) (*types.Transaction, error) { + return _Verify.Contract.Initialize(&_Verify.TransactOpts, trustedAggregator, _pendingStateTimeout, _trustedAggregatorTimeout, admin, timelock, emergencyCouncil, polygonZkEVM, zkEVMVerifier, zkEVMForkID, zkEVMChainID) +} + +// Initialize is a paid mutator transaction binding the contract method 0x0645af09. +// +// Solidity: function initialize(address trustedAggregator, uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, address timelock, address emergencyCouncil, address polygonZkEVM, address zkEVMVerifier, uint64 zkEVMForkID, uint64 zkEVMChainID) returns() +func (_Verify *VerifyTransactorSession) Initialize(trustedAggregator common.Address, _pendingStateTimeout uint64, _trustedAggregatorTimeout uint64, admin common.Address, timelock common.Address, emergencyCouncil common.Address, polygonZkEVM common.Address, zkEVMVerifier common.Address, zkEVMForkID uint64, zkEVMChainID uint64) (*types.Transaction, error) { + return _Verify.Contract.Initialize(&_Verify.TransactOpts, trustedAggregator, _pendingStateTimeout, _trustedAggregatorTimeout, admin, timelock, emergencyCouncil, polygonZkEVM, zkEVMVerifier, zkEVMForkID, zkEVMChainID) +} + +// ObsoleteRollupType is a paid mutator transaction binding the contract method 0x7222020f. +// +// Solidity: function obsoleteRollupType(uint32 rollupTypeID) returns() +func (_Verify *VerifyTransactor) ObsoleteRollupType(opts *bind.TransactOpts, rollupTypeID uint32) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "obsoleteRollupType", rollupTypeID) +} + +// ObsoleteRollupType is a paid mutator transaction binding the contract method 0x7222020f. +// +// Solidity: function obsoleteRollupType(uint32 rollupTypeID) returns() +func (_Verify *VerifySession) ObsoleteRollupType(rollupTypeID uint32) (*types.Transaction, error) { + return _Verify.Contract.ObsoleteRollupType(&_Verify.TransactOpts, rollupTypeID) +} + +// ObsoleteRollupType is a paid mutator transaction binding the contract method 0x7222020f. +// +// Solidity: function obsoleteRollupType(uint32 rollupTypeID) returns() +func (_Verify *VerifyTransactorSession) ObsoleteRollupType(rollupTypeID uint32) (*types.Transaction, error) { + return _Verify.Contract.ObsoleteRollupType(&_Verify.TransactOpts, rollupTypeID) +} + +// OnSequenceBatches is a paid mutator transaction binding the contract method 0x9a908e73. +// +// Solidity: function onSequenceBatches(uint64 newSequencedBatches, bytes32 newAccInputHash) returns(uint64) +func (_Verify *VerifyTransactor) OnSequenceBatches(opts *bind.TransactOpts, newSequencedBatches uint64, newAccInputHash [32]byte) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "onSequenceBatches", newSequencedBatches, newAccInputHash) +} + +// OnSequenceBatches is a paid mutator transaction binding the contract method 0x9a908e73. +// +// Solidity: function onSequenceBatches(uint64 newSequencedBatches, bytes32 newAccInputHash) returns(uint64) +func (_Verify *VerifySession) OnSequenceBatches(newSequencedBatches uint64, newAccInputHash [32]byte) (*types.Transaction, error) { + return _Verify.Contract.OnSequenceBatches(&_Verify.TransactOpts, newSequencedBatches, newAccInputHash) +} + +// OnSequenceBatches is a paid mutator transaction binding the contract method 0x9a908e73. +// +// Solidity: function onSequenceBatches(uint64 newSequencedBatches, bytes32 newAccInputHash) returns(uint64) +func (_Verify *VerifyTransactorSession) OnSequenceBatches(newSequencedBatches uint64, newAccInputHash [32]byte) (*types.Transaction, error) { + return _Verify.Contract.OnSequenceBatches(&_Verify.TransactOpts, newSequencedBatches, newAccInputHash) +} + +// OverridePendingState is a paid mutator transaction binding the contract method 0x12b86e19. +// +// Solidity: function overridePendingState(uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() +func (_Verify *VerifyTransactor) OverridePendingState(opts *bind.TransactOpts, rollupID uint32, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "overridePendingState", rollupID, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) +} + +// OverridePendingState is a paid mutator transaction binding the contract method 0x12b86e19. +// +// Solidity: function overridePendingState(uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() +func (_Verify *VerifySession) OverridePendingState(rollupID uint32, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.OverridePendingState(&_Verify.TransactOpts, rollupID, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) +} + +// OverridePendingState is a paid mutator transaction binding the contract method 0x12b86e19. +// +// Solidity: function overridePendingState(uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() +func (_Verify *VerifyTransactorSession) OverridePendingState(rollupID uint32, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.OverridePendingState(&_Verify.TransactOpts, rollupID, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) +} + +// ProveNonDeterministicPendingState is a paid mutator transaction binding the contract method 0x8bd4f071. +// +// Solidity: function proveNonDeterministicPendingState(uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() +func (_Verify *VerifyTransactor) ProveNonDeterministicPendingState(opts *bind.TransactOpts, rollupID uint32, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "proveNonDeterministicPendingState", rollupID, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) +} + +// ProveNonDeterministicPendingState is a paid mutator transaction binding the contract method 0x8bd4f071. +// +// Solidity: function proveNonDeterministicPendingState(uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() +func (_Verify *VerifySession) ProveNonDeterministicPendingState(rollupID uint32, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.ProveNonDeterministicPendingState(&_Verify.TransactOpts, rollupID, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) +} + +// ProveNonDeterministicPendingState is a paid mutator transaction binding the contract method 0x8bd4f071. +// +// Solidity: function proveNonDeterministicPendingState(uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() +func (_Verify *VerifyTransactorSession) ProveNonDeterministicPendingState(rollupID uint32, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.ProveNonDeterministicPendingState(&_Verify.TransactOpts, rollupID, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address account) returns() +func (_Verify *VerifyTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "renounceRole", role, account) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address account) returns() +func (_Verify *VerifySession) RenounceRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.Contract.RenounceRole(&_Verify.TransactOpts, role, account) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address account) returns() +func (_Verify *VerifyTransactorSession) RenounceRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.Contract.RenounceRole(&_Verify.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Verify *VerifyTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "revokeRole", role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Verify *VerifySession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.Contract.RevokeRole(&_Verify.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Verify *VerifyTransactorSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Verify.Contract.RevokeRole(&_Verify.TransactOpts, role, account) +} + +// SetBatchFee is a paid mutator transaction binding the contract method 0xd5073f6f. +// +// Solidity: function setBatchFee(uint256 newBatchFee) returns() +func (_Verify *VerifyTransactor) SetBatchFee(opts *bind.TransactOpts, newBatchFee *big.Int) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "setBatchFee", newBatchFee) +} + +// SetBatchFee is a paid mutator transaction binding the contract method 0xd5073f6f. +// +// Solidity: function setBatchFee(uint256 newBatchFee) returns() +func (_Verify *VerifySession) SetBatchFee(newBatchFee *big.Int) (*types.Transaction, error) { + return _Verify.Contract.SetBatchFee(&_Verify.TransactOpts, newBatchFee) +} + +// SetBatchFee is a paid mutator transaction binding the contract method 0xd5073f6f. +// +// Solidity: function setBatchFee(uint256 newBatchFee) returns() +func (_Verify *VerifyTransactorSession) SetBatchFee(newBatchFee *big.Int) (*types.Transaction, error) { + return _Verify.Contract.SetBatchFee(&_Verify.TransactOpts, newBatchFee) +} + +// SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. +// +// Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() +func (_Verify *VerifyTransactor) SetMultiplierBatchFee(opts *bind.TransactOpts, newMultiplierBatchFee uint16) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "setMultiplierBatchFee", newMultiplierBatchFee) +} + +// SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. +// +// Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() +func (_Verify *VerifySession) SetMultiplierBatchFee(newMultiplierBatchFee uint16) (*types.Transaction, error) { + return _Verify.Contract.SetMultiplierBatchFee(&_Verify.TransactOpts, newMultiplierBatchFee) +} + +// SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. +// +// Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() +func (_Verify *VerifyTransactorSession) SetMultiplierBatchFee(newMultiplierBatchFee uint16) (*types.Transaction, error) { + return _Verify.Contract.SetMultiplierBatchFee(&_Verify.TransactOpts, newMultiplierBatchFee) +} + +// SetPendingStateTimeout is a paid mutator transaction binding the contract method 0x9c9f3dfe. +// +// Solidity: function setPendingStateTimeout(uint64 newPendingStateTimeout) returns() +func (_Verify *VerifyTransactor) SetPendingStateTimeout(opts *bind.TransactOpts, newPendingStateTimeout uint64) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "setPendingStateTimeout", newPendingStateTimeout) +} + +// SetPendingStateTimeout is a paid mutator transaction binding the contract method 0x9c9f3dfe. +// +// Solidity: function setPendingStateTimeout(uint64 newPendingStateTimeout) returns() +func (_Verify *VerifySession) SetPendingStateTimeout(newPendingStateTimeout uint64) (*types.Transaction, error) { + return _Verify.Contract.SetPendingStateTimeout(&_Verify.TransactOpts, newPendingStateTimeout) +} + +// SetPendingStateTimeout is a paid mutator transaction binding the contract method 0x9c9f3dfe. +// +// Solidity: function setPendingStateTimeout(uint64 newPendingStateTimeout) returns() +func (_Verify *VerifyTransactorSession) SetPendingStateTimeout(newPendingStateTimeout uint64) (*types.Transaction, error) { + return _Verify.Contract.SetPendingStateTimeout(&_Verify.TransactOpts, newPendingStateTimeout) +} + +// SetTrustedAggregatorTimeout is a paid mutator transaction binding the contract method 0x394218e9. +// +// Solidity: function setTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) returns() +func (_Verify *VerifyTransactor) SetTrustedAggregatorTimeout(opts *bind.TransactOpts, newTrustedAggregatorTimeout uint64) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "setTrustedAggregatorTimeout", newTrustedAggregatorTimeout) +} + +// SetTrustedAggregatorTimeout is a paid mutator transaction binding the contract method 0x394218e9. +// +// Solidity: function setTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) returns() +func (_Verify *VerifySession) SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout uint64) (*types.Transaction, error) { + return _Verify.Contract.SetTrustedAggregatorTimeout(&_Verify.TransactOpts, newTrustedAggregatorTimeout) +} + +// SetTrustedAggregatorTimeout is a paid mutator transaction binding the contract method 0x394218e9. +// +// Solidity: function setTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) returns() +func (_Verify *VerifyTransactorSession) SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout uint64) (*types.Transaction, error) { + return _Verify.Contract.SetTrustedAggregatorTimeout(&_Verify.TransactOpts, newTrustedAggregatorTimeout) +} + +// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. +// +// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() +func (_Verify *VerifyTransactor) SetVerifyBatchTimeTarget(opts *bind.TransactOpts, newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "setVerifyBatchTimeTarget", newVerifyBatchTimeTarget) +} + +// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. +// +// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() +func (_Verify *VerifySession) SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { + return _Verify.Contract.SetVerifyBatchTimeTarget(&_Verify.TransactOpts, newVerifyBatchTimeTarget) +} + +// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. +// +// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() +func (_Verify *VerifyTransactorSession) SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { + return _Verify.Contract.SetVerifyBatchTimeTarget(&_Verify.TransactOpts, newVerifyBatchTimeTarget) +} + +// UpdateRollup is a paid mutator transaction binding the contract method 0xc4c928c2. +// +// Solidity: function updateRollup(address rollupContract, uint32 newRollupTypeID, bytes upgradeData) returns() +func (_Verify *VerifyTransactor) UpdateRollup(opts *bind.TransactOpts, rollupContract common.Address, newRollupTypeID uint32, upgradeData []byte) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "updateRollup", rollupContract, newRollupTypeID, upgradeData) +} + +// UpdateRollup is a paid mutator transaction binding the contract method 0xc4c928c2. +// +// Solidity: function updateRollup(address rollupContract, uint32 newRollupTypeID, bytes upgradeData) returns() +func (_Verify *VerifySession) UpdateRollup(rollupContract common.Address, newRollupTypeID uint32, upgradeData []byte) (*types.Transaction, error) { + return _Verify.Contract.UpdateRollup(&_Verify.TransactOpts, rollupContract, newRollupTypeID, upgradeData) +} + +// UpdateRollup is a paid mutator transaction binding the contract method 0xc4c928c2. +// +// Solidity: function updateRollup(address rollupContract, uint32 newRollupTypeID, bytes upgradeData) returns() +func (_Verify *VerifyTransactorSession) UpdateRollup(rollupContract common.Address, newRollupTypeID uint32, upgradeData []byte) (*types.Transaction, error) { + return _Verify.Contract.UpdateRollup(&_Verify.TransactOpts, rollupContract, newRollupTypeID, upgradeData) +} + +// VerifyBatches is a paid mutator transaction binding the contract method 0x87c20c01. +// +// Solidity: function verifyBatches(uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, address beneficiary, bytes32[24] proof) returns() +func (_Verify *VerifyTransactor) VerifyBatches(opts *bind.TransactOpts, rollupID uint32, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, beneficiary common.Address, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "verifyBatches", rollupID, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, beneficiary, proof) +} + +// VerifyBatches is a paid mutator transaction binding the contract method 0x87c20c01. +// +// Solidity: function verifyBatches(uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, address beneficiary, bytes32[24] proof) returns() +func (_Verify *VerifySession) VerifyBatches(rollupID uint32, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, beneficiary common.Address, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.VerifyBatches(&_Verify.TransactOpts, rollupID, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, beneficiary, proof) +} + +// VerifyBatches is a paid mutator transaction binding the contract method 0x87c20c01. +// +// Solidity: function verifyBatches(uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, address beneficiary, bytes32[24] proof) returns() +func (_Verify *VerifyTransactorSession) VerifyBatches(rollupID uint32, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, beneficiary common.Address, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.VerifyBatches(&_Verify.TransactOpts, rollupID, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, beneficiary, proof) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x1489ed10. +// +// Solidity: function verifyBatchesTrustedAggregator(uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, address beneficiary, bytes32[24] proof) returns() +func (_Verify *VerifyTransactor) VerifyBatchesTrustedAggregator(opts *bind.TransactOpts, rollupID uint32, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, beneficiary common.Address, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.contract.Transact(opts, "verifyBatchesTrustedAggregator", rollupID, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, beneficiary, proof) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x1489ed10. +// +// Solidity: function verifyBatchesTrustedAggregator(uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, address beneficiary, bytes32[24] proof) returns() +func (_Verify *VerifySession) VerifyBatchesTrustedAggregator(rollupID uint32, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, beneficiary common.Address, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.VerifyBatchesTrustedAggregator(&_Verify.TransactOpts, rollupID, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, beneficiary, proof) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x1489ed10. +// +// Solidity: function verifyBatchesTrustedAggregator(uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, address beneficiary, bytes32[24] proof) returns() +func (_Verify *VerifyTransactorSession) VerifyBatchesTrustedAggregator(rollupID uint32, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, beneficiary common.Address, proof [24][32]byte) (*types.Transaction, error) { + return _Verify.Contract.VerifyBatchesTrustedAggregator(&_Verify.TransactOpts, rollupID, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, beneficiary, proof) +} + +// VerifyAddExistingRollupIterator is returned from FilterAddExistingRollup and is used to iterate over the raw logs and unpacked data for AddExistingRollup events raised by the Verify contract. +type VerifyAddExistingRollupIterator struct { + Event *VerifyAddExistingRollup // 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 *VerifyAddExistingRollupIterator) 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(VerifyAddExistingRollup) + 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(VerifyAddExistingRollup) + 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 *VerifyAddExistingRollupIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyAddExistingRollupIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyAddExistingRollup represents a AddExistingRollup event raised by the Verify contract. +type VerifyAddExistingRollup struct { + RollupID uint32 + ForkID uint64 + RollupAddress common.Address + ChainID uint64 + RollupCompatibilityID uint8 + LastVerifiedBatchBeforeUpgrade uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAddExistingRollup is a free log retrieval operation binding the contract event 0xadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850. +// +// Solidity: event AddExistingRollup(uint32 indexed rollupID, uint64 forkID, address rollupAddress, uint64 chainID, uint8 rollupCompatibilityID, uint64 lastVerifiedBatchBeforeUpgrade) +func (_Verify *VerifyFilterer) FilterAddExistingRollup(opts *bind.FilterOpts, rollupID []uint32) (*VerifyAddExistingRollupIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "AddExistingRollup", rollupIDRule) + if err != nil { + return nil, err + } + return &VerifyAddExistingRollupIterator{contract: _Verify.contract, event: "AddExistingRollup", logs: logs, sub: sub}, nil +} + +// WatchAddExistingRollup is a free log subscription operation binding the contract event 0xadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850. +// +// Solidity: event AddExistingRollup(uint32 indexed rollupID, uint64 forkID, address rollupAddress, uint64 chainID, uint8 rollupCompatibilityID, uint64 lastVerifiedBatchBeforeUpgrade) +func (_Verify *VerifyFilterer) WatchAddExistingRollup(opts *bind.WatchOpts, sink chan<- *VerifyAddExistingRollup, rollupID []uint32) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "AddExistingRollup", rollupIDRule) + 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(VerifyAddExistingRollup) + if err := _Verify.contract.UnpackLog(event, "AddExistingRollup", 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 +} + +// ParseAddExistingRollup is a log parse operation binding the contract event 0xadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850. +// +// Solidity: event AddExistingRollup(uint32 indexed rollupID, uint64 forkID, address rollupAddress, uint64 chainID, uint8 rollupCompatibilityID, uint64 lastVerifiedBatchBeforeUpgrade) +func (_Verify *VerifyFilterer) ParseAddExistingRollup(log types.Log) (*VerifyAddExistingRollup, error) { + event := new(VerifyAddExistingRollup) + if err := _Verify.contract.UnpackLog(event, "AddExistingRollup", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyAddNewRollupTypeIterator is returned from FilterAddNewRollupType and is used to iterate over the raw logs and unpacked data for AddNewRollupType events raised by the Verify contract. +type VerifyAddNewRollupTypeIterator struct { + Event *VerifyAddNewRollupType // 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 *VerifyAddNewRollupTypeIterator) 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(VerifyAddNewRollupType) + 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(VerifyAddNewRollupType) + 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 *VerifyAddNewRollupTypeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyAddNewRollupTypeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyAddNewRollupType represents a AddNewRollupType event raised by the Verify contract. +type VerifyAddNewRollupType struct { + RollupTypeID uint32 + ConsensusImplementation common.Address + Verifier common.Address + ForkID uint64 + RollupCompatibilityID uint8 + Genesis [32]byte + Description string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAddNewRollupType is a free log retrieval operation binding the contract event 0xa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52. +// +// Solidity: event AddNewRollupType(uint32 indexed rollupTypeID, address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bytes32 genesis, string description) +func (_Verify *VerifyFilterer) FilterAddNewRollupType(opts *bind.FilterOpts, rollupTypeID []uint32) (*VerifyAddNewRollupTypeIterator, error) { + + var rollupTypeIDRule []interface{} + for _, rollupTypeIDItem := range rollupTypeID { + rollupTypeIDRule = append(rollupTypeIDRule, rollupTypeIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "AddNewRollupType", rollupTypeIDRule) + if err != nil { + return nil, err + } + return &VerifyAddNewRollupTypeIterator{contract: _Verify.contract, event: "AddNewRollupType", logs: logs, sub: sub}, nil +} + +// WatchAddNewRollupType is a free log subscription operation binding the contract event 0xa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52. +// +// Solidity: event AddNewRollupType(uint32 indexed rollupTypeID, address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bytes32 genesis, string description) +func (_Verify *VerifyFilterer) WatchAddNewRollupType(opts *bind.WatchOpts, sink chan<- *VerifyAddNewRollupType, rollupTypeID []uint32) (event.Subscription, error) { + + var rollupTypeIDRule []interface{} + for _, rollupTypeIDItem := range rollupTypeID { + rollupTypeIDRule = append(rollupTypeIDRule, rollupTypeIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "AddNewRollupType", rollupTypeIDRule) + 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(VerifyAddNewRollupType) + if err := _Verify.contract.UnpackLog(event, "AddNewRollupType", 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 +} + +// ParseAddNewRollupType is a log parse operation binding the contract event 0xa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52. +// +// Solidity: event AddNewRollupType(uint32 indexed rollupTypeID, address consensusImplementation, address verifier, uint64 forkID, uint8 rollupCompatibilityID, bytes32 genesis, string description) +func (_Verify *VerifyFilterer) ParseAddNewRollupType(log types.Log) (*VerifyAddNewRollupType, error) { + event := new(VerifyAddNewRollupType) + if err := _Verify.contract.UnpackLog(event, "AddNewRollupType", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyConsolidatePendingStateIterator is returned from FilterConsolidatePendingState and is used to iterate over the raw logs and unpacked data for ConsolidatePendingState events raised by the Verify contract. +type VerifyConsolidatePendingStateIterator struct { + Event *VerifyConsolidatePendingState // 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 *VerifyConsolidatePendingStateIterator) 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(VerifyConsolidatePendingState) + 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(VerifyConsolidatePendingState) + 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 *VerifyConsolidatePendingStateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyConsolidatePendingStateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyConsolidatePendingState represents a ConsolidatePendingState event raised by the Verify contract. +type VerifyConsolidatePendingState struct { + RollupID uint32 + NumBatch uint64 + StateRoot [32]byte + ExitRoot [32]byte + PendingStateNum uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConsolidatePendingState is a free log retrieval operation binding the contract event 0x581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b. +// +// Solidity: event ConsolidatePendingState(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, uint64 pendingStateNum) +func (_Verify *VerifyFilterer) FilterConsolidatePendingState(opts *bind.FilterOpts, rollupID []uint32) (*VerifyConsolidatePendingStateIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "ConsolidatePendingState", rollupIDRule) + if err != nil { + return nil, err + } + return &VerifyConsolidatePendingStateIterator{contract: _Verify.contract, event: "ConsolidatePendingState", logs: logs, sub: sub}, nil +} + +// WatchConsolidatePendingState is a free log subscription operation binding the contract event 0x581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b. +// +// Solidity: event ConsolidatePendingState(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, uint64 pendingStateNum) +func (_Verify *VerifyFilterer) WatchConsolidatePendingState(opts *bind.WatchOpts, sink chan<- *VerifyConsolidatePendingState, rollupID []uint32) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "ConsolidatePendingState", rollupIDRule) + 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(VerifyConsolidatePendingState) + if err := _Verify.contract.UnpackLog(event, "ConsolidatePendingState", 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 +} + +// ParseConsolidatePendingState is a log parse operation binding the contract event 0x581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b. +// +// Solidity: event ConsolidatePendingState(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, uint64 pendingStateNum) +func (_Verify *VerifyFilterer) ParseConsolidatePendingState(log types.Log) (*VerifyConsolidatePendingState, error) { + event := new(VerifyConsolidatePendingState) + if err := _Verify.contract.UnpackLog(event, "ConsolidatePendingState", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyCreateNewRollupIterator is returned from FilterCreateNewRollup and is used to iterate over the raw logs and unpacked data for CreateNewRollup events raised by the Verify contract. +type VerifyCreateNewRollupIterator struct { + Event *VerifyCreateNewRollup // 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 *VerifyCreateNewRollupIterator) 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(VerifyCreateNewRollup) + 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(VerifyCreateNewRollup) + 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 *VerifyCreateNewRollupIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyCreateNewRollupIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyCreateNewRollup represents a CreateNewRollup event raised by the Verify contract. +type VerifyCreateNewRollup struct { + RollupID uint32 + RollupTypeID uint32 + RollupAddress common.Address + ChainID uint64 + GasTokenAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCreateNewRollup is a free log retrieval operation binding the contract event 0x194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a641. +// +// Solidity: event CreateNewRollup(uint32 indexed rollupID, uint32 rollupTypeID, address rollupAddress, uint64 chainID, address gasTokenAddress) +func (_Verify *VerifyFilterer) FilterCreateNewRollup(opts *bind.FilterOpts, rollupID []uint32) (*VerifyCreateNewRollupIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "CreateNewRollup", rollupIDRule) + if err != nil { + return nil, err + } + return &VerifyCreateNewRollupIterator{contract: _Verify.contract, event: "CreateNewRollup", logs: logs, sub: sub}, nil +} + +// WatchCreateNewRollup is a free log subscription operation binding the contract event 0x194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a641. +// +// Solidity: event CreateNewRollup(uint32 indexed rollupID, uint32 rollupTypeID, address rollupAddress, uint64 chainID, address gasTokenAddress) +func (_Verify *VerifyFilterer) WatchCreateNewRollup(opts *bind.WatchOpts, sink chan<- *VerifyCreateNewRollup, rollupID []uint32) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "CreateNewRollup", rollupIDRule) + 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(VerifyCreateNewRollup) + if err := _Verify.contract.UnpackLog(event, "CreateNewRollup", 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 +} + +// ParseCreateNewRollup is a log parse operation binding the contract event 0x194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a641. +// +// Solidity: event CreateNewRollup(uint32 indexed rollupID, uint32 rollupTypeID, address rollupAddress, uint64 chainID, address gasTokenAddress) +func (_Verify *VerifyFilterer) ParseCreateNewRollup(log types.Log) (*VerifyCreateNewRollup, error) { + event := new(VerifyCreateNewRollup) + if err := _Verify.contract.UnpackLog(event, "CreateNewRollup", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyEmergencyStateActivatedIterator is returned from FilterEmergencyStateActivated and is used to iterate over the raw logs and unpacked data for EmergencyStateActivated events raised by the Verify contract. +type VerifyEmergencyStateActivatedIterator struct { + Event *VerifyEmergencyStateActivated // 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 *VerifyEmergencyStateActivatedIterator) 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(VerifyEmergencyStateActivated) + 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(VerifyEmergencyStateActivated) + 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 *VerifyEmergencyStateActivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyEmergencyStateActivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyEmergencyStateActivated represents a EmergencyStateActivated event raised by the Verify contract. +type VerifyEmergencyStateActivated struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEmergencyStateActivated is a free log retrieval operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. +// +// Solidity: event EmergencyStateActivated() +func (_Verify *VerifyFilterer) FilterEmergencyStateActivated(opts *bind.FilterOpts) (*VerifyEmergencyStateActivatedIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "EmergencyStateActivated") + if err != nil { + return nil, err + } + return &VerifyEmergencyStateActivatedIterator{contract: _Verify.contract, event: "EmergencyStateActivated", logs: logs, sub: sub}, nil +} + +// WatchEmergencyStateActivated is a free log subscription operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. +// +// Solidity: event EmergencyStateActivated() +func (_Verify *VerifyFilterer) WatchEmergencyStateActivated(opts *bind.WatchOpts, sink chan<- *VerifyEmergencyStateActivated) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "EmergencyStateActivated") + 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(VerifyEmergencyStateActivated) + if err := _Verify.contract.UnpackLog(event, "EmergencyStateActivated", 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 +} + +// ParseEmergencyStateActivated is a log parse operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. +// +// Solidity: event EmergencyStateActivated() +func (_Verify *VerifyFilterer) ParseEmergencyStateActivated(log types.Log) (*VerifyEmergencyStateActivated, error) { + event := new(VerifyEmergencyStateActivated) + if err := _Verify.contract.UnpackLog(event, "EmergencyStateActivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyEmergencyStateDeactivatedIterator is returned from FilterEmergencyStateDeactivated and is used to iterate over the raw logs and unpacked data for EmergencyStateDeactivated events raised by the Verify contract. +type VerifyEmergencyStateDeactivatedIterator struct { + Event *VerifyEmergencyStateDeactivated // 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 *VerifyEmergencyStateDeactivatedIterator) 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(VerifyEmergencyStateDeactivated) + 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(VerifyEmergencyStateDeactivated) + 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 *VerifyEmergencyStateDeactivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyEmergencyStateDeactivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyEmergencyStateDeactivated represents a EmergencyStateDeactivated event raised by the Verify contract. +type VerifyEmergencyStateDeactivated struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEmergencyStateDeactivated is a free log retrieval operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. +// +// Solidity: event EmergencyStateDeactivated() +func (_Verify *VerifyFilterer) FilterEmergencyStateDeactivated(opts *bind.FilterOpts) (*VerifyEmergencyStateDeactivatedIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "EmergencyStateDeactivated") + if err != nil { + return nil, err + } + return &VerifyEmergencyStateDeactivatedIterator{contract: _Verify.contract, event: "EmergencyStateDeactivated", logs: logs, sub: sub}, nil +} + +// WatchEmergencyStateDeactivated is a free log subscription operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. +// +// Solidity: event EmergencyStateDeactivated() +func (_Verify *VerifyFilterer) WatchEmergencyStateDeactivated(opts *bind.WatchOpts, sink chan<- *VerifyEmergencyStateDeactivated) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "EmergencyStateDeactivated") + 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(VerifyEmergencyStateDeactivated) + if err := _Verify.contract.UnpackLog(event, "EmergencyStateDeactivated", 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 +} + +// ParseEmergencyStateDeactivated is a log parse operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. +// +// Solidity: event EmergencyStateDeactivated() +func (_Verify *VerifyFilterer) ParseEmergencyStateDeactivated(log types.Log) (*VerifyEmergencyStateDeactivated, error) { + event := new(VerifyEmergencyStateDeactivated) + if err := _Verify.contract.UnpackLog(event, "EmergencyStateDeactivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Verify contract. +type VerifyInitializedIterator struct { + Event *VerifyInitialized // 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 *VerifyInitializedIterator) 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(VerifyInitialized) + 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(VerifyInitialized) + 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 *VerifyInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyInitialized represents a Initialized event raised by the Verify contract. +type VerifyInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Verify *VerifyFilterer) FilterInitialized(opts *bind.FilterOpts) (*VerifyInitializedIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &VerifyInitializedIterator{contract: _Verify.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Verify *VerifyFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *VerifyInitialized) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(VerifyInitialized) + if err := _Verify.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_Verify *VerifyFilterer) ParseInitialized(log types.Log) (*VerifyInitialized, error) { + event := new(VerifyInitialized) + if err := _Verify.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyObsoleteRollupTypeIterator is returned from FilterObsoleteRollupType and is used to iterate over the raw logs and unpacked data for ObsoleteRollupType events raised by the Verify contract. +type VerifyObsoleteRollupTypeIterator struct { + Event *VerifyObsoleteRollupType // 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 *VerifyObsoleteRollupTypeIterator) 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(VerifyObsoleteRollupType) + 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(VerifyObsoleteRollupType) + 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 *VerifyObsoleteRollupTypeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyObsoleteRollupTypeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyObsoleteRollupType represents a ObsoleteRollupType event raised by the Verify contract. +type VerifyObsoleteRollupType struct { + RollupTypeID uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterObsoleteRollupType is a free log retrieval operation binding the contract event 0x4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44. +// +// Solidity: event ObsoleteRollupType(uint32 indexed rollupTypeID) +func (_Verify *VerifyFilterer) FilterObsoleteRollupType(opts *bind.FilterOpts, rollupTypeID []uint32) (*VerifyObsoleteRollupTypeIterator, error) { + + var rollupTypeIDRule []interface{} + for _, rollupTypeIDItem := range rollupTypeID { + rollupTypeIDRule = append(rollupTypeIDRule, rollupTypeIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "ObsoleteRollupType", rollupTypeIDRule) + if err != nil { + return nil, err + } + return &VerifyObsoleteRollupTypeIterator{contract: _Verify.contract, event: "ObsoleteRollupType", logs: logs, sub: sub}, nil +} + +// WatchObsoleteRollupType is a free log subscription operation binding the contract event 0x4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44. +// +// Solidity: event ObsoleteRollupType(uint32 indexed rollupTypeID) +func (_Verify *VerifyFilterer) WatchObsoleteRollupType(opts *bind.WatchOpts, sink chan<- *VerifyObsoleteRollupType, rollupTypeID []uint32) (event.Subscription, error) { + + var rollupTypeIDRule []interface{} + for _, rollupTypeIDItem := range rollupTypeID { + rollupTypeIDRule = append(rollupTypeIDRule, rollupTypeIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "ObsoleteRollupType", rollupTypeIDRule) + 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(VerifyObsoleteRollupType) + if err := _Verify.contract.UnpackLog(event, "ObsoleteRollupType", 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 +} + +// ParseObsoleteRollupType is a log parse operation binding the contract event 0x4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44. +// +// Solidity: event ObsoleteRollupType(uint32 indexed rollupTypeID) +func (_Verify *VerifyFilterer) ParseObsoleteRollupType(log types.Log) (*VerifyObsoleteRollupType, error) { + event := new(VerifyObsoleteRollupType) + if err := _Verify.contract.UnpackLog(event, "ObsoleteRollupType", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyOnSequenceBatchesIterator is returned from FilterOnSequenceBatches and is used to iterate over the raw logs and unpacked data for OnSequenceBatches events raised by the Verify contract. +type VerifyOnSequenceBatchesIterator struct { + Event *VerifyOnSequenceBatches // 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 *VerifyOnSequenceBatchesIterator) 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(VerifyOnSequenceBatches) + 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(VerifyOnSequenceBatches) + 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 *VerifyOnSequenceBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyOnSequenceBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyOnSequenceBatches represents a OnSequenceBatches event raised by the Verify contract. +type VerifyOnSequenceBatches struct { + RollupID uint32 + LastBatchSequenced uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOnSequenceBatches is a free log retrieval operation binding the contract event 0x1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25. +// +// Solidity: event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced) +func (_Verify *VerifyFilterer) FilterOnSequenceBatches(opts *bind.FilterOpts, rollupID []uint32) (*VerifyOnSequenceBatchesIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "OnSequenceBatches", rollupIDRule) + if err != nil { + return nil, err + } + return &VerifyOnSequenceBatchesIterator{contract: _Verify.contract, event: "OnSequenceBatches", logs: logs, sub: sub}, nil +} + +// WatchOnSequenceBatches is a free log subscription operation binding the contract event 0x1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25. +// +// Solidity: event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced) +func (_Verify *VerifyFilterer) WatchOnSequenceBatches(opts *bind.WatchOpts, sink chan<- *VerifyOnSequenceBatches, rollupID []uint32) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "OnSequenceBatches", rollupIDRule) + 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(VerifyOnSequenceBatches) + if err := _Verify.contract.UnpackLog(event, "OnSequenceBatches", 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 +} + +// ParseOnSequenceBatches is a log parse operation binding the contract event 0x1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25. +// +// Solidity: event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced) +func (_Verify *VerifyFilterer) ParseOnSequenceBatches(log types.Log) (*VerifyOnSequenceBatches, error) { + event := new(VerifyOnSequenceBatches) + if err := _Verify.contract.UnpackLog(event, "OnSequenceBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyOverridePendingStateIterator is returned from FilterOverridePendingState and is used to iterate over the raw logs and unpacked data for OverridePendingState events raised by the Verify contract. +type VerifyOverridePendingStateIterator struct { + Event *VerifyOverridePendingState // 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 *VerifyOverridePendingStateIterator) 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(VerifyOverridePendingState) + 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(VerifyOverridePendingState) + 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 *VerifyOverridePendingStateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyOverridePendingStateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyOverridePendingState represents a OverridePendingState event raised by the Verify contract. +type VerifyOverridePendingState struct { + RollupID uint32 + NumBatch uint64 + StateRoot [32]byte + ExitRoot [32]byte + Aggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOverridePendingState is a free log retrieval operation binding the contract event 0x3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e. +// +// Solidity: event OverridePendingState(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address aggregator) +func (_Verify *VerifyFilterer) FilterOverridePendingState(opts *bind.FilterOpts, rollupID []uint32) (*VerifyOverridePendingStateIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "OverridePendingState", rollupIDRule) + if err != nil { + return nil, err + } + return &VerifyOverridePendingStateIterator{contract: _Verify.contract, event: "OverridePendingState", logs: logs, sub: sub}, nil +} + +// WatchOverridePendingState is a free log subscription operation binding the contract event 0x3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e. +// +// Solidity: event OverridePendingState(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address aggregator) +func (_Verify *VerifyFilterer) WatchOverridePendingState(opts *bind.WatchOpts, sink chan<- *VerifyOverridePendingState, rollupID []uint32) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "OverridePendingState", rollupIDRule) + 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(VerifyOverridePendingState) + if err := _Verify.contract.UnpackLog(event, "OverridePendingState", 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 +} + +// ParseOverridePendingState is a log parse operation binding the contract event 0x3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e. +// +// Solidity: event OverridePendingState(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address aggregator) +func (_Verify *VerifyFilterer) ParseOverridePendingState(log types.Log) (*VerifyOverridePendingState, error) { + event := new(VerifyOverridePendingState) + if err := _Verify.contract.UnpackLog(event, "OverridePendingState", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyProveNonDeterministicPendingStateIterator is returned from FilterProveNonDeterministicPendingState and is used to iterate over the raw logs and unpacked data for ProveNonDeterministicPendingState events raised by the Verify contract. +type VerifyProveNonDeterministicPendingStateIterator struct { + Event *VerifyProveNonDeterministicPendingState // 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 *VerifyProveNonDeterministicPendingStateIterator) 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(VerifyProveNonDeterministicPendingState) + 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(VerifyProveNonDeterministicPendingState) + 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 *VerifyProveNonDeterministicPendingStateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyProveNonDeterministicPendingStateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyProveNonDeterministicPendingState represents a ProveNonDeterministicPendingState event raised by the Verify contract. +type VerifyProveNonDeterministicPendingState struct { + StoredStateRoot [32]byte + ProvedStateRoot [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProveNonDeterministicPendingState is a free log retrieval operation binding the contract event 0x1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010. +// +// Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) +func (_Verify *VerifyFilterer) FilterProveNonDeterministicPendingState(opts *bind.FilterOpts) (*VerifyProveNonDeterministicPendingStateIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "ProveNonDeterministicPendingState") + if err != nil { + return nil, err + } + return &VerifyProveNonDeterministicPendingStateIterator{contract: _Verify.contract, event: "ProveNonDeterministicPendingState", logs: logs, sub: sub}, nil +} + +// WatchProveNonDeterministicPendingState is a free log subscription operation binding the contract event 0x1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010. +// +// Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) +func (_Verify *VerifyFilterer) WatchProveNonDeterministicPendingState(opts *bind.WatchOpts, sink chan<- *VerifyProveNonDeterministicPendingState) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "ProveNonDeterministicPendingState") + 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(VerifyProveNonDeterministicPendingState) + if err := _Verify.contract.UnpackLog(event, "ProveNonDeterministicPendingState", 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 +} + +// ParseProveNonDeterministicPendingState is a log parse operation binding the contract event 0x1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010. +// +// Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) +func (_Verify *VerifyFilterer) ParseProveNonDeterministicPendingState(log types.Log) (*VerifyProveNonDeterministicPendingState, error) { + event := new(VerifyProveNonDeterministicPendingState) + if err := _Verify.contract.UnpackLog(event, "ProveNonDeterministicPendingState", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the Verify contract. +type VerifyRoleAdminChangedIterator struct { + Event *VerifyRoleAdminChanged // 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 *VerifyRoleAdminChangedIterator) 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(VerifyRoleAdminChanged) + 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(VerifyRoleAdminChanged) + 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 *VerifyRoleAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyRoleAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyRoleAdminChanged represents a RoleAdminChanged event raised by the Verify contract. +type VerifyRoleAdminChanged struct { + Role [32]byte + PreviousAdminRole [32]byte + NewAdminRole [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Verify *VerifyFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*VerifyRoleAdminChangedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return &VerifyRoleAdminChangedIterator{contract: _Verify.contract, event: "RoleAdminChanged", logs: logs, sub: sub}, nil +} + +// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Verify *VerifyFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *VerifyRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + 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(VerifyRoleAdminChanged) + if err := _Verify.contract.UnpackLog(event, "RoleAdminChanged", 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 +} + +// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Verify *VerifyFilterer) ParseRoleAdminChanged(log types.Log) (*VerifyRoleAdminChanged, error) { + event := new(VerifyRoleAdminChanged) + if err := _Verify.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the Verify contract. +type VerifyRoleGrantedIterator struct { + Event *VerifyRoleGranted // 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 *VerifyRoleGrantedIterator) 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(VerifyRoleGranted) + 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(VerifyRoleGranted) + 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 *VerifyRoleGrantedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyRoleGrantedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyRoleGranted represents a RoleGranted event raised by the Verify contract. +type VerifyRoleGranted struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Verify *VerifyFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*VerifyRoleGrantedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &VerifyRoleGrantedIterator{contract: _Verify.contract, event: "RoleGranted", logs: logs, sub: sub}, nil +} + +// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Verify *VerifyFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *VerifyRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(VerifyRoleGranted) + if err := _Verify.contract.UnpackLog(event, "RoleGranted", 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 +} + +// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Verify *VerifyFilterer) ParseRoleGranted(log types.Log) (*VerifyRoleGranted, error) { + event := new(VerifyRoleGranted) + if err := _Verify.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the Verify contract. +type VerifyRoleRevokedIterator struct { + Event *VerifyRoleRevoked // 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 *VerifyRoleRevokedIterator) 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(VerifyRoleRevoked) + 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(VerifyRoleRevoked) + 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 *VerifyRoleRevokedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyRoleRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyRoleRevoked represents a RoleRevoked event raised by the Verify contract. +type VerifyRoleRevoked struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Verify *VerifyFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*VerifyRoleRevokedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &VerifyRoleRevokedIterator{contract: _Verify.contract, event: "RoleRevoked", logs: logs, sub: sub}, nil +} + +// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Verify *VerifyFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *VerifyRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(VerifyRoleRevoked) + if err := _Verify.contract.UnpackLog(event, "RoleRevoked", 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 +} + +// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Verify *VerifyFilterer) ParseRoleRevoked(log types.Log) (*VerifyRoleRevoked, error) { + event := new(VerifyRoleRevoked) + if err := _Verify.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifySetBatchFeeIterator is returned from FilterSetBatchFee and is used to iterate over the raw logs and unpacked data for SetBatchFee events raised by the Verify contract. +type VerifySetBatchFeeIterator struct { + Event *VerifySetBatchFee // 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 *VerifySetBatchFeeIterator) 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(VerifySetBatchFee) + 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(VerifySetBatchFee) + 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 *VerifySetBatchFeeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifySetBatchFeeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifySetBatchFee represents a SetBatchFee event raised by the Verify contract. +type VerifySetBatchFee struct { + NewBatchFee *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetBatchFee is a free log retrieval operation binding the contract event 0xfb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2. +// +// Solidity: event SetBatchFee(uint256 newBatchFee) +func (_Verify *VerifyFilterer) FilterSetBatchFee(opts *bind.FilterOpts) (*VerifySetBatchFeeIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "SetBatchFee") + if err != nil { + return nil, err + } + return &VerifySetBatchFeeIterator{contract: _Verify.contract, event: "SetBatchFee", logs: logs, sub: sub}, nil +} + +// WatchSetBatchFee is a free log subscription operation binding the contract event 0xfb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2. +// +// Solidity: event SetBatchFee(uint256 newBatchFee) +func (_Verify *VerifyFilterer) WatchSetBatchFee(opts *bind.WatchOpts, sink chan<- *VerifySetBatchFee) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "SetBatchFee") + 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(VerifySetBatchFee) + if err := _Verify.contract.UnpackLog(event, "SetBatchFee", 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 +} + +// ParseSetBatchFee is a log parse operation binding the contract event 0xfb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2. +// +// Solidity: event SetBatchFee(uint256 newBatchFee) +func (_Verify *VerifyFilterer) ParseSetBatchFee(log types.Log) (*VerifySetBatchFee, error) { + event := new(VerifySetBatchFee) + if err := _Verify.contract.UnpackLog(event, "SetBatchFee", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifySetMultiplierBatchFeeIterator is returned from FilterSetMultiplierBatchFee and is used to iterate over the raw logs and unpacked data for SetMultiplierBatchFee events raised by the Verify contract. +type VerifySetMultiplierBatchFeeIterator struct { + Event *VerifySetMultiplierBatchFee // 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 *VerifySetMultiplierBatchFeeIterator) 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(VerifySetMultiplierBatchFee) + 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(VerifySetMultiplierBatchFee) + 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 *VerifySetMultiplierBatchFeeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifySetMultiplierBatchFeeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifySetMultiplierBatchFee represents a SetMultiplierBatchFee event raised by the Verify contract. +type VerifySetMultiplierBatchFee struct { + NewMultiplierBatchFee uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetMultiplierBatchFee is a free log retrieval operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. +// +// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) +func (_Verify *VerifyFilterer) FilterSetMultiplierBatchFee(opts *bind.FilterOpts) (*VerifySetMultiplierBatchFeeIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "SetMultiplierBatchFee") + if err != nil { + return nil, err + } + return &VerifySetMultiplierBatchFeeIterator{contract: _Verify.contract, event: "SetMultiplierBatchFee", logs: logs, sub: sub}, nil +} + +// WatchSetMultiplierBatchFee is a free log subscription operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. +// +// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) +func (_Verify *VerifyFilterer) WatchSetMultiplierBatchFee(opts *bind.WatchOpts, sink chan<- *VerifySetMultiplierBatchFee) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "SetMultiplierBatchFee") + 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(VerifySetMultiplierBatchFee) + if err := _Verify.contract.UnpackLog(event, "SetMultiplierBatchFee", 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 +} + +// ParseSetMultiplierBatchFee is a log parse operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. +// +// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) +func (_Verify *VerifyFilterer) ParseSetMultiplierBatchFee(log types.Log) (*VerifySetMultiplierBatchFee, error) { + event := new(VerifySetMultiplierBatchFee) + if err := _Verify.contract.UnpackLog(event, "SetMultiplierBatchFee", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifySetPendingStateTimeoutIterator is returned from FilterSetPendingStateTimeout and is used to iterate over the raw logs and unpacked data for SetPendingStateTimeout events raised by the Verify contract. +type VerifySetPendingStateTimeoutIterator struct { + Event *VerifySetPendingStateTimeout // 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 *VerifySetPendingStateTimeoutIterator) 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(VerifySetPendingStateTimeout) + 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(VerifySetPendingStateTimeout) + 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 *VerifySetPendingStateTimeoutIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifySetPendingStateTimeoutIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifySetPendingStateTimeout represents a SetPendingStateTimeout event raised by the Verify contract. +type VerifySetPendingStateTimeout struct { + NewPendingStateTimeout uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetPendingStateTimeout is a free log retrieval operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. +// +// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) +func (_Verify *VerifyFilterer) FilterSetPendingStateTimeout(opts *bind.FilterOpts) (*VerifySetPendingStateTimeoutIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "SetPendingStateTimeout") + if err != nil { + return nil, err + } + return &VerifySetPendingStateTimeoutIterator{contract: _Verify.contract, event: "SetPendingStateTimeout", logs: logs, sub: sub}, nil +} + +// WatchSetPendingStateTimeout is a free log subscription operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. +// +// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) +func (_Verify *VerifyFilterer) WatchSetPendingStateTimeout(opts *bind.WatchOpts, sink chan<- *VerifySetPendingStateTimeout) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "SetPendingStateTimeout") + 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(VerifySetPendingStateTimeout) + if err := _Verify.contract.UnpackLog(event, "SetPendingStateTimeout", 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 +} + +// ParseSetPendingStateTimeout is a log parse operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. +// +// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) +func (_Verify *VerifyFilterer) ParseSetPendingStateTimeout(log types.Log) (*VerifySetPendingStateTimeout, error) { + event := new(VerifySetPendingStateTimeout) + if err := _Verify.contract.UnpackLog(event, "SetPendingStateTimeout", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifySetTrustedAggregatorIterator is returned from FilterSetTrustedAggregator and is used to iterate over the raw logs and unpacked data for SetTrustedAggregator events raised by the Verify contract. +type VerifySetTrustedAggregatorIterator struct { + Event *VerifySetTrustedAggregator // 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 *VerifySetTrustedAggregatorIterator) 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(VerifySetTrustedAggregator) + 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(VerifySetTrustedAggregator) + 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 *VerifySetTrustedAggregatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifySetTrustedAggregatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifySetTrustedAggregator represents a SetTrustedAggregator event raised by the Verify contract. +type VerifySetTrustedAggregator struct { + NewTrustedAggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetTrustedAggregator is a free log retrieval operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. +// +// Solidity: event SetTrustedAggregator(address newTrustedAggregator) +func (_Verify *VerifyFilterer) FilterSetTrustedAggregator(opts *bind.FilterOpts) (*VerifySetTrustedAggregatorIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "SetTrustedAggregator") + if err != nil { + return nil, err + } + return &VerifySetTrustedAggregatorIterator{contract: _Verify.contract, event: "SetTrustedAggregator", logs: logs, sub: sub}, nil +} + +// WatchSetTrustedAggregator is a free log subscription operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. +// +// Solidity: event SetTrustedAggregator(address newTrustedAggregator) +func (_Verify *VerifyFilterer) WatchSetTrustedAggregator(opts *bind.WatchOpts, sink chan<- *VerifySetTrustedAggregator) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "SetTrustedAggregator") + 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(VerifySetTrustedAggregator) + if err := _Verify.contract.UnpackLog(event, "SetTrustedAggregator", 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 +} + +// ParseSetTrustedAggregator is a log parse operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. +// +// Solidity: event SetTrustedAggregator(address newTrustedAggregator) +func (_Verify *VerifyFilterer) ParseSetTrustedAggregator(log types.Log) (*VerifySetTrustedAggregator, error) { + event := new(VerifySetTrustedAggregator) + if err := _Verify.contract.UnpackLog(event, "SetTrustedAggregator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifySetTrustedAggregatorTimeoutIterator is returned from FilterSetTrustedAggregatorTimeout and is used to iterate over the raw logs and unpacked data for SetTrustedAggregatorTimeout events raised by the Verify contract. +type VerifySetTrustedAggregatorTimeoutIterator struct { + Event *VerifySetTrustedAggregatorTimeout // 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 *VerifySetTrustedAggregatorTimeoutIterator) 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(VerifySetTrustedAggregatorTimeout) + 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(VerifySetTrustedAggregatorTimeout) + 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 *VerifySetTrustedAggregatorTimeoutIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifySetTrustedAggregatorTimeoutIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifySetTrustedAggregatorTimeout represents a SetTrustedAggregatorTimeout event raised by the Verify contract. +type VerifySetTrustedAggregatorTimeout struct { + NewTrustedAggregatorTimeout uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetTrustedAggregatorTimeout is a free log retrieval operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. +// +// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) +func (_Verify *VerifyFilterer) FilterSetTrustedAggregatorTimeout(opts *bind.FilterOpts) (*VerifySetTrustedAggregatorTimeoutIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "SetTrustedAggregatorTimeout") + if err != nil { + return nil, err + } + return &VerifySetTrustedAggregatorTimeoutIterator{contract: _Verify.contract, event: "SetTrustedAggregatorTimeout", logs: logs, sub: sub}, nil +} + +// WatchSetTrustedAggregatorTimeout is a free log subscription operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. +// +// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) +func (_Verify *VerifyFilterer) WatchSetTrustedAggregatorTimeout(opts *bind.WatchOpts, sink chan<- *VerifySetTrustedAggregatorTimeout) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "SetTrustedAggregatorTimeout") + 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(VerifySetTrustedAggregatorTimeout) + if err := _Verify.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", 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 +} + +// ParseSetTrustedAggregatorTimeout is a log parse operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. +// +// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) +func (_Verify *VerifyFilterer) ParseSetTrustedAggregatorTimeout(log types.Log) (*VerifySetTrustedAggregatorTimeout, error) { + event := new(VerifySetTrustedAggregatorTimeout) + if err := _Verify.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifySetVerifyBatchTimeTargetIterator is returned from FilterSetVerifyBatchTimeTarget and is used to iterate over the raw logs and unpacked data for SetVerifyBatchTimeTarget events raised by the Verify contract. +type VerifySetVerifyBatchTimeTargetIterator struct { + Event *VerifySetVerifyBatchTimeTarget // 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 *VerifySetVerifyBatchTimeTargetIterator) 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(VerifySetVerifyBatchTimeTarget) + 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(VerifySetVerifyBatchTimeTarget) + 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 *VerifySetVerifyBatchTimeTargetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifySetVerifyBatchTimeTargetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifySetVerifyBatchTimeTarget represents a SetVerifyBatchTimeTarget event raised by the Verify contract. +type VerifySetVerifyBatchTimeTarget struct { + NewVerifyBatchTimeTarget uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSetVerifyBatchTimeTarget is a free log retrieval operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. +// +// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) +func (_Verify *VerifyFilterer) FilterSetVerifyBatchTimeTarget(opts *bind.FilterOpts) (*VerifySetVerifyBatchTimeTargetIterator, error) { + + logs, sub, err := _Verify.contract.FilterLogs(opts, "SetVerifyBatchTimeTarget") + if err != nil { + return nil, err + } + return &VerifySetVerifyBatchTimeTargetIterator{contract: _Verify.contract, event: "SetVerifyBatchTimeTarget", logs: logs, sub: sub}, nil +} + +// WatchSetVerifyBatchTimeTarget is a free log subscription operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. +// +// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) +func (_Verify *VerifyFilterer) WatchSetVerifyBatchTimeTarget(opts *bind.WatchOpts, sink chan<- *VerifySetVerifyBatchTimeTarget) (event.Subscription, error) { + + logs, sub, err := _Verify.contract.WatchLogs(opts, "SetVerifyBatchTimeTarget") + 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(VerifySetVerifyBatchTimeTarget) + if err := _Verify.contract.UnpackLog(event, "SetVerifyBatchTimeTarget", 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 +} + +// ParseSetVerifyBatchTimeTarget is a log parse operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. +// +// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) +func (_Verify *VerifyFilterer) ParseSetVerifyBatchTimeTarget(log types.Log) (*VerifySetVerifyBatchTimeTarget, error) { + event := new(VerifySetVerifyBatchTimeTarget) + if err := _Verify.contract.UnpackLog(event, "SetVerifyBatchTimeTarget", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyUpdateRollupIterator is returned from FilterUpdateRollup and is used to iterate over the raw logs and unpacked data for UpdateRollup events raised by the Verify contract. +type VerifyUpdateRollupIterator struct { + Event *VerifyUpdateRollup // 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 *VerifyUpdateRollupIterator) 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(VerifyUpdateRollup) + 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(VerifyUpdateRollup) + 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 *VerifyUpdateRollupIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyUpdateRollupIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyUpdateRollup represents a UpdateRollup event raised by the Verify contract. +type VerifyUpdateRollup struct { + RollupID uint32 + NewRollupTypeID uint32 + LastVerifiedBatchBeforeUpgrade uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpdateRollup is a free log retrieval operation binding the contract event 0xf585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d. +// +// Solidity: event UpdateRollup(uint32 indexed rollupID, uint32 newRollupTypeID, uint64 lastVerifiedBatchBeforeUpgrade) +func (_Verify *VerifyFilterer) FilterUpdateRollup(opts *bind.FilterOpts, rollupID []uint32) (*VerifyUpdateRollupIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "UpdateRollup", rollupIDRule) + if err != nil { + return nil, err + } + return &VerifyUpdateRollupIterator{contract: _Verify.contract, event: "UpdateRollup", logs: logs, sub: sub}, nil +} + +// WatchUpdateRollup is a free log subscription operation binding the contract event 0xf585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d. +// +// Solidity: event UpdateRollup(uint32 indexed rollupID, uint32 newRollupTypeID, uint64 lastVerifiedBatchBeforeUpgrade) +func (_Verify *VerifyFilterer) WatchUpdateRollup(opts *bind.WatchOpts, sink chan<- *VerifyUpdateRollup, rollupID []uint32) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "UpdateRollup", rollupIDRule) + 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(VerifyUpdateRollup) + if err := _Verify.contract.UnpackLog(event, "UpdateRollup", 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 +} + +// ParseUpdateRollup is a log parse operation binding the contract event 0xf585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d. +// +// Solidity: event UpdateRollup(uint32 indexed rollupID, uint32 newRollupTypeID, uint64 lastVerifiedBatchBeforeUpgrade) +func (_Verify *VerifyFilterer) ParseUpdateRollup(log types.Log) (*VerifyUpdateRollup, error) { + event := new(VerifyUpdateRollup) + if err := _Verify.contract.UnpackLog(event, "UpdateRollup", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyVerifyBatchesIterator is returned from FilterVerifyBatches and is used to iterate over the raw logs and unpacked data for VerifyBatches events raised by the Verify contract. +type VerifyVerifyBatchesIterator struct { + Event *VerifyVerifyBatches // 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 *VerifyVerifyBatchesIterator) 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(VerifyVerifyBatches) + 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(VerifyVerifyBatches) + 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 *VerifyVerifyBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyVerifyBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyVerifyBatches represents a VerifyBatches event raised by the Verify contract. +type VerifyVerifyBatches struct { + RollupID uint32 + NumBatch uint64 + StateRoot [32]byte + ExitRoot [32]byte + Aggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVerifyBatches is a free log retrieval operation binding the contract event 0xaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4. +// +// Solidity: event VerifyBatches(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verify *VerifyFilterer) FilterVerifyBatches(opts *bind.FilterOpts, rollupID []uint32, aggregator []common.Address) (*VerifyVerifyBatchesIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "VerifyBatches", rollupIDRule, aggregatorRule) + if err != nil { + return nil, err + } + return &VerifyVerifyBatchesIterator{contract: _Verify.contract, event: "VerifyBatches", logs: logs, sub: sub}, nil +} + +// WatchVerifyBatches is a free log subscription operation binding the contract event 0xaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4. +// +// Solidity: event VerifyBatches(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verify *VerifyFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *VerifyVerifyBatches, rollupID []uint32, aggregator []common.Address) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "VerifyBatches", rollupIDRule, aggregatorRule) + 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(VerifyVerifyBatches) + if err := _Verify.contract.UnpackLog(event, "VerifyBatches", 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 +} + +// ParseVerifyBatches is a log parse operation binding the contract event 0xaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4. +// +// Solidity: event VerifyBatches(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verify *VerifyFilterer) ParseVerifyBatches(log types.Log) (*VerifyVerifyBatches, error) { + event := new(VerifyVerifyBatches) + if err := _Verify.contract.UnpackLog(event, "VerifyBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifyVerifyBatchesTrustedAggregatorIterator is returned from FilterVerifyBatchesTrustedAggregator and is used to iterate over the raw logs and unpacked data for VerifyBatchesTrustedAggregator events raised by the Verify contract. +type VerifyVerifyBatchesTrustedAggregatorIterator struct { + Event *VerifyVerifyBatchesTrustedAggregator // 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 *VerifyVerifyBatchesTrustedAggregatorIterator) 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(VerifyVerifyBatchesTrustedAggregator) + 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(VerifyVerifyBatchesTrustedAggregator) + 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 *VerifyVerifyBatchesTrustedAggregatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifyVerifyBatchesTrustedAggregatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifyVerifyBatchesTrustedAggregator represents a VerifyBatchesTrustedAggregator event raised by the Verify contract. +type VerifyVerifyBatchesTrustedAggregator struct { + RollupID uint32 + NumBatch uint64 + StateRoot [32]byte + ExitRoot [32]byte + Aggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVerifyBatchesTrustedAggregator is a free log retrieval operation binding the contract event 0xd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3. +// +// Solidity: event VerifyBatchesTrustedAggregator(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verify *VerifyFilterer) FilterVerifyBatchesTrustedAggregator(opts *bind.FilterOpts, rollupID []uint32, aggregator []common.Address) (*VerifyVerifyBatchesTrustedAggregatorIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verify.contract.FilterLogs(opts, "VerifyBatchesTrustedAggregator", rollupIDRule, aggregatorRule) + if err != nil { + return nil, err + } + return &VerifyVerifyBatchesTrustedAggregatorIterator{contract: _Verify.contract, event: "VerifyBatchesTrustedAggregator", logs: logs, sub: sub}, nil +} + +// WatchVerifyBatchesTrustedAggregator is a free log subscription operation binding the contract event 0xd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3. +// +// Solidity: event VerifyBatchesTrustedAggregator(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verify *VerifyFilterer) WatchVerifyBatchesTrustedAggregator(opts *bind.WatchOpts, sink chan<- *VerifyVerifyBatchesTrustedAggregator, rollupID []uint32, aggregator []common.Address) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verify.contract.WatchLogs(opts, "VerifyBatchesTrustedAggregator", rollupIDRule, aggregatorRule) + 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(VerifyVerifyBatchesTrustedAggregator) + if err := _Verify.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", 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 +} + +// ParseVerifyBatchesTrustedAggregator is a log parse operation binding the contract event 0xd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3. +// +// Solidity: event VerifyBatchesTrustedAggregator(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verify *VerifyFilterer) ParseVerifyBatchesTrustedAggregator(log types.Log) (*VerifyVerifyBatchesTrustedAggregator, error) { + event := new(VerifyVerifyBatchesTrustedAggregator) + if err := _Verify.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/contract/zkEVM.go b/pkg/contract/zkEVM.go deleted file mode 100644 index ba644fb..0000000 --- a/pkg/contract/zkEVM.go +++ /dev/null @@ -1,5286 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// PolygonZkEVMBatchData is an auto generated low-level Go binding around an user-defined struct. -type PolygonZkEVMBatchData struct { - Transactions []byte - GlobalExitRoot [32]byte - Timestamp uint64 - MinForcedTimestamp uint64 -} - -// PolygonZkEVMForcedBatchData is an auto generated low-level Go binding around an user-defined struct. -type PolygonZkEVMForcedBatchData struct { - Transactions []byte - GlobalExitRoot [32]byte - MinForcedTimestamp uint64 -} - -// PolygonZkEVMInitializePackedParameters is an auto generated low-level Go binding around an user-defined struct. -type PolygonZkEVMInitializePackedParameters struct { - Admin common.Address - TrustedSequencer common.Address - PendingStateTimeout uint64 - TrustedAggregator common.Address - TrustedAggregatorTimeout uint64 -} - -// ZkEVMMetaData contains all meta data concerning the ZkEVM contract. -var ZkEVMMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"_matic\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"_rollupVerifier\",\"type\":\"address\"},{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"_bridgeAddress\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_forkID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BatchAlreadyVerified\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BatchNotSequencedOrNotSequenceEnd\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExceedMaxVerifyBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchBelowLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalPendingStateNumInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesAlreadyActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForcedDataDoesNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HaltTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchAboveLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeBatchTimeTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeForceBatchTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeMultiplierBatchFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewPendingStateTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewStateRootNotInsidePrime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewTrustedAggregatorTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughMaticAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldStateRootDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPendingAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyTrustedAggregator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyTrustedSequencer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateNotConsolidable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateTimeoutExceedHaltAggregationTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequenceZeroBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequencedTimestampBelowForcedTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequencedTimestampInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StoredRootMustBeDifferentThanNewRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransactionsLengthAboveMax\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutExceedHaltAggregationTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutNotExpired\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AcceptAdminRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ActivateForceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"ConsolidatePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"forceBatchNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastGlobalExitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"}],\"name\":\"ForceBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"OverridePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"storedStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"provedStateRoot\",\"type\":\"bytes32\"}],\"name\":\"ProveNonDeterministicPendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceForceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newforceBatchTimeout\",\"type\":\"uint64\"}],\"name\":\"SetForceBatchTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"SetMultiplierBatchFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"SetPendingStateTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"SetTrustedAggregator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"SetTrustedAggregatorTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"SetTrustedSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"SetTrustedSequencerURL\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newVerifyBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"SetVerifyBatchTimeTarget\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPendingAdmin\",\"type\":\"address\"}],\"name\":\"TransferAdminRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"UpdateZkEVMVersion\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatchesTrustedAggregator\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequencedBatchNum\",\"type\":\"uint64\"}],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateForceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"batchNumToStateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"calculateRewardPerBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chainID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newStateRoot\",\"type\":\"uint256\"}],\"name\":\"checkStateRootInsidePrime\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"consolidatePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maticAmount\",\"type\":\"uint256\"}],\"name\":\"forceBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceBatchTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"forcedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forkID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getForcedBatchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"oldStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"}],\"name\":\"getInputSnarkBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"trustedSequencer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateTimeout\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"trustedAggregator\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"trustedAggregatorTimeout\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.InitializePackedParameters\",\"name\":\"initializePackedParameters\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"genesisRoot\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_trustedSequencerURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_networkName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_version\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isForcedBatchDisallowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"isPendingStateConsolidable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastPendingState\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastPendingStateConsolidated\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"matic\",\"outputs\":[{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"multiplierBatchFee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"overridePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingStateTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"pendingStateTransitions\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"proveNonDeterministicPendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupVerifier\",\"outputs\":[{\"internalType\":\"contractIVerifierRollup\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"globalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minForcedTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.BatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"l2Coinbase\",\"type\":\"address\"}],\"name\":\"sequenceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"globalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"minForcedTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.ForcedBatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"}],\"name\":\"sequenceForceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"sequencedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"accInputHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequencedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"previousLastBatchSequenced\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newforceBatchTimeout\",\"type\":\"uint64\"}],\"name\":\"setForceBatchTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"setMultiplierBatchFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"setPendingStateTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"setTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"setTrustedAggregatorTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"setTrustedSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"setTrustedSequencerURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newVerifyBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"setVerifyBatchTimeTarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPendingAdmin\",\"type\":\"address\"}],\"name\":\"transferAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregatorTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencerURL\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyBatchTimeTarget\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"verifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[24]\",\"name\":\"proof\",\"type\":\"bytes32[24]\"}],\"name\":\"verifyBatchesTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", -} - -// ZkEVMABI is the input ABI used to generate the binding from. -// Deprecated: Use ZkEVMMetaData.ABI instead. -var ZkEVMABI = ZkEVMMetaData.ABI - -// ZkEVM is an auto generated Go binding around an Ethereum contract. -type ZkEVM struct { - ZkEVMCaller // Read-only binding to the contract - ZkEVMTransactor // Write-only binding to the contract - ZkEVMFilterer // Log filterer for contract events -} - -// ZkEVMCaller is an auto generated read-only Go binding around an Ethereum contract. -type ZkEVMCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ZkEVMTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ZkEVMTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ZkEVMFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ZkEVMFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ZkEVMSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ZkEVMSession struct { - Contract *ZkEVM // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ZkEVMCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ZkEVMCallerSession struct { - Contract *ZkEVMCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ZkEVMTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ZkEVMTransactorSession struct { - Contract *ZkEVMTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ZkEVMRaw is an auto generated low-level Go binding around an Ethereum contract. -type ZkEVMRaw struct { - Contract *ZkEVM // Generic contract binding to access the raw methods on -} - -// ZkEVMCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ZkEVMCallerRaw struct { - Contract *ZkEVMCaller // Generic read-only contract binding to access the raw methods on -} - -// ZkEVMTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ZkEVMTransactorRaw struct { - Contract *ZkEVMTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewZkEVM creates a new instance of ZkEVM, bound to a specific deployed contract. -func NewZkEVM(address common.Address, backend bind.ContractBackend) (*ZkEVM, error) { - contract, err := bindZkEVM(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &ZkEVM{ZkEVMCaller: ZkEVMCaller{contract: contract}, ZkEVMTransactor: ZkEVMTransactor{contract: contract}, ZkEVMFilterer: ZkEVMFilterer{contract: contract}}, nil -} - -// NewZkEVMCaller creates a new read-only instance of ZkEVM, bound to a specific deployed contract. -func NewZkEVMCaller(address common.Address, caller bind.ContractCaller) (*ZkEVMCaller, error) { - contract, err := bindZkEVM(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ZkEVMCaller{contract: contract}, nil -} - -// NewZkEVMTransactor creates a new write-only instance of ZkEVM, bound to a specific deployed contract. -func NewZkEVMTransactor(address common.Address, transactor bind.ContractTransactor) (*ZkEVMTransactor, error) { - contract, err := bindZkEVM(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ZkEVMTransactor{contract: contract}, nil -} - -// NewZkEVMFilterer creates a new log filterer instance of ZkEVM, bound to a specific deployed contract. -func NewZkEVMFilterer(address common.Address, filterer bind.ContractFilterer) (*ZkEVMFilterer, error) { - contract, err := bindZkEVM(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ZkEVMFilterer{contract: contract}, nil -} - -// bindZkEVM binds a generic wrapper to an already deployed contract. -func bindZkEVM(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := ZkEVMMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ZkEVM *ZkEVMRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ZkEVM.Contract.ZkEVMCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ZkEVM *ZkEVMRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ZkEVM.Contract.ZkEVMTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ZkEVM *ZkEVMRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ZkEVM.Contract.ZkEVMTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ZkEVM *ZkEVMCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ZkEVM.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ZkEVM *ZkEVMTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ZkEVM.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ZkEVM *ZkEVMTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ZkEVM.Contract.contract.Transact(opts, method, params...) -} - -// Admin is a free data retrieval call binding the contract method 0xf851a440. -// -// Solidity: function admin() view returns(address) -func (_ZkEVM *ZkEVMCaller) Admin(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "admin") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Admin is a free data retrieval call binding the contract method 0xf851a440. -// -// Solidity: function admin() view returns(address) -func (_ZkEVM *ZkEVMSession) Admin() (common.Address, error) { - return _ZkEVM.Contract.Admin(&_ZkEVM.CallOpts) -} - -// Admin is a free data retrieval call binding the contract method 0xf851a440. -// -// Solidity: function admin() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) Admin() (common.Address, error) { - return _ZkEVM.Contract.Admin(&_ZkEVM.CallOpts) -} - -// BatchFee is a free data retrieval call binding the contract method 0xf8b823e4. -// -// Solidity: function batchFee() view returns(uint256) -func (_ZkEVM *ZkEVMCaller) BatchFee(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "batchFee") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// BatchFee is a free data retrieval call binding the contract method 0xf8b823e4. -// -// Solidity: function batchFee() view returns(uint256) -func (_ZkEVM *ZkEVMSession) BatchFee() (*big.Int, error) { - return _ZkEVM.Contract.BatchFee(&_ZkEVM.CallOpts) -} - -// BatchFee is a free data retrieval call binding the contract method 0xf8b823e4. -// -// Solidity: function batchFee() view returns(uint256) -func (_ZkEVM *ZkEVMCallerSession) BatchFee() (*big.Int, error) { - return _ZkEVM.Contract.BatchFee(&_ZkEVM.CallOpts) -} - -// BatchNumToStateRoot is a free data retrieval call binding the contract method 0x5392c5e0. -// -// Solidity: function batchNumToStateRoot(uint64 ) view returns(bytes32) -func (_ZkEVM *ZkEVMCaller) BatchNumToStateRoot(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "batchNumToStateRoot", arg0) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// BatchNumToStateRoot is a free data retrieval call binding the contract method 0x5392c5e0. -// -// Solidity: function batchNumToStateRoot(uint64 ) view returns(bytes32) -func (_ZkEVM *ZkEVMSession) BatchNumToStateRoot(arg0 uint64) ([32]byte, error) { - return _ZkEVM.Contract.BatchNumToStateRoot(&_ZkEVM.CallOpts, arg0) -} - -// BatchNumToStateRoot is a free data retrieval call binding the contract method 0x5392c5e0. -// -// Solidity: function batchNumToStateRoot(uint64 ) view returns(bytes32) -func (_ZkEVM *ZkEVMCallerSession) BatchNumToStateRoot(arg0 uint64) ([32]byte, error) { - return _ZkEVM.Contract.BatchNumToStateRoot(&_ZkEVM.CallOpts, arg0) -} - -// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. -// -// Solidity: function bridgeAddress() view returns(address) -func (_ZkEVM *ZkEVMCaller) BridgeAddress(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "bridgeAddress") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. -// -// Solidity: function bridgeAddress() view returns(address) -func (_ZkEVM *ZkEVMSession) BridgeAddress() (common.Address, error) { - return _ZkEVM.Contract.BridgeAddress(&_ZkEVM.CallOpts) -} - -// BridgeAddress is a free data retrieval call binding the contract method 0xa3c573eb. -// -// Solidity: function bridgeAddress() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) BridgeAddress() (common.Address, error) { - return _ZkEVM.Contract.BridgeAddress(&_ZkEVM.CallOpts) -} - -// CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. -// -// Solidity: function calculateRewardPerBatch() view returns(uint256) -func (_ZkEVM *ZkEVMCaller) CalculateRewardPerBatch(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "calculateRewardPerBatch") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. -// -// Solidity: function calculateRewardPerBatch() view returns(uint256) -func (_ZkEVM *ZkEVMSession) CalculateRewardPerBatch() (*big.Int, error) { - return _ZkEVM.Contract.CalculateRewardPerBatch(&_ZkEVM.CallOpts) -} - -// CalculateRewardPerBatch is a free data retrieval call binding the contract method 0x99f5634e. -// -// Solidity: function calculateRewardPerBatch() view returns(uint256) -func (_ZkEVM *ZkEVMCallerSession) CalculateRewardPerBatch() (*big.Int, error) { - return _ZkEVM.Contract.CalculateRewardPerBatch(&_ZkEVM.CallOpts) -} - -// ChainID is a free data retrieval call binding the contract method 0xadc879e9. -// -// Solidity: function chainID() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) ChainID(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "chainID") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// ChainID is a free data retrieval call binding the contract method 0xadc879e9. -// -// Solidity: function chainID() view returns(uint64) -func (_ZkEVM *ZkEVMSession) ChainID() (uint64, error) { - return _ZkEVM.Contract.ChainID(&_ZkEVM.CallOpts) -} - -// ChainID is a free data retrieval call binding the contract method 0xadc879e9. -// -// Solidity: function chainID() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) ChainID() (uint64, error) { - return _ZkEVM.Contract.ChainID(&_ZkEVM.CallOpts) -} - -// CheckStateRootInsidePrime is a free data retrieval call binding the contract method 0xba58ae39. -// -// Solidity: function checkStateRootInsidePrime(uint256 newStateRoot) pure returns(bool) -func (_ZkEVM *ZkEVMCaller) CheckStateRootInsidePrime(opts *bind.CallOpts, newStateRoot *big.Int) (bool, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "checkStateRootInsidePrime", newStateRoot) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// CheckStateRootInsidePrime is a free data retrieval call binding the contract method 0xba58ae39. -// -// Solidity: function checkStateRootInsidePrime(uint256 newStateRoot) pure returns(bool) -func (_ZkEVM *ZkEVMSession) CheckStateRootInsidePrime(newStateRoot *big.Int) (bool, error) { - return _ZkEVM.Contract.CheckStateRootInsidePrime(&_ZkEVM.CallOpts, newStateRoot) -} - -// CheckStateRootInsidePrime is a free data retrieval call binding the contract method 0xba58ae39. -// -// Solidity: function checkStateRootInsidePrime(uint256 newStateRoot) pure returns(bool) -func (_ZkEVM *ZkEVMCallerSession) CheckStateRootInsidePrime(newStateRoot *big.Int) (bool, error) { - return _ZkEVM.Contract.CheckStateRootInsidePrime(&_ZkEVM.CallOpts, newStateRoot) -} - -// ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. -// -// Solidity: function forceBatchTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) ForceBatchTimeout(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "forceBatchTimeout") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. -// -// Solidity: function forceBatchTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMSession) ForceBatchTimeout() (uint64, error) { - return _ZkEVM.Contract.ForceBatchTimeout(&_ZkEVM.CallOpts) -} - -// ForceBatchTimeout is a free data retrieval call binding the contract method 0xc754c7ed. -// -// Solidity: function forceBatchTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) ForceBatchTimeout() (uint64, error) { - return _ZkEVM.Contract.ForceBatchTimeout(&_ZkEVM.CallOpts) -} - -// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. -// -// Solidity: function forcedBatches(uint64 ) view returns(bytes32) -func (_ZkEVM *ZkEVMCaller) ForcedBatches(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "forcedBatches", arg0) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. -// -// Solidity: function forcedBatches(uint64 ) view returns(bytes32) -func (_ZkEVM *ZkEVMSession) ForcedBatches(arg0 uint64) ([32]byte, error) { - return _ZkEVM.Contract.ForcedBatches(&_ZkEVM.CallOpts, arg0) -} - -// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. -// -// Solidity: function forcedBatches(uint64 ) view returns(bytes32) -func (_ZkEVM *ZkEVMCallerSession) ForcedBatches(arg0 uint64) ([32]byte, error) { - return _ZkEVM.Contract.ForcedBatches(&_ZkEVM.CallOpts, arg0) -} - -// ForkID is a free data retrieval call binding the contract method 0x831c7ead. -// -// Solidity: function forkID() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) ForkID(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "forkID") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// ForkID is a free data retrieval call binding the contract method 0x831c7ead. -// -// Solidity: function forkID() view returns(uint64) -func (_ZkEVM *ZkEVMSession) ForkID() (uint64, error) { - return _ZkEVM.Contract.ForkID(&_ZkEVM.CallOpts) -} - -// ForkID is a free data retrieval call binding the contract method 0x831c7ead. -// -// Solidity: function forkID() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) ForkID() (uint64, error) { - return _ZkEVM.Contract.ForkID(&_ZkEVM.CallOpts) -} - -// GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. -// -// Solidity: function getForcedBatchFee() view returns(uint256) -func (_ZkEVM *ZkEVMCaller) GetForcedBatchFee(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "getForcedBatchFee") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. -// -// Solidity: function getForcedBatchFee() view returns(uint256) -func (_ZkEVM *ZkEVMSession) GetForcedBatchFee() (*big.Int, error) { - return _ZkEVM.Contract.GetForcedBatchFee(&_ZkEVM.CallOpts) -} - -// GetForcedBatchFee is a free data retrieval call binding the contract method 0x60469169. -// -// Solidity: function getForcedBatchFee() view returns(uint256) -func (_ZkEVM *ZkEVMCallerSession) GetForcedBatchFee() (*big.Int, error) { - return _ZkEVM.Contract.GetForcedBatchFee(&_ZkEVM.CallOpts) -} - -// GetInputSnarkBytes is a free data retrieval call binding the contract method 0x220d7899. -// -// Solidity: function getInputSnarkBytes(uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot) view returns(bytes) -func (_ZkEVM *ZkEVMCaller) GetInputSnarkBytes(opts *bind.CallOpts, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "getInputSnarkBytes", initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetInputSnarkBytes is a free data retrieval call binding the contract method 0x220d7899. -// -// Solidity: function getInputSnarkBytes(uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot) view returns(bytes) -func (_ZkEVM *ZkEVMSession) GetInputSnarkBytes(initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { - return _ZkEVM.Contract.GetInputSnarkBytes(&_ZkEVM.CallOpts, initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) -} - -// GetInputSnarkBytes is a free data retrieval call binding the contract method 0x220d7899. -// -// Solidity: function getInputSnarkBytes(uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot) view returns(bytes) -func (_ZkEVM *ZkEVMCallerSession) GetInputSnarkBytes(initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, oldStateRoot [32]byte, newStateRoot [32]byte) ([]byte, error) { - return _ZkEVM.Contract.GetInputSnarkBytes(&_ZkEVM.CallOpts, initNumBatch, finalNewBatch, newLocalExitRoot, oldStateRoot, newStateRoot) -} - -// GetLastVerifiedBatch is a free data retrieval call binding the contract method 0xc0ed84e0. -// -// Solidity: function getLastVerifiedBatch() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) GetLastVerifiedBatch(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "getLastVerifiedBatch") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// GetLastVerifiedBatch is a free data retrieval call binding the contract method 0xc0ed84e0. -// -// Solidity: function getLastVerifiedBatch() view returns(uint64) -func (_ZkEVM *ZkEVMSession) GetLastVerifiedBatch() (uint64, error) { - return _ZkEVM.Contract.GetLastVerifiedBatch(&_ZkEVM.CallOpts) -} - -// GetLastVerifiedBatch is a free data retrieval call binding the contract method 0xc0ed84e0. -// -// Solidity: function getLastVerifiedBatch() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) GetLastVerifiedBatch() (uint64, error) { - return _ZkEVM.Contract.GetLastVerifiedBatch(&_ZkEVM.CallOpts) -} - -// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. -// -// Solidity: function globalExitRootManager() view returns(address) -func (_ZkEVM *ZkEVMCaller) GlobalExitRootManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "globalExitRootManager") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. -// -// Solidity: function globalExitRootManager() view returns(address) -func (_ZkEVM *ZkEVMSession) GlobalExitRootManager() (common.Address, error) { - return _ZkEVM.Contract.GlobalExitRootManager(&_ZkEVM.CallOpts) -} - -// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. -// -// Solidity: function globalExitRootManager() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) GlobalExitRootManager() (common.Address, error) { - return _ZkEVM.Contract.GlobalExitRootManager(&_ZkEVM.CallOpts) -} - -// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. -// -// Solidity: function isEmergencyState() view returns(bool) -func (_ZkEVM *ZkEVMCaller) IsEmergencyState(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "isEmergencyState") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. -// -// Solidity: function isEmergencyState() view returns(bool) -func (_ZkEVM *ZkEVMSession) IsEmergencyState() (bool, error) { - return _ZkEVM.Contract.IsEmergencyState(&_ZkEVM.CallOpts) -} - -// IsEmergencyState is a free data retrieval call binding the contract method 0x15064c96. -// -// Solidity: function isEmergencyState() view returns(bool) -func (_ZkEVM *ZkEVMCallerSession) IsEmergencyState() (bool, error) { - return _ZkEVM.Contract.IsEmergencyState(&_ZkEVM.CallOpts) -} - -// IsForcedBatchDisallowed is a free data retrieval call binding the contract method 0xed6b0104. -// -// Solidity: function isForcedBatchDisallowed() view returns(bool) -func (_ZkEVM *ZkEVMCaller) IsForcedBatchDisallowed(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "isForcedBatchDisallowed") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsForcedBatchDisallowed is a free data retrieval call binding the contract method 0xed6b0104. -// -// Solidity: function isForcedBatchDisallowed() view returns(bool) -func (_ZkEVM *ZkEVMSession) IsForcedBatchDisallowed() (bool, error) { - return _ZkEVM.Contract.IsForcedBatchDisallowed(&_ZkEVM.CallOpts) -} - -// IsForcedBatchDisallowed is a free data retrieval call binding the contract method 0xed6b0104. -// -// Solidity: function isForcedBatchDisallowed() view returns(bool) -func (_ZkEVM *ZkEVMCallerSession) IsForcedBatchDisallowed() (bool, error) { - return _ZkEVM.Contract.IsForcedBatchDisallowed(&_ZkEVM.CallOpts) -} - -// IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x383b3be8. -// -// Solidity: function isPendingStateConsolidable(uint64 pendingStateNum) view returns(bool) -func (_ZkEVM *ZkEVMCaller) IsPendingStateConsolidable(opts *bind.CallOpts, pendingStateNum uint64) (bool, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "isPendingStateConsolidable", pendingStateNum) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x383b3be8. -// -// Solidity: function isPendingStateConsolidable(uint64 pendingStateNum) view returns(bool) -func (_ZkEVM *ZkEVMSession) IsPendingStateConsolidable(pendingStateNum uint64) (bool, error) { - return _ZkEVM.Contract.IsPendingStateConsolidable(&_ZkEVM.CallOpts, pendingStateNum) -} - -// IsPendingStateConsolidable is a free data retrieval call binding the contract method 0x383b3be8. -// -// Solidity: function isPendingStateConsolidable(uint64 pendingStateNum) view returns(bool) -func (_ZkEVM *ZkEVMCallerSession) IsPendingStateConsolidable(pendingStateNum uint64) (bool, error) { - return _ZkEVM.Contract.IsPendingStateConsolidable(&_ZkEVM.CallOpts, pendingStateNum) -} - -// LastBatchSequenced is a free data retrieval call binding the contract method 0x423fa856. -// -// Solidity: function lastBatchSequenced() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastBatchSequenced(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastBatchSequenced") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastBatchSequenced is a free data retrieval call binding the contract method 0x423fa856. -// -// Solidity: function lastBatchSequenced() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastBatchSequenced() (uint64, error) { - return _ZkEVM.Contract.LastBatchSequenced(&_ZkEVM.CallOpts) -} - -// LastBatchSequenced is a free data retrieval call binding the contract method 0x423fa856. -// -// Solidity: function lastBatchSequenced() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastBatchSequenced() (uint64, error) { - return _ZkEVM.Contract.LastBatchSequenced(&_ZkEVM.CallOpts) -} - -// LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. -// -// Solidity: function lastForceBatch() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastForceBatch(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastForceBatch") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. -// -// Solidity: function lastForceBatch() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastForceBatch() (uint64, error) { - return _ZkEVM.Contract.LastForceBatch(&_ZkEVM.CallOpts) -} - -// LastForceBatch is a free data retrieval call binding the contract method 0xe7a7ed02. -// -// Solidity: function lastForceBatch() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastForceBatch() (uint64, error) { - return _ZkEVM.Contract.LastForceBatch(&_ZkEVM.CallOpts) -} - -// LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. -// -// Solidity: function lastForceBatchSequenced() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastForceBatchSequenced(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastForceBatchSequenced") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. -// -// Solidity: function lastForceBatchSequenced() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastForceBatchSequenced() (uint64, error) { - return _ZkEVM.Contract.LastForceBatchSequenced(&_ZkEVM.CallOpts) -} - -// LastForceBatchSequenced is a free data retrieval call binding the contract method 0x45605267. -// -// Solidity: function lastForceBatchSequenced() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastForceBatchSequenced() (uint64, error) { - return _ZkEVM.Contract.LastForceBatchSequenced(&_ZkEVM.CallOpts) -} - -// LastPendingState is a free data retrieval call binding the contract method 0x458c0477. -// -// Solidity: function lastPendingState() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastPendingState(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastPendingState") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastPendingState is a free data retrieval call binding the contract method 0x458c0477. -// -// Solidity: function lastPendingState() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastPendingState() (uint64, error) { - return _ZkEVM.Contract.LastPendingState(&_ZkEVM.CallOpts) -} - -// LastPendingState is a free data retrieval call binding the contract method 0x458c0477. -// -// Solidity: function lastPendingState() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastPendingState() (uint64, error) { - return _ZkEVM.Contract.LastPendingState(&_ZkEVM.CallOpts) -} - -// LastPendingStateConsolidated is a free data retrieval call binding the contract method 0x4a1a89a7. -// -// Solidity: function lastPendingStateConsolidated() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastPendingStateConsolidated(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastPendingStateConsolidated") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastPendingStateConsolidated is a free data retrieval call binding the contract method 0x4a1a89a7. -// -// Solidity: function lastPendingStateConsolidated() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastPendingStateConsolidated() (uint64, error) { - return _ZkEVM.Contract.LastPendingStateConsolidated(&_ZkEVM.CallOpts) -} - -// LastPendingStateConsolidated is a free data retrieval call binding the contract method 0x4a1a89a7. -// -// Solidity: function lastPendingStateConsolidated() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastPendingStateConsolidated() (uint64, error) { - return _ZkEVM.Contract.LastPendingStateConsolidated(&_ZkEVM.CallOpts) -} - -// LastTimestamp is a free data retrieval call binding the contract method 0x19d8ac61. -// -// Solidity: function lastTimestamp() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastTimestamp is a free data retrieval call binding the contract method 0x19d8ac61. -// -// Solidity: function lastTimestamp() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastTimestamp() (uint64, error) { - return _ZkEVM.Contract.LastTimestamp(&_ZkEVM.CallOpts) -} - -// LastTimestamp is a free data retrieval call binding the contract method 0x19d8ac61. -// -// Solidity: function lastTimestamp() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastTimestamp() (uint64, error) { - return _ZkEVM.Contract.LastTimestamp(&_ZkEVM.CallOpts) -} - -// LastVerifiedBatch is a free data retrieval call binding the contract method 0x7fcb3653. -// -// Solidity: function lastVerifiedBatch() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) LastVerifiedBatch(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "lastVerifiedBatch") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastVerifiedBatch is a free data retrieval call binding the contract method 0x7fcb3653. -// -// Solidity: function lastVerifiedBatch() view returns(uint64) -func (_ZkEVM *ZkEVMSession) LastVerifiedBatch() (uint64, error) { - return _ZkEVM.Contract.LastVerifiedBatch(&_ZkEVM.CallOpts) -} - -// LastVerifiedBatch is a free data retrieval call binding the contract method 0x7fcb3653. -// -// Solidity: function lastVerifiedBatch() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) LastVerifiedBatch() (uint64, error) { - return _ZkEVM.Contract.LastVerifiedBatch(&_ZkEVM.CallOpts) -} - -// Matic is a free data retrieval call binding the contract method 0xb6b0b097. -// -// Solidity: function matic() view returns(address) -func (_ZkEVM *ZkEVMCaller) Matic(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "matic") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Matic is a free data retrieval call binding the contract method 0xb6b0b097. -// -// Solidity: function matic() view returns(address) -func (_ZkEVM *ZkEVMSession) Matic() (common.Address, error) { - return _ZkEVM.Contract.Matic(&_ZkEVM.CallOpts) -} - -// Matic is a free data retrieval call binding the contract method 0xb6b0b097. -// -// Solidity: function matic() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) Matic() (common.Address, error) { - return _ZkEVM.Contract.Matic(&_ZkEVM.CallOpts) -} - -// MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. -// -// Solidity: function multiplierBatchFee() view returns(uint16) -func (_ZkEVM *ZkEVMCaller) MultiplierBatchFee(opts *bind.CallOpts) (uint16, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "multiplierBatchFee") - - if err != nil { - return *new(uint16), err - } - - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) - - return out0, err - -} - -// MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. -// -// Solidity: function multiplierBatchFee() view returns(uint16) -func (_ZkEVM *ZkEVMSession) MultiplierBatchFee() (uint16, error) { - return _ZkEVM.Contract.MultiplierBatchFee(&_ZkEVM.CallOpts) -} - -// MultiplierBatchFee is a free data retrieval call binding the contract method 0xafd23cbe. -// -// Solidity: function multiplierBatchFee() view returns(uint16) -func (_ZkEVM *ZkEVMCallerSession) MultiplierBatchFee() (uint16, error) { - return _ZkEVM.Contract.MultiplierBatchFee(&_ZkEVM.CallOpts) -} - -// NetworkName is a free data retrieval call binding the contract method 0x107bf28c. -// -// Solidity: function networkName() view returns(string) -func (_ZkEVM *ZkEVMCaller) NetworkName(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "networkName") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -// NetworkName is a free data retrieval call binding the contract method 0x107bf28c. -// -// Solidity: function networkName() view returns(string) -func (_ZkEVM *ZkEVMSession) NetworkName() (string, error) { - return _ZkEVM.Contract.NetworkName(&_ZkEVM.CallOpts) -} - -// NetworkName is a free data retrieval call binding the contract method 0x107bf28c. -// -// Solidity: function networkName() view returns(string) -func (_ZkEVM *ZkEVMCallerSession) NetworkName() (string, error) { - return _ZkEVM.Contract.NetworkName(&_ZkEVM.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_ZkEVM *ZkEVMCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_ZkEVM *ZkEVMSession) Owner() (common.Address, error) { - return _ZkEVM.Contract.Owner(&_ZkEVM.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) Owner() (common.Address, error) { - return _ZkEVM.Contract.Owner(&_ZkEVM.CallOpts) -} - -// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. -// -// Solidity: function pendingAdmin() view returns(address) -func (_ZkEVM *ZkEVMCaller) PendingAdmin(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "pendingAdmin") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. -// -// Solidity: function pendingAdmin() view returns(address) -func (_ZkEVM *ZkEVMSession) PendingAdmin() (common.Address, error) { - return _ZkEVM.Contract.PendingAdmin(&_ZkEVM.CallOpts) -} - -// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. -// -// Solidity: function pendingAdmin() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) PendingAdmin() (common.Address, error) { - return _ZkEVM.Contract.PendingAdmin(&_ZkEVM.CallOpts) -} - -// PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. -// -// Solidity: function pendingStateTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) PendingStateTimeout(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "pendingStateTimeout") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. -// -// Solidity: function pendingStateTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMSession) PendingStateTimeout() (uint64, error) { - return _ZkEVM.Contract.PendingStateTimeout(&_ZkEVM.CallOpts) -} - -// PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. -// -// Solidity: function pendingStateTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) PendingStateTimeout() (uint64, error) { - return _ZkEVM.Contract.PendingStateTimeout(&_ZkEVM.CallOpts) -} - -// PendingStateTransitions is a free data retrieval call binding the contract method 0x837a4738. -// -// Solidity: function pendingStateTransitions(uint256 ) view returns(uint64 timestamp, uint64 lastVerifiedBatch, bytes32 exitRoot, bytes32 stateRoot) -func (_ZkEVM *ZkEVMCaller) PendingStateTransitions(opts *bind.CallOpts, arg0 *big.Int) (struct { - Timestamp uint64 - LastVerifiedBatch uint64 - ExitRoot [32]byte - StateRoot [32]byte -}, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "pendingStateTransitions", arg0) - - outstruct := new(struct { - Timestamp uint64 - LastVerifiedBatch uint64 - ExitRoot [32]byte - StateRoot [32]byte - }) - if err != nil { - return *outstruct, err - } - - outstruct.Timestamp = *abi.ConvertType(out[0], new(uint64)).(*uint64) - outstruct.LastVerifiedBatch = *abi.ConvertType(out[1], new(uint64)).(*uint64) - outstruct.ExitRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) - outstruct.StateRoot = *abi.ConvertType(out[3], new([32]byte)).(*[32]byte) - - return *outstruct, err - -} - -// PendingStateTransitions is a free data retrieval call binding the contract method 0x837a4738. -// -// Solidity: function pendingStateTransitions(uint256 ) view returns(uint64 timestamp, uint64 lastVerifiedBatch, bytes32 exitRoot, bytes32 stateRoot) -func (_ZkEVM *ZkEVMSession) PendingStateTransitions(arg0 *big.Int) (struct { - Timestamp uint64 - LastVerifiedBatch uint64 - ExitRoot [32]byte - StateRoot [32]byte -}, error) { - return _ZkEVM.Contract.PendingStateTransitions(&_ZkEVM.CallOpts, arg0) -} - -// PendingStateTransitions is a free data retrieval call binding the contract method 0x837a4738. -// -// Solidity: function pendingStateTransitions(uint256 ) view returns(uint64 timestamp, uint64 lastVerifiedBatch, bytes32 exitRoot, bytes32 stateRoot) -func (_ZkEVM *ZkEVMCallerSession) PendingStateTransitions(arg0 *big.Int) (struct { - Timestamp uint64 - LastVerifiedBatch uint64 - ExitRoot [32]byte - StateRoot [32]byte -}, error) { - return _ZkEVM.Contract.PendingStateTransitions(&_ZkEVM.CallOpts, arg0) -} - -// RollupVerifier is a free data retrieval call binding the contract method 0xe8bf92ed. -// -// Solidity: function rollupVerifier() view returns(address) -func (_ZkEVM *ZkEVMCaller) RollupVerifier(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "rollupVerifier") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// RollupVerifier is a free data retrieval call binding the contract method 0xe8bf92ed. -// -// Solidity: function rollupVerifier() view returns(address) -func (_ZkEVM *ZkEVMSession) RollupVerifier() (common.Address, error) { - return _ZkEVM.Contract.RollupVerifier(&_ZkEVM.CallOpts) -} - -// RollupVerifier is a free data retrieval call binding the contract method 0xe8bf92ed. -// -// Solidity: function rollupVerifier() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) RollupVerifier() (common.Address, error) { - return _ZkEVM.Contract.RollupVerifier(&_ZkEVM.CallOpts) -} - -// SequencedBatches is a free data retrieval call binding the contract method 0xb4d63f58. -// -// Solidity: function sequencedBatches(uint64 ) view returns(bytes32 accInputHash, uint64 sequencedTimestamp, uint64 previousLastBatchSequenced) -func (_ZkEVM *ZkEVMCaller) SequencedBatches(opts *bind.CallOpts, arg0 uint64) (struct { - AccInputHash [32]byte - SequencedTimestamp uint64 - PreviousLastBatchSequenced uint64 -}, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "sequencedBatches", arg0) - - outstruct := new(struct { - AccInputHash [32]byte - SequencedTimestamp uint64 - PreviousLastBatchSequenced uint64 - }) - if err != nil { - return *outstruct, err - } - - outstruct.AccInputHash = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - outstruct.SequencedTimestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64) - outstruct.PreviousLastBatchSequenced = *abi.ConvertType(out[2], new(uint64)).(*uint64) - - return *outstruct, err - -} - -// SequencedBatches is a free data retrieval call binding the contract method 0xb4d63f58. -// -// Solidity: function sequencedBatches(uint64 ) view returns(bytes32 accInputHash, uint64 sequencedTimestamp, uint64 previousLastBatchSequenced) -func (_ZkEVM *ZkEVMSession) SequencedBatches(arg0 uint64) (struct { - AccInputHash [32]byte - SequencedTimestamp uint64 - PreviousLastBatchSequenced uint64 -}, error) { - return _ZkEVM.Contract.SequencedBatches(&_ZkEVM.CallOpts, arg0) -} - -// SequencedBatches is a free data retrieval call binding the contract method 0xb4d63f58. -// -// Solidity: function sequencedBatches(uint64 ) view returns(bytes32 accInputHash, uint64 sequencedTimestamp, uint64 previousLastBatchSequenced) -func (_ZkEVM *ZkEVMCallerSession) SequencedBatches(arg0 uint64) (struct { - AccInputHash [32]byte - SequencedTimestamp uint64 - PreviousLastBatchSequenced uint64 -}, error) { - return _ZkEVM.Contract.SequencedBatches(&_ZkEVM.CallOpts, arg0) -} - -// TrustedAggregator is a free data retrieval call binding the contract method 0x29878983. -// -// Solidity: function trustedAggregator() view returns(address) -func (_ZkEVM *ZkEVMCaller) TrustedAggregator(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "trustedAggregator") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// TrustedAggregator is a free data retrieval call binding the contract method 0x29878983. -// -// Solidity: function trustedAggregator() view returns(address) -func (_ZkEVM *ZkEVMSession) TrustedAggregator() (common.Address, error) { - return _ZkEVM.Contract.TrustedAggregator(&_ZkEVM.CallOpts) -} - -// TrustedAggregator is a free data retrieval call binding the contract method 0x29878983. -// -// Solidity: function trustedAggregator() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) TrustedAggregator() (common.Address, error) { - return _ZkEVM.Contract.TrustedAggregator(&_ZkEVM.CallOpts) -} - -// TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. -// -// Solidity: function trustedAggregatorTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) TrustedAggregatorTimeout(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "trustedAggregatorTimeout") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. -// -// Solidity: function trustedAggregatorTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMSession) TrustedAggregatorTimeout() (uint64, error) { - return _ZkEVM.Contract.TrustedAggregatorTimeout(&_ZkEVM.CallOpts) -} - -// TrustedAggregatorTimeout is a free data retrieval call binding the contract method 0x841b24d7. -// -// Solidity: function trustedAggregatorTimeout() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) TrustedAggregatorTimeout() (uint64, error) { - return _ZkEVM.Contract.TrustedAggregatorTimeout(&_ZkEVM.CallOpts) -} - -// TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. -// -// Solidity: function trustedSequencer() view returns(address) -func (_ZkEVM *ZkEVMCaller) TrustedSequencer(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "trustedSequencer") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. -// -// Solidity: function trustedSequencer() view returns(address) -func (_ZkEVM *ZkEVMSession) TrustedSequencer() (common.Address, error) { - return _ZkEVM.Contract.TrustedSequencer(&_ZkEVM.CallOpts) -} - -// TrustedSequencer is a free data retrieval call binding the contract method 0xcfa8ed47. -// -// Solidity: function trustedSequencer() view returns(address) -func (_ZkEVM *ZkEVMCallerSession) TrustedSequencer() (common.Address, error) { - return _ZkEVM.Contract.TrustedSequencer(&_ZkEVM.CallOpts) -} - -// TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. -// -// Solidity: function trustedSequencerURL() view returns(string) -func (_ZkEVM *ZkEVMCaller) TrustedSequencerURL(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "trustedSequencerURL") - - if err != nil { - return *new(string), err - } - - out0 := *abi.ConvertType(out[0], new(string)).(*string) - - return out0, err - -} - -// TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. -// -// Solidity: function trustedSequencerURL() view returns(string) -func (_ZkEVM *ZkEVMSession) TrustedSequencerURL() (string, error) { - return _ZkEVM.Contract.TrustedSequencerURL(&_ZkEVM.CallOpts) -} - -// TrustedSequencerURL is a free data retrieval call binding the contract method 0x542028d5. -// -// Solidity: function trustedSequencerURL() view returns(string) -func (_ZkEVM *ZkEVMCallerSession) TrustedSequencerURL() (string, error) { - return _ZkEVM.Contract.TrustedSequencerURL(&_ZkEVM.CallOpts) -} - -// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. -// -// Solidity: function verifyBatchTimeTarget() view returns(uint64) -func (_ZkEVM *ZkEVMCaller) VerifyBatchTimeTarget(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ZkEVM.contract.Call(opts, &out, "verifyBatchTimeTarget") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. -// -// Solidity: function verifyBatchTimeTarget() view returns(uint64) -func (_ZkEVM *ZkEVMSession) VerifyBatchTimeTarget() (uint64, error) { - return _ZkEVM.Contract.VerifyBatchTimeTarget(&_ZkEVM.CallOpts) -} - -// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. -// -// Solidity: function verifyBatchTimeTarget() view returns(uint64) -func (_ZkEVM *ZkEVMCallerSession) VerifyBatchTimeTarget() (uint64, error) { - return _ZkEVM.Contract.VerifyBatchTimeTarget(&_ZkEVM.CallOpts) -} - -// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. -// -// Solidity: function acceptAdminRole() returns() -func (_ZkEVM *ZkEVMTransactor) AcceptAdminRole(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "acceptAdminRole") -} - -// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. -// -// Solidity: function acceptAdminRole() returns() -func (_ZkEVM *ZkEVMSession) AcceptAdminRole() (*types.Transaction, error) { - return _ZkEVM.Contract.AcceptAdminRole(&_ZkEVM.TransactOpts) -} - -// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. -// -// Solidity: function acceptAdminRole() returns() -func (_ZkEVM *ZkEVMTransactorSession) AcceptAdminRole() (*types.Transaction, error) { - return _ZkEVM.Contract.AcceptAdminRole(&_ZkEVM.TransactOpts) -} - -// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x7215541a. -// -// Solidity: function activateEmergencyState(uint64 sequencedBatchNum) returns() -func (_ZkEVM *ZkEVMTransactor) ActivateEmergencyState(opts *bind.TransactOpts, sequencedBatchNum uint64) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "activateEmergencyState", sequencedBatchNum) -} - -// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x7215541a. -// -// Solidity: function activateEmergencyState(uint64 sequencedBatchNum) returns() -func (_ZkEVM *ZkEVMSession) ActivateEmergencyState(sequencedBatchNum uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.ActivateEmergencyState(&_ZkEVM.TransactOpts, sequencedBatchNum) -} - -// ActivateEmergencyState is a paid mutator transaction binding the contract method 0x7215541a. -// -// Solidity: function activateEmergencyState(uint64 sequencedBatchNum) returns() -func (_ZkEVM *ZkEVMTransactorSession) ActivateEmergencyState(sequencedBatchNum uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.ActivateEmergencyState(&_ZkEVM.TransactOpts, sequencedBatchNum) -} - -// ActivateForceBatches is a paid mutator transaction binding the contract method 0x5ec91958. -// -// Solidity: function activateForceBatches() returns() -func (_ZkEVM *ZkEVMTransactor) ActivateForceBatches(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "activateForceBatches") -} - -// ActivateForceBatches is a paid mutator transaction binding the contract method 0x5ec91958. -// -// Solidity: function activateForceBatches() returns() -func (_ZkEVM *ZkEVMSession) ActivateForceBatches() (*types.Transaction, error) { - return _ZkEVM.Contract.ActivateForceBatches(&_ZkEVM.TransactOpts) -} - -// ActivateForceBatches is a paid mutator transaction binding the contract method 0x5ec91958. -// -// Solidity: function activateForceBatches() returns() -func (_ZkEVM *ZkEVMTransactorSession) ActivateForceBatches() (*types.Transaction, error) { - return _ZkEVM.Contract.ActivateForceBatches(&_ZkEVM.TransactOpts) -} - -// ConsolidatePendingState is a paid mutator transaction binding the contract method 0x4a910e6a. -// -// Solidity: function consolidatePendingState(uint64 pendingStateNum) returns() -func (_ZkEVM *ZkEVMTransactor) ConsolidatePendingState(opts *bind.TransactOpts, pendingStateNum uint64) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "consolidatePendingState", pendingStateNum) -} - -// ConsolidatePendingState is a paid mutator transaction binding the contract method 0x4a910e6a. -// -// Solidity: function consolidatePendingState(uint64 pendingStateNum) returns() -func (_ZkEVM *ZkEVMSession) ConsolidatePendingState(pendingStateNum uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.ConsolidatePendingState(&_ZkEVM.TransactOpts, pendingStateNum) -} - -// ConsolidatePendingState is a paid mutator transaction binding the contract method 0x4a910e6a. -// -// Solidity: function consolidatePendingState(uint64 pendingStateNum) returns() -func (_ZkEVM *ZkEVMTransactorSession) ConsolidatePendingState(pendingStateNum uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.ConsolidatePendingState(&_ZkEVM.TransactOpts, pendingStateNum) -} - -// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. -// -// Solidity: function deactivateEmergencyState() returns() -func (_ZkEVM *ZkEVMTransactor) DeactivateEmergencyState(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "deactivateEmergencyState") -} - -// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. -// -// Solidity: function deactivateEmergencyState() returns() -func (_ZkEVM *ZkEVMSession) DeactivateEmergencyState() (*types.Transaction, error) { - return _ZkEVM.Contract.DeactivateEmergencyState(&_ZkEVM.TransactOpts) -} - -// DeactivateEmergencyState is a paid mutator transaction binding the contract method 0xdbc16976. -// -// Solidity: function deactivateEmergencyState() returns() -func (_ZkEVM *ZkEVMTransactorSession) DeactivateEmergencyState() (*types.Transaction, error) { - return _ZkEVM.Contract.DeactivateEmergencyState(&_ZkEVM.TransactOpts) -} - -// ForceBatch is a paid mutator transaction binding the contract method 0xeaeb077b. -// -// Solidity: function forceBatch(bytes transactions, uint256 maticAmount) returns() -func (_ZkEVM *ZkEVMTransactor) ForceBatch(opts *bind.TransactOpts, transactions []byte, maticAmount *big.Int) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "forceBatch", transactions, maticAmount) -} - -// ForceBatch is a paid mutator transaction binding the contract method 0xeaeb077b. -// -// Solidity: function forceBatch(bytes transactions, uint256 maticAmount) returns() -func (_ZkEVM *ZkEVMSession) ForceBatch(transactions []byte, maticAmount *big.Int) (*types.Transaction, error) { - return _ZkEVM.Contract.ForceBatch(&_ZkEVM.TransactOpts, transactions, maticAmount) -} - -// ForceBatch is a paid mutator transaction binding the contract method 0xeaeb077b. -// -// Solidity: function forceBatch(bytes transactions, uint256 maticAmount) returns() -func (_ZkEVM *ZkEVMTransactorSession) ForceBatch(transactions []byte, maticAmount *big.Int) (*types.Transaction, error) { - return _ZkEVM.Contract.ForceBatch(&_ZkEVM.TransactOpts, transactions, maticAmount) -} - -// Initialize is a paid mutator transaction binding the contract method 0xd2e129f9. -// -// Solidity: function initialize((address,address,uint64,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName, string _version) returns() -func (_ZkEVM *ZkEVMTransactor) Initialize(opts *bind.TransactOpts, initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string, _version string) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "initialize", initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName, _version) -} - -// Initialize is a paid mutator transaction binding the contract method 0xd2e129f9. -// -// Solidity: function initialize((address,address,uint64,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName, string _version) returns() -func (_ZkEVM *ZkEVMSession) Initialize(initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string, _version string) (*types.Transaction, error) { - return _ZkEVM.Contract.Initialize(&_ZkEVM.TransactOpts, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName, _version) -} - -// Initialize is a paid mutator transaction binding the contract method 0xd2e129f9. -// -// Solidity: function initialize((address,address,uint64,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName, string _version) returns() -func (_ZkEVM *ZkEVMTransactorSession) Initialize(initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string, _version string) (*types.Transaction, error) { - return _ZkEVM.Contract.Initialize(&_ZkEVM.TransactOpts, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName, _version) -} - -// OverridePendingState is a paid mutator transaction binding the contract method 0x2c1f816a. -// -// Solidity: function overridePendingState(uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactor) OverridePendingState(opts *bind.TransactOpts, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "overridePendingState", initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// OverridePendingState is a paid mutator transaction binding the contract method 0x2c1f816a. -// -// Solidity: function overridePendingState(uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMSession) OverridePendingState(initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.OverridePendingState(&_ZkEVM.TransactOpts, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// OverridePendingState is a paid mutator transaction binding the contract method 0x2c1f816a. -// -// Solidity: function overridePendingState(uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactorSession) OverridePendingState(initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.OverridePendingState(&_ZkEVM.TransactOpts, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// ProveNonDeterministicPendingState is a paid mutator transaction binding the contract method 0x9aa972a3. -// -// Solidity: function proveNonDeterministicPendingState(uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactor) ProveNonDeterministicPendingState(opts *bind.TransactOpts, initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "proveNonDeterministicPendingState", initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// ProveNonDeterministicPendingState is a paid mutator transaction binding the contract method 0x9aa972a3. -// -// Solidity: function proveNonDeterministicPendingState(uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMSession) ProveNonDeterministicPendingState(initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.ProveNonDeterministicPendingState(&_ZkEVM.TransactOpts, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// ProveNonDeterministicPendingState is a paid mutator transaction binding the contract method 0x9aa972a3. -// -// Solidity: function proveNonDeterministicPendingState(uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactorSession) ProveNonDeterministicPendingState(initPendingStateNum uint64, finalPendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.ProveNonDeterministicPendingState(&_ZkEVM.TransactOpts, initPendingStateNum, finalPendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_ZkEVM *ZkEVMTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_ZkEVM *ZkEVMSession) RenounceOwnership() (*types.Transaction, error) { - return _ZkEVM.Contract.RenounceOwnership(&_ZkEVM.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_ZkEVM *ZkEVMTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _ZkEVM.Contract.RenounceOwnership(&_ZkEVM.TransactOpts) -} - -// SequenceBatches is a paid mutator transaction binding the contract method 0x5e9145c9. -// -// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches, address l2Coinbase) returns() -func (_ZkEVM *ZkEVMTransactor) SequenceBatches(opts *bind.TransactOpts, batches []PolygonZkEVMBatchData, l2Coinbase common.Address) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "sequenceBatches", batches, l2Coinbase) -} - -// SequenceBatches is a paid mutator transaction binding the contract method 0x5e9145c9. -// -// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches, address l2Coinbase) returns() -func (_ZkEVM *ZkEVMSession) SequenceBatches(batches []PolygonZkEVMBatchData, l2Coinbase common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.SequenceBatches(&_ZkEVM.TransactOpts, batches, l2Coinbase) -} - -// SequenceBatches is a paid mutator transaction binding the contract method 0x5e9145c9. -// -// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches, address l2Coinbase) returns() -func (_ZkEVM *ZkEVMTransactorSession) SequenceBatches(batches []PolygonZkEVMBatchData, l2Coinbase common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.SequenceBatches(&_ZkEVM.TransactOpts, batches, l2Coinbase) -} - -// SequenceForceBatches is a paid mutator transaction binding the contract method 0xd8d1091b. -// -// Solidity: function sequenceForceBatches((bytes,bytes32,uint64)[] batches) returns() -func (_ZkEVM *ZkEVMTransactor) SequenceForceBatches(opts *bind.TransactOpts, batches []PolygonZkEVMForcedBatchData) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "sequenceForceBatches", batches) -} - -// SequenceForceBatches is a paid mutator transaction binding the contract method 0xd8d1091b. -// -// Solidity: function sequenceForceBatches((bytes,bytes32,uint64)[] batches) returns() -func (_ZkEVM *ZkEVMSession) SequenceForceBatches(batches []PolygonZkEVMForcedBatchData) (*types.Transaction, error) { - return _ZkEVM.Contract.SequenceForceBatches(&_ZkEVM.TransactOpts, batches) -} - -// SequenceForceBatches is a paid mutator transaction binding the contract method 0xd8d1091b. -// -// Solidity: function sequenceForceBatches((bytes,bytes32,uint64)[] batches) returns() -func (_ZkEVM *ZkEVMTransactorSession) SequenceForceBatches(batches []PolygonZkEVMForcedBatchData) (*types.Transaction, error) { - return _ZkEVM.Contract.SequenceForceBatches(&_ZkEVM.TransactOpts, batches) -} - -// SetForceBatchTimeout is a paid mutator transaction binding the contract method 0x4e487706. -// -// Solidity: function setForceBatchTimeout(uint64 newforceBatchTimeout) returns() -func (_ZkEVM *ZkEVMTransactor) SetForceBatchTimeout(opts *bind.TransactOpts, newforceBatchTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setForceBatchTimeout", newforceBatchTimeout) -} - -// SetForceBatchTimeout is a paid mutator transaction binding the contract method 0x4e487706. -// -// Solidity: function setForceBatchTimeout(uint64 newforceBatchTimeout) returns() -func (_ZkEVM *ZkEVMSession) SetForceBatchTimeout(newforceBatchTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetForceBatchTimeout(&_ZkEVM.TransactOpts, newforceBatchTimeout) -} - -// SetForceBatchTimeout is a paid mutator transaction binding the contract method 0x4e487706. -// -// Solidity: function setForceBatchTimeout(uint64 newforceBatchTimeout) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetForceBatchTimeout(newforceBatchTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetForceBatchTimeout(&_ZkEVM.TransactOpts, newforceBatchTimeout) -} - -// SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. -// -// Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() -func (_ZkEVM *ZkEVMTransactor) SetMultiplierBatchFee(opts *bind.TransactOpts, newMultiplierBatchFee uint16) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setMultiplierBatchFee", newMultiplierBatchFee) -} - -// SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. -// -// Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() -func (_ZkEVM *ZkEVMSession) SetMultiplierBatchFee(newMultiplierBatchFee uint16) (*types.Transaction, error) { - return _ZkEVM.Contract.SetMultiplierBatchFee(&_ZkEVM.TransactOpts, newMultiplierBatchFee) -} - -// SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. -// -// Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetMultiplierBatchFee(newMultiplierBatchFee uint16) (*types.Transaction, error) { - return _ZkEVM.Contract.SetMultiplierBatchFee(&_ZkEVM.TransactOpts, newMultiplierBatchFee) -} - -// SetPendingStateTimeout is a paid mutator transaction binding the contract method 0x9c9f3dfe. -// -// Solidity: function setPendingStateTimeout(uint64 newPendingStateTimeout) returns() -func (_ZkEVM *ZkEVMTransactor) SetPendingStateTimeout(opts *bind.TransactOpts, newPendingStateTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setPendingStateTimeout", newPendingStateTimeout) -} - -// SetPendingStateTimeout is a paid mutator transaction binding the contract method 0x9c9f3dfe. -// -// Solidity: function setPendingStateTimeout(uint64 newPendingStateTimeout) returns() -func (_ZkEVM *ZkEVMSession) SetPendingStateTimeout(newPendingStateTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetPendingStateTimeout(&_ZkEVM.TransactOpts, newPendingStateTimeout) -} - -// SetPendingStateTimeout is a paid mutator transaction binding the contract method 0x9c9f3dfe. -// -// Solidity: function setPendingStateTimeout(uint64 newPendingStateTimeout) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetPendingStateTimeout(newPendingStateTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetPendingStateTimeout(&_ZkEVM.TransactOpts, newPendingStateTimeout) -} - -// SetTrustedAggregator is a paid mutator transaction binding the contract method 0xf14916d6. -// -// Solidity: function setTrustedAggregator(address newTrustedAggregator) returns() -func (_ZkEVM *ZkEVMTransactor) SetTrustedAggregator(opts *bind.TransactOpts, newTrustedAggregator common.Address) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setTrustedAggregator", newTrustedAggregator) -} - -// SetTrustedAggregator is a paid mutator transaction binding the contract method 0xf14916d6. -// -// Solidity: function setTrustedAggregator(address newTrustedAggregator) returns() -func (_ZkEVM *ZkEVMSession) SetTrustedAggregator(newTrustedAggregator common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedAggregator(&_ZkEVM.TransactOpts, newTrustedAggregator) -} - -// SetTrustedAggregator is a paid mutator transaction binding the contract method 0xf14916d6. -// -// Solidity: function setTrustedAggregator(address newTrustedAggregator) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetTrustedAggregator(newTrustedAggregator common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedAggregator(&_ZkEVM.TransactOpts, newTrustedAggregator) -} - -// SetTrustedAggregatorTimeout is a paid mutator transaction binding the contract method 0x394218e9. -// -// Solidity: function setTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) returns() -func (_ZkEVM *ZkEVMTransactor) SetTrustedAggregatorTimeout(opts *bind.TransactOpts, newTrustedAggregatorTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setTrustedAggregatorTimeout", newTrustedAggregatorTimeout) -} - -// SetTrustedAggregatorTimeout is a paid mutator transaction binding the contract method 0x394218e9. -// -// Solidity: function setTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) returns() -func (_ZkEVM *ZkEVMSession) SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedAggregatorTimeout(&_ZkEVM.TransactOpts, newTrustedAggregatorTimeout) -} - -// SetTrustedAggregatorTimeout is a paid mutator transaction binding the contract method 0x394218e9. -// -// Solidity: function setTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedAggregatorTimeout(&_ZkEVM.TransactOpts, newTrustedAggregatorTimeout) -} - -// SetTrustedSequencer is a paid mutator transaction binding the contract method 0x6ff512cc. -// -// Solidity: function setTrustedSequencer(address newTrustedSequencer) returns() -func (_ZkEVM *ZkEVMTransactor) SetTrustedSequencer(opts *bind.TransactOpts, newTrustedSequencer common.Address) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setTrustedSequencer", newTrustedSequencer) -} - -// SetTrustedSequencer is a paid mutator transaction binding the contract method 0x6ff512cc. -// -// Solidity: function setTrustedSequencer(address newTrustedSequencer) returns() -func (_ZkEVM *ZkEVMSession) SetTrustedSequencer(newTrustedSequencer common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedSequencer(&_ZkEVM.TransactOpts, newTrustedSequencer) -} - -// SetTrustedSequencer is a paid mutator transaction binding the contract method 0x6ff512cc. -// -// Solidity: function setTrustedSequencer(address newTrustedSequencer) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetTrustedSequencer(newTrustedSequencer common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedSequencer(&_ZkEVM.TransactOpts, newTrustedSequencer) -} - -// SetTrustedSequencerURL is a paid mutator transaction binding the contract method 0xc89e42df. -// -// Solidity: function setTrustedSequencerURL(string newTrustedSequencerURL) returns() -func (_ZkEVM *ZkEVMTransactor) SetTrustedSequencerURL(opts *bind.TransactOpts, newTrustedSequencerURL string) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setTrustedSequencerURL", newTrustedSequencerURL) -} - -// SetTrustedSequencerURL is a paid mutator transaction binding the contract method 0xc89e42df. -// -// Solidity: function setTrustedSequencerURL(string newTrustedSequencerURL) returns() -func (_ZkEVM *ZkEVMSession) SetTrustedSequencerURL(newTrustedSequencerURL string) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedSequencerURL(&_ZkEVM.TransactOpts, newTrustedSequencerURL) -} - -// SetTrustedSequencerURL is a paid mutator transaction binding the contract method 0xc89e42df. -// -// Solidity: function setTrustedSequencerURL(string newTrustedSequencerURL) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetTrustedSequencerURL(newTrustedSequencerURL string) (*types.Transaction, error) { - return _ZkEVM.Contract.SetTrustedSequencerURL(&_ZkEVM.TransactOpts, newTrustedSequencerURL) -} - -// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. -// -// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() -func (_ZkEVM *ZkEVMTransactor) SetVerifyBatchTimeTarget(opts *bind.TransactOpts, newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "setVerifyBatchTimeTarget", newVerifyBatchTimeTarget) -} - -// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. -// -// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() -func (_ZkEVM *ZkEVMSession) SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetVerifyBatchTimeTarget(&_ZkEVM.TransactOpts, newVerifyBatchTimeTarget) -} - -// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. -// -// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() -func (_ZkEVM *ZkEVMTransactorSession) SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { - return _ZkEVM.Contract.SetVerifyBatchTimeTarget(&_ZkEVM.TransactOpts, newVerifyBatchTimeTarget) -} - -// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. -// -// Solidity: function transferAdminRole(address newPendingAdmin) returns() -func (_ZkEVM *ZkEVMTransactor) TransferAdminRole(opts *bind.TransactOpts, newPendingAdmin common.Address) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "transferAdminRole", newPendingAdmin) -} - -// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. -// -// Solidity: function transferAdminRole(address newPendingAdmin) returns() -func (_ZkEVM *ZkEVMSession) TransferAdminRole(newPendingAdmin common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.TransferAdminRole(&_ZkEVM.TransactOpts, newPendingAdmin) -} - -// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. -// -// Solidity: function transferAdminRole(address newPendingAdmin) returns() -func (_ZkEVM *ZkEVMTransactorSession) TransferAdminRole(newPendingAdmin common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.TransferAdminRole(&_ZkEVM.TransactOpts, newPendingAdmin) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_ZkEVM *ZkEVMTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_ZkEVM *ZkEVMSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.TransferOwnership(&_ZkEVM.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_ZkEVM *ZkEVMTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _ZkEVM.Contract.TransferOwnership(&_ZkEVM.TransactOpts, newOwner) -} - -// VerifyBatches is a paid mutator transaction binding the contract method 0x621dd411. -// -// Solidity: function verifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactor) VerifyBatches(opts *bind.TransactOpts, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "verifyBatches", pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// VerifyBatches is a paid mutator transaction binding the contract method 0x621dd411. -// -// Solidity: function verifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMSession) VerifyBatches(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.VerifyBatches(&_ZkEVM.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// VerifyBatches is a paid mutator transaction binding the contract method 0x621dd411. -// -// Solidity: function verifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactorSession) VerifyBatches(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.VerifyBatches(&_ZkEVM.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x2b0006fa. -// -// Solidity: function verifyBatchesTrustedAggregator(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactor) VerifyBatchesTrustedAggregator(opts *bind.TransactOpts, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.contract.Transact(opts, "verifyBatchesTrustedAggregator", pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x2b0006fa. -// -// Solidity: function verifyBatchesTrustedAggregator(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMSession) VerifyBatchesTrustedAggregator(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.VerifyBatchesTrustedAggregator(&_ZkEVM.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x2b0006fa. -// -// Solidity: function verifyBatchesTrustedAggregator(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] proof) returns() -func (_ZkEVM *ZkEVMTransactorSession) VerifyBatchesTrustedAggregator(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proof [24][32]byte) (*types.Transaction, error) { - return _ZkEVM.Contract.VerifyBatchesTrustedAggregator(&_ZkEVM.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proof) -} - -// ZkEVMAcceptAdminRoleIterator is returned from FilterAcceptAdminRole and is used to iterate over the raw logs and unpacked data for AcceptAdminRole events raised by the ZkEVM contract. -type ZkEVMAcceptAdminRoleIterator struct { - Event *ZkEVMAcceptAdminRole // 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 *ZkEVMAcceptAdminRoleIterator) 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(ZkEVMAcceptAdminRole) - 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(ZkEVMAcceptAdminRole) - 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 *ZkEVMAcceptAdminRoleIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMAcceptAdminRoleIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMAcceptAdminRole represents a AcceptAdminRole event raised by the ZkEVM contract. -type ZkEVMAcceptAdminRole struct { - NewAdmin common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAcceptAdminRole is a free log retrieval operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. -// -// Solidity: event AcceptAdminRole(address newAdmin) -func (_ZkEVM *ZkEVMFilterer) FilterAcceptAdminRole(opts *bind.FilterOpts) (*ZkEVMAcceptAdminRoleIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "AcceptAdminRole") - if err != nil { - return nil, err - } - return &ZkEVMAcceptAdminRoleIterator{contract: _ZkEVM.contract, event: "AcceptAdminRole", logs: logs, sub: sub}, nil -} - -// WatchAcceptAdminRole is a free log subscription operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. -// -// Solidity: event AcceptAdminRole(address newAdmin) -func (_ZkEVM *ZkEVMFilterer) WatchAcceptAdminRole(opts *bind.WatchOpts, sink chan<- *ZkEVMAcceptAdminRole) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "AcceptAdminRole") - 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(ZkEVMAcceptAdminRole) - if err := _ZkEVM.contract.UnpackLog(event, "AcceptAdminRole", 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 -} - -// ParseAcceptAdminRole is a log parse operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. -// -// Solidity: event AcceptAdminRole(address newAdmin) -func (_ZkEVM *ZkEVMFilterer) ParseAcceptAdminRole(log types.Log) (*ZkEVMAcceptAdminRole, error) { - event := new(ZkEVMAcceptAdminRole) - if err := _ZkEVM.contract.UnpackLog(event, "AcceptAdminRole", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMActivateForceBatchesIterator is returned from FilterActivateForceBatches and is used to iterate over the raw logs and unpacked data for ActivateForceBatches events raised by the ZkEVM contract. -type ZkEVMActivateForceBatchesIterator struct { - Event *ZkEVMActivateForceBatches // 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 *ZkEVMActivateForceBatchesIterator) 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(ZkEVMActivateForceBatches) - 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(ZkEVMActivateForceBatches) - 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 *ZkEVMActivateForceBatchesIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMActivateForceBatchesIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMActivateForceBatches represents a ActivateForceBatches event raised by the ZkEVM contract. -type ZkEVMActivateForceBatches struct { - Raw types.Log // Blockchain specific contextual infos -} - -// FilterActivateForceBatches is a free log retrieval operation binding the contract event 0x854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f. -// -// Solidity: event ActivateForceBatches() -func (_ZkEVM *ZkEVMFilterer) FilterActivateForceBatches(opts *bind.FilterOpts) (*ZkEVMActivateForceBatchesIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "ActivateForceBatches") - if err != nil { - return nil, err - } - return &ZkEVMActivateForceBatchesIterator{contract: _ZkEVM.contract, event: "ActivateForceBatches", logs: logs, sub: sub}, nil -} - -// WatchActivateForceBatches is a free log subscription operation binding the contract event 0x854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f. -// -// Solidity: event ActivateForceBatches() -func (_ZkEVM *ZkEVMFilterer) WatchActivateForceBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMActivateForceBatches) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "ActivateForceBatches") - 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(ZkEVMActivateForceBatches) - if err := _ZkEVM.contract.UnpackLog(event, "ActivateForceBatches", 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 -} - -// ParseActivateForceBatches is a log parse operation binding the contract event 0x854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f. -// -// Solidity: event ActivateForceBatches() -func (_ZkEVM *ZkEVMFilterer) ParseActivateForceBatches(log types.Log) (*ZkEVMActivateForceBatches, error) { - event := new(ZkEVMActivateForceBatches) - if err := _ZkEVM.contract.UnpackLog(event, "ActivateForceBatches", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMConsolidatePendingStateIterator is returned from FilterConsolidatePendingState and is used to iterate over the raw logs and unpacked data for ConsolidatePendingState events raised by the ZkEVM contract. -type ZkEVMConsolidatePendingStateIterator struct { - Event *ZkEVMConsolidatePendingState // 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 *ZkEVMConsolidatePendingStateIterator) 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(ZkEVMConsolidatePendingState) - 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(ZkEVMConsolidatePendingState) - 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 *ZkEVMConsolidatePendingStateIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMConsolidatePendingStateIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMConsolidatePendingState represents a ConsolidatePendingState event raised by the ZkEVM contract. -type ZkEVMConsolidatePendingState struct { - NumBatch uint64 - StateRoot [32]byte - PendingStateNum uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterConsolidatePendingState is a free log retrieval operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. -// -// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) -func (_ZkEVM *ZkEVMFilterer) FilterConsolidatePendingState(opts *bind.FilterOpts, numBatch []uint64, pendingStateNum []uint64) (*ZkEVMConsolidatePendingStateIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var pendingStateNumRule []interface{} - for _, pendingStateNumItem := range pendingStateNum { - pendingStateNumRule = append(pendingStateNumRule, pendingStateNumItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "ConsolidatePendingState", numBatchRule, pendingStateNumRule) - if err != nil { - return nil, err - } - return &ZkEVMConsolidatePendingStateIterator{contract: _ZkEVM.contract, event: "ConsolidatePendingState", logs: logs, sub: sub}, nil -} - -// WatchConsolidatePendingState is a free log subscription operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. -// -// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) -func (_ZkEVM *ZkEVMFilterer) WatchConsolidatePendingState(opts *bind.WatchOpts, sink chan<- *ZkEVMConsolidatePendingState, numBatch []uint64, pendingStateNum []uint64) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var pendingStateNumRule []interface{} - for _, pendingStateNumItem := range pendingStateNum { - pendingStateNumRule = append(pendingStateNumRule, pendingStateNumItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "ConsolidatePendingState", numBatchRule, pendingStateNumRule) - 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(ZkEVMConsolidatePendingState) - if err := _ZkEVM.contract.UnpackLog(event, "ConsolidatePendingState", 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 -} - -// ParseConsolidatePendingState is a log parse operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. -// -// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) -func (_ZkEVM *ZkEVMFilterer) ParseConsolidatePendingState(log types.Log) (*ZkEVMConsolidatePendingState, error) { - event := new(ZkEVMConsolidatePendingState) - if err := _ZkEVM.contract.UnpackLog(event, "ConsolidatePendingState", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMEmergencyStateActivatedIterator is returned from FilterEmergencyStateActivated and is used to iterate over the raw logs and unpacked data for EmergencyStateActivated events raised by the ZkEVM contract. -type ZkEVMEmergencyStateActivatedIterator struct { - Event *ZkEVMEmergencyStateActivated // 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 *ZkEVMEmergencyStateActivatedIterator) 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(ZkEVMEmergencyStateActivated) - 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(ZkEVMEmergencyStateActivated) - 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 *ZkEVMEmergencyStateActivatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMEmergencyStateActivatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMEmergencyStateActivated represents a EmergencyStateActivated event raised by the ZkEVM contract. -type ZkEVMEmergencyStateActivated struct { - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEmergencyStateActivated is a free log retrieval operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. -// -// Solidity: event EmergencyStateActivated() -func (_ZkEVM *ZkEVMFilterer) FilterEmergencyStateActivated(opts *bind.FilterOpts) (*ZkEVMEmergencyStateActivatedIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "EmergencyStateActivated") - if err != nil { - return nil, err - } - return &ZkEVMEmergencyStateActivatedIterator{contract: _ZkEVM.contract, event: "EmergencyStateActivated", logs: logs, sub: sub}, nil -} - -// WatchEmergencyStateActivated is a free log subscription operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. -// -// Solidity: event EmergencyStateActivated() -func (_ZkEVM *ZkEVMFilterer) WatchEmergencyStateActivated(opts *bind.WatchOpts, sink chan<- *ZkEVMEmergencyStateActivated) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "EmergencyStateActivated") - 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(ZkEVMEmergencyStateActivated) - if err := _ZkEVM.contract.UnpackLog(event, "EmergencyStateActivated", 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 -} - -// ParseEmergencyStateActivated is a log parse operation binding the contract event 0x2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497. -// -// Solidity: event EmergencyStateActivated() -func (_ZkEVM *ZkEVMFilterer) ParseEmergencyStateActivated(log types.Log) (*ZkEVMEmergencyStateActivated, error) { - event := new(ZkEVMEmergencyStateActivated) - if err := _ZkEVM.contract.UnpackLog(event, "EmergencyStateActivated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMEmergencyStateDeactivatedIterator is returned from FilterEmergencyStateDeactivated and is used to iterate over the raw logs and unpacked data for EmergencyStateDeactivated events raised by the ZkEVM contract. -type ZkEVMEmergencyStateDeactivatedIterator struct { - Event *ZkEVMEmergencyStateDeactivated // 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 *ZkEVMEmergencyStateDeactivatedIterator) 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(ZkEVMEmergencyStateDeactivated) - 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(ZkEVMEmergencyStateDeactivated) - 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 *ZkEVMEmergencyStateDeactivatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMEmergencyStateDeactivatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMEmergencyStateDeactivated represents a EmergencyStateDeactivated event raised by the ZkEVM contract. -type ZkEVMEmergencyStateDeactivated struct { - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEmergencyStateDeactivated is a free log retrieval operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. -// -// Solidity: event EmergencyStateDeactivated() -func (_ZkEVM *ZkEVMFilterer) FilterEmergencyStateDeactivated(opts *bind.FilterOpts) (*ZkEVMEmergencyStateDeactivatedIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "EmergencyStateDeactivated") - if err != nil { - return nil, err - } - return &ZkEVMEmergencyStateDeactivatedIterator{contract: _ZkEVM.contract, event: "EmergencyStateDeactivated", logs: logs, sub: sub}, nil -} - -// WatchEmergencyStateDeactivated is a free log subscription operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. -// -// Solidity: event EmergencyStateDeactivated() -func (_ZkEVM *ZkEVMFilterer) WatchEmergencyStateDeactivated(opts *bind.WatchOpts, sink chan<- *ZkEVMEmergencyStateDeactivated) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "EmergencyStateDeactivated") - 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(ZkEVMEmergencyStateDeactivated) - if err := _ZkEVM.contract.UnpackLog(event, "EmergencyStateDeactivated", 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 -} - -// ParseEmergencyStateDeactivated is a log parse operation binding the contract event 0x1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3. -// -// Solidity: event EmergencyStateDeactivated() -func (_ZkEVM *ZkEVMFilterer) ParseEmergencyStateDeactivated(log types.Log) (*ZkEVMEmergencyStateDeactivated, error) { - event := new(ZkEVMEmergencyStateDeactivated) - if err := _ZkEVM.contract.UnpackLog(event, "EmergencyStateDeactivated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMForceBatchIterator is returned from FilterForceBatch and is used to iterate over the raw logs and unpacked data for ForceBatch events raised by the ZkEVM contract. -type ZkEVMForceBatchIterator struct { - Event *ZkEVMForceBatch // 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 *ZkEVMForceBatchIterator) 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(ZkEVMForceBatch) - 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(ZkEVMForceBatch) - 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 *ZkEVMForceBatchIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMForceBatchIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMForceBatch represents a ForceBatch event raised by the ZkEVM contract. -type ZkEVMForceBatch struct { - ForceBatchNum uint64 - LastGlobalExitRoot [32]byte - Sequencer common.Address - Transactions []byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterForceBatch is a free log retrieval operation binding the contract event 0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931. -// -// Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) -func (_ZkEVM *ZkEVMFilterer) FilterForceBatch(opts *bind.FilterOpts, forceBatchNum []uint64) (*ZkEVMForceBatchIterator, error) { - - var forceBatchNumRule []interface{} - for _, forceBatchNumItem := range forceBatchNum { - forceBatchNumRule = append(forceBatchNumRule, forceBatchNumItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "ForceBatch", forceBatchNumRule) - if err != nil { - return nil, err - } - return &ZkEVMForceBatchIterator{contract: _ZkEVM.contract, event: "ForceBatch", logs: logs, sub: sub}, nil -} - -// WatchForceBatch is a free log subscription operation binding the contract event 0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931. -// -// Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) -func (_ZkEVM *ZkEVMFilterer) WatchForceBatch(opts *bind.WatchOpts, sink chan<- *ZkEVMForceBatch, forceBatchNum []uint64) (event.Subscription, error) { - - var forceBatchNumRule []interface{} - for _, forceBatchNumItem := range forceBatchNum { - forceBatchNumRule = append(forceBatchNumRule, forceBatchNumItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "ForceBatch", forceBatchNumRule) - 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(ZkEVMForceBatch) - if err := _ZkEVM.contract.UnpackLog(event, "ForceBatch", 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 -} - -// ParseForceBatch is a log parse operation binding the contract event 0xf94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931. -// -// Solidity: event ForceBatch(uint64 indexed forceBatchNum, bytes32 lastGlobalExitRoot, address sequencer, bytes transactions) -func (_ZkEVM *ZkEVMFilterer) ParseForceBatch(log types.Log) (*ZkEVMForceBatch, error) { - event := new(ZkEVMForceBatch) - if err := _ZkEVM.contract.UnpackLog(event, "ForceBatch", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ZkEVM contract. -type ZkEVMInitializedIterator struct { - Event *ZkEVMInitialized // 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 *ZkEVMInitializedIterator) 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(ZkEVMInitialized) - 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(ZkEVMInitialized) - 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 *ZkEVMInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMInitialized represents a Initialized event raised by the ZkEVM contract. -type ZkEVMInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_ZkEVM *ZkEVMFilterer) FilterInitialized(opts *bind.FilterOpts) (*ZkEVMInitializedIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &ZkEVMInitializedIterator{contract: _ZkEVM.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_ZkEVM *ZkEVMFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ZkEVMInitialized) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ZkEVMInitialized) - if err := _ZkEVM.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_ZkEVM *ZkEVMFilterer) ParseInitialized(log types.Log) (*ZkEVMInitialized, error) { - event := new(ZkEVMInitialized) - if err := _ZkEVM.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMOverridePendingStateIterator is returned from FilterOverridePendingState and is used to iterate over the raw logs and unpacked data for OverridePendingState events raised by the ZkEVM contract. -type ZkEVMOverridePendingStateIterator struct { - Event *ZkEVMOverridePendingState // 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 *ZkEVMOverridePendingStateIterator) 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(ZkEVMOverridePendingState) - 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(ZkEVMOverridePendingState) - 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 *ZkEVMOverridePendingStateIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMOverridePendingStateIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMOverridePendingState represents a OverridePendingState event raised by the ZkEVM contract. -type ZkEVMOverridePendingState struct { - NumBatch uint64 - StateRoot [32]byte - Aggregator common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOverridePendingState is a free log retrieval operation binding the contract event 0xcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf72. -// -// Solidity: event OverridePendingState(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) FilterOverridePendingState(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*ZkEVMOverridePendingStateIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var aggregatorRule []interface{} - for _, aggregatorItem := range aggregator { - aggregatorRule = append(aggregatorRule, aggregatorItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "OverridePendingState", numBatchRule, aggregatorRule) - if err != nil { - return nil, err - } - return &ZkEVMOverridePendingStateIterator{contract: _ZkEVM.contract, event: "OverridePendingState", logs: logs, sub: sub}, nil -} - -// WatchOverridePendingState is a free log subscription operation binding the contract event 0xcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf72. -// -// Solidity: event OverridePendingState(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) WatchOverridePendingState(opts *bind.WatchOpts, sink chan<- *ZkEVMOverridePendingState, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var aggregatorRule []interface{} - for _, aggregatorItem := range aggregator { - aggregatorRule = append(aggregatorRule, aggregatorItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "OverridePendingState", numBatchRule, aggregatorRule) - 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(ZkEVMOverridePendingState) - if err := _ZkEVM.contract.UnpackLog(event, "OverridePendingState", 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 -} - -// ParseOverridePendingState is a log parse operation binding the contract event 0xcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf72. -// -// Solidity: event OverridePendingState(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) ParseOverridePendingState(log types.Log) (*ZkEVMOverridePendingState, error) { - event := new(ZkEVMOverridePendingState) - if err := _ZkEVM.contract.UnpackLog(event, "OverridePendingState", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ZkEVM contract. -type ZkEVMOwnershipTransferredIterator struct { - Event *ZkEVMOwnershipTransferred // 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 *ZkEVMOwnershipTransferredIterator) 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(ZkEVMOwnershipTransferred) - 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(ZkEVMOwnershipTransferred) - 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 *ZkEVMOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMOwnershipTransferred represents a OwnershipTransferred event raised by the ZkEVM contract. -type ZkEVMOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_ZkEVM *ZkEVMFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ZkEVMOwnershipTransferredIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &ZkEVMOwnershipTransferredIterator{contract: _ZkEVM.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_ZkEVM *ZkEVMFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ZkEVMOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ZkEVMOwnershipTransferred) - if err := _ZkEVM.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_ZkEVM *ZkEVMFilterer) ParseOwnershipTransferred(log types.Log) (*ZkEVMOwnershipTransferred, error) { - event := new(ZkEVMOwnershipTransferred) - if err := _ZkEVM.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMProveNonDeterministicPendingStateIterator is returned from FilterProveNonDeterministicPendingState and is used to iterate over the raw logs and unpacked data for ProveNonDeterministicPendingState events raised by the ZkEVM contract. -type ZkEVMProveNonDeterministicPendingStateIterator struct { - Event *ZkEVMProveNonDeterministicPendingState // 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 *ZkEVMProveNonDeterministicPendingStateIterator) 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(ZkEVMProveNonDeterministicPendingState) - 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(ZkEVMProveNonDeterministicPendingState) - 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 *ZkEVMProveNonDeterministicPendingStateIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMProveNonDeterministicPendingStateIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMProveNonDeterministicPendingState represents a ProveNonDeterministicPendingState event raised by the ZkEVM contract. -type ZkEVMProveNonDeterministicPendingState struct { - StoredStateRoot [32]byte - ProvedStateRoot [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterProveNonDeterministicPendingState is a free log retrieval operation binding the contract event 0x1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010. -// -// Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) -func (_ZkEVM *ZkEVMFilterer) FilterProveNonDeterministicPendingState(opts *bind.FilterOpts) (*ZkEVMProveNonDeterministicPendingStateIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "ProveNonDeterministicPendingState") - if err != nil { - return nil, err - } - return &ZkEVMProveNonDeterministicPendingStateIterator{contract: _ZkEVM.contract, event: "ProveNonDeterministicPendingState", logs: logs, sub: sub}, nil -} - -// WatchProveNonDeterministicPendingState is a free log subscription operation binding the contract event 0x1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010. -// -// Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) -func (_ZkEVM *ZkEVMFilterer) WatchProveNonDeterministicPendingState(opts *bind.WatchOpts, sink chan<- *ZkEVMProveNonDeterministicPendingState) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "ProveNonDeterministicPendingState") - 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(ZkEVMProveNonDeterministicPendingState) - if err := _ZkEVM.contract.UnpackLog(event, "ProveNonDeterministicPendingState", 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 -} - -// ParseProveNonDeterministicPendingState is a log parse operation binding the contract event 0x1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010. -// -// Solidity: event ProveNonDeterministicPendingState(bytes32 storedStateRoot, bytes32 provedStateRoot) -func (_ZkEVM *ZkEVMFilterer) ParseProveNonDeterministicPendingState(log types.Log) (*ZkEVMProveNonDeterministicPendingState, error) { - event := new(ZkEVMProveNonDeterministicPendingState) - if err := _ZkEVM.contract.UnpackLog(event, "ProveNonDeterministicPendingState", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSequenceBatchesIterator is returned from FilterSequenceBatches and is used to iterate over the raw logs and unpacked data for SequenceBatches events raised by the ZkEVM contract. -type ZkEVMSequenceBatchesIterator struct { - Event *ZkEVMSequenceBatches // 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 *ZkEVMSequenceBatchesIterator) 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(ZkEVMSequenceBatches) - 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(ZkEVMSequenceBatches) - 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 *ZkEVMSequenceBatchesIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSequenceBatchesIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSequenceBatches represents a SequenceBatches event raised by the ZkEVM contract. -type ZkEVMSequenceBatches struct { - NumBatch uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSequenceBatches is a free log retrieval operation binding the contract event 0x303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce. -// -// Solidity: event SequenceBatches(uint64 indexed numBatch) -func (_ZkEVM *ZkEVMFilterer) FilterSequenceBatches(opts *bind.FilterOpts, numBatch []uint64) (*ZkEVMSequenceBatchesIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SequenceBatches", numBatchRule) - if err != nil { - return nil, err - } - return &ZkEVMSequenceBatchesIterator{contract: _ZkEVM.contract, event: "SequenceBatches", logs: logs, sub: sub}, nil -} - -// WatchSequenceBatches is a free log subscription operation binding the contract event 0x303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce. -// -// Solidity: event SequenceBatches(uint64 indexed numBatch) -func (_ZkEVM *ZkEVMFilterer) WatchSequenceBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMSequenceBatches, numBatch []uint64) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SequenceBatches", numBatchRule) - 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(ZkEVMSequenceBatches) - if err := _ZkEVM.contract.UnpackLog(event, "SequenceBatches", 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 -} - -// ParseSequenceBatches is a log parse operation binding the contract event 0x303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce. -// -// Solidity: event SequenceBatches(uint64 indexed numBatch) -func (_ZkEVM *ZkEVMFilterer) ParseSequenceBatches(log types.Log) (*ZkEVMSequenceBatches, error) { - event := new(ZkEVMSequenceBatches) - if err := _ZkEVM.contract.UnpackLog(event, "SequenceBatches", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSequenceForceBatchesIterator is returned from FilterSequenceForceBatches and is used to iterate over the raw logs and unpacked data for SequenceForceBatches events raised by the ZkEVM contract. -type ZkEVMSequenceForceBatchesIterator struct { - Event *ZkEVMSequenceForceBatches // 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 *ZkEVMSequenceForceBatchesIterator) 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(ZkEVMSequenceForceBatches) - 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(ZkEVMSequenceForceBatches) - 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 *ZkEVMSequenceForceBatchesIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSequenceForceBatchesIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSequenceForceBatches represents a SequenceForceBatches event raised by the ZkEVM contract. -type ZkEVMSequenceForceBatches struct { - NumBatch uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSequenceForceBatches is a free log retrieval operation binding the contract event 0x648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4. -// -// Solidity: event SequenceForceBatches(uint64 indexed numBatch) -func (_ZkEVM *ZkEVMFilterer) FilterSequenceForceBatches(opts *bind.FilterOpts, numBatch []uint64) (*ZkEVMSequenceForceBatchesIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SequenceForceBatches", numBatchRule) - if err != nil { - return nil, err - } - return &ZkEVMSequenceForceBatchesIterator{contract: _ZkEVM.contract, event: "SequenceForceBatches", logs: logs, sub: sub}, nil -} - -// WatchSequenceForceBatches is a free log subscription operation binding the contract event 0x648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4. -// -// Solidity: event SequenceForceBatches(uint64 indexed numBatch) -func (_ZkEVM *ZkEVMFilterer) WatchSequenceForceBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMSequenceForceBatches, numBatch []uint64) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SequenceForceBatches", numBatchRule) - 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(ZkEVMSequenceForceBatches) - if err := _ZkEVM.contract.UnpackLog(event, "SequenceForceBatches", 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 -} - -// ParseSequenceForceBatches is a log parse operation binding the contract event 0x648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4. -// -// Solidity: event SequenceForceBatches(uint64 indexed numBatch) -func (_ZkEVM *ZkEVMFilterer) ParseSequenceForceBatches(log types.Log) (*ZkEVMSequenceForceBatches, error) { - event := new(ZkEVMSequenceForceBatches) - if err := _ZkEVM.contract.UnpackLog(event, "SequenceForceBatches", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetForceBatchTimeoutIterator is returned from FilterSetForceBatchTimeout and is used to iterate over the raw logs and unpacked data for SetForceBatchTimeout events raised by the ZkEVM contract. -type ZkEVMSetForceBatchTimeoutIterator struct { - Event *ZkEVMSetForceBatchTimeout // 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 *ZkEVMSetForceBatchTimeoutIterator) 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(ZkEVMSetForceBatchTimeout) - 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(ZkEVMSetForceBatchTimeout) - 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 *ZkEVMSetForceBatchTimeoutIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetForceBatchTimeoutIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetForceBatchTimeout represents a SetForceBatchTimeout event raised by the ZkEVM contract. -type ZkEVMSetForceBatchTimeout struct { - NewforceBatchTimeout uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetForceBatchTimeout is a free log retrieval operation binding the contract event 0xa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b. -// -// Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) -func (_ZkEVM *ZkEVMFilterer) FilterSetForceBatchTimeout(opts *bind.FilterOpts) (*ZkEVMSetForceBatchTimeoutIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetForceBatchTimeout") - if err != nil { - return nil, err - } - return &ZkEVMSetForceBatchTimeoutIterator{contract: _ZkEVM.contract, event: "SetForceBatchTimeout", logs: logs, sub: sub}, nil -} - -// WatchSetForceBatchTimeout is a free log subscription operation binding the contract event 0xa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b. -// -// Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) -func (_ZkEVM *ZkEVMFilterer) WatchSetForceBatchTimeout(opts *bind.WatchOpts, sink chan<- *ZkEVMSetForceBatchTimeout) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetForceBatchTimeout") - 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(ZkEVMSetForceBatchTimeout) - if err := _ZkEVM.contract.UnpackLog(event, "SetForceBatchTimeout", 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 -} - -// ParseSetForceBatchTimeout is a log parse operation binding the contract event 0xa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b. -// -// Solidity: event SetForceBatchTimeout(uint64 newforceBatchTimeout) -func (_ZkEVM *ZkEVMFilterer) ParseSetForceBatchTimeout(log types.Log) (*ZkEVMSetForceBatchTimeout, error) { - event := new(ZkEVMSetForceBatchTimeout) - if err := _ZkEVM.contract.UnpackLog(event, "SetForceBatchTimeout", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetMultiplierBatchFeeIterator is returned from FilterSetMultiplierBatchFee and is used to iterate over the raw logs and unpacked data for SetMultiplierBatchFee events raised by the ZkEVM contract. -type ZkEVMSetMultiplierBatchFeeIterator struct { - Event *ZkEVMSetMultiplierBatchFee // 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 *ZkEVMSetMultiplierBatchFeeIterator) 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(ZkEVMSetMultiplierBatchFee) - 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(ZkEVMSetMultiplierBatchFee) - 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 *ZkEVMSetMultiplierBatchFeeIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetMultiplierBatchFeeIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetMultiplierBatchFee represents a SetMultiplierBatchFee event raised by the ZkEVM contract. -type ZkEVMSetMultiplierBatchFee struct { - NewMultiplierBatchFee uint16 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetMultiplierBatchFee is a free log retrieval operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. -// -// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) -func (_ZkEVM *ZkEVMFilterer) FilterSetMultiplierBatchFee(opts *bind.FilterOpts) (*ZkEVMSetMultiplierBatchFeeIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetMultiplierBatchFee") - if err != nil { - return nil, err - } - return &ZkEVMSetMultiplierBatchFeeIterator{contract: _ZkEVM.contract, event: "SetMultiplierBatchFee", logs: logs, sub: sub}, nil -} - -// WatchSetMultiplierBatchFee is a free log subscription operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. -// -// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) -func (_ZkEVM *ZkEVMFilterer) WatchSetMultiplierBatchFee(opts *bind.WatchOpts, sink chan<- *ZkEVMSetMultiplierBatchFee) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetMultiplierBatchFee") - 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(ZkEVMSetMultiplierBatchFee) - if err := _ZkEVM.contract.UnpackLog(event, "SetMultiplierBatchFee", 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 -} - -// ParseSetMultiplierBatchFee is a log parse operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. -// -// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) -func (_ZkEVM *ZkEVMFilterer) ParseSetMultiplierBatchFee(log types.Log) (*ZkEVMSetMultiplierBatchFee, error) { - event := new(ZkEVMSetMultiplierBatchFee) - if err := _ZkEVM.contract.UnpackLog(event, "SetMultiplierBatchFee", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetPendingStateTimeoutIterator is returned from FilterSetPendingStateTimeout and is used to iterate over the raw logs and unpacked data for SetPendingStateTimeout events raised by the ZkEVM contract. -type ZkEVMSetPendingStateTimeoutIterator struct { - Event *ZkEVMSetPendingStateTimeout // 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 *ZkEVMSetPendingStateTimeoutIterator) 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(ZkEVMSetPendingStateTimeout) - 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(ZkEVMSetPendingStateTimeout) - 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 *ZkEVMSetPendingStateTimeoutIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetPendingStateTimeoutIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetPendingStateTimeout represents a SetPendingStateTimeout event raised by the ZkEVM contract. -type ZkEVMSetPendingStateTimeout struct { - NewPendingStateTimeout uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetPendingStateTimeout is a free log retrieval operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. -// -// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) -func (_ZkEVM *ZkEVMFilterer) FilterSetPendingStateTimeout(opts *bind.FilterOpts) (*ZkEVMSetPendingStateTimeoutIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetPendingStateTimeout") - if err != nil { - return nil, err - } - return &ZkEVMSetPendingStateTimeoutIterator{contract: _ZkEVM.contract, event: "SetPendingStateTimeout", logs: logs, sub: sub}, nil -} - -// WatchSetPendingStateTimeout is a free log subscription operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. -// -// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) -func (_ZkEVM *ZkEVMFilterer) WatchSetPendingStateTimeout(opts *bind.WatchOpts, sink chan<- *ZkEVMSetPendingStateTimeout) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetPendingStateTimeout") - 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(ZkEVMSetPendingStateTimeout) - if err := _ZkEVM.contract.UnpackLog(event, "SetPendingStateTimeout", 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 -} - -// ParseSetPendingStateTimeout is a log parse operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. -// -// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) -func (_ZkEVM *ZkEVMFilterer) ParseSetPendingStateTimeout(log types.Log) (*ZkEVMSetPendingStateTimeout, error) { - event := new(ZkEVMSetPendingStateTimeout) - if err := _ZkEVM.contract.UnpackLog(event, "SetPendingStateTimeout", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetTrustedAggregatorIterator is returned from FilterSetTrustedAggregator and is used to iterate over the raw logs and unpacked data for SetTrustedAggregator events raised by the ZkEVM contract. -type ZkEVMSetTrustedAggregatorIterator struct { - Event *ZkEVMSetTrustedAggregator // 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 *ZkEVMSetTrustedAggregatorIterator) 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(ZkEVMSetTrustedAggregator) - 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(ZkEVMSetTrustedAggregator) - 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 *ZkEVMSetTrustedAggregatorIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetTrustedAggregatorIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetTrustedAggregator represents a SetTrustedAggregator event raised by the ZkEVM contract. -type ZkEVMSetTrustedAggregator struct { - NewTrustedAggregator common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetTrustedAggregator is a free log retrieval operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. -// -// Solidity: event SetTrustedAggregator(address newTrustedAggregator) -func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedAggregator(opts *bind.FilterOpts) (*ZkEVMSetTrustedAggregatorIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedAggregator") - if err != nil { - return nil, err - } - return &ZkEVMSetTrustedAggregatorIterator{contract: _ZkEVM.contract, event: "SetTrustedAggregator", logs: logs, sub: sub}, nil -} - -// WatchSetTrustedAggregator is a free log subscription operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. -// -// Solidity: event SetTrustedAggregator(address newTrustedAggregator) -func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedAggregator(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedAggregator) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedAggregator") - 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(ZkEVMSetTrustedAggregator) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedAggregator", 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 -} - -// ParseSetTrustedAggregator is a log parse operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. -// -// Solidity: event SetTrustedAggregator(address newTrustedAggregator) -func (_ZkEVM *ZkEVMFilterer) ParseSetTrustedAggregator(log types.Log) (*ZkEVMSetTrustedAggregator, error) { - event := new(ZkEVMSetTrustedAggregator) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedAggregator", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetTrustedAggregatorTimeoutIterator is returned from FilterSetTrustedAggregatorTimeout and is used to iterate over the raw logs and unpacked data for SetTrustedAggregatorTimeout events raised by the ZkEVM contract. -type ZkEVMSetTrustedAggregatorTimeoutIterator struct { - Event *ZkEVMSetTrustedAggregatorTimeout // 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 *ZkEVMSetTrustedAggregatorTimeoutIterator) 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(ZkEVMSetTrustedAggregatorTimeout) - 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(ZkEVMSetTrustedAggregatorTimeout) - 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 *ZkEVMSetTrustedAggregatorTimeoutIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetTrustedAggregatorTimeoutIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetTrustedAggregatorTimeout represents a SetTrustedAggregatorTimeout event raised by the ZkEVM contract. -type ZkEVMSetTrustedAggregatorTimeout struct { - NewTrustedAggregatorTimeout uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetTrustedAggregatorTimeout is a free log retrieval operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. -// -// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) -func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedAggregatorTimeout(opts *bind.FilterOpts) (*ZkEVMSetTrustedAggregatorTimeoutIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedAggregatorTimeout") - if err != nil { - return nil, err - } - return &ZkEVMSetTrustedAggregatorTimeoutIterator{contract: _ZkEVM.contract, event: "SetTrustedAggregatorTimeout", logs: logs, sub: sub}, nil -} - -// WatchSetTrustedAggregatorTimeout is a free log subscription operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. -// -// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) -func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedAggregatorTimeout(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedAggregatorTimeout) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedAggregatorTimeout") - 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(ZkEVMSetTrustedAggregatorTimeout) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", 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 -} - -// ParseSetTrustedAggregatorTimeout is a log parse operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. -// -// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) -func (_ZkEVM *ZkEVMFilterer) ParseSetTrustedAggregatorTimeout(log types.Log) (*ZkEVMSetTrustedAggregatorTimeout, error) { - event := new(ZkEVMSetTrustedAggregatorTimeout) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetTrustedSequencerIterator is returned from FilterSetTrustedSequencer and is used to iterate over the raw logs and unpacked data for SetTrustedSequencer events raised by the ZkEVM contract. -type ZkEVMSetTrustedSequencerIterator struct { - Event *ZkEVMSetTrustedSequencer // 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 *ZkEVMSetTrustedSequencerIterator) 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(ZkEVMSetTrustedSequencer) - 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(ZkEVMSetTrustedSequencer) - 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 *ZkEVMSetTrustedSequencerIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetTrustedSequencerIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetTrustedSequencer represents a SetTrustedSequencer event raised by the ZkEVM contract. -type ZkEVMSetTrustedSequencer struct { - NewTrustedSequencer common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetTrustedSequencer is a free log retrieval operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. -// -// Solidity: event SetTrustedSequencer(address newTrustedSequencer) -func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedSequencer(opts *bind.FilterOpts) (*ZkEVMSetTrustedSequencerIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedSequencer") - if err != nil { - return nil, err - } - return &ZkEVMSetTrustedSequencerIterator{contract: _ZkEVM.contract, event: "SetTrustedSequencer", logs: logs, sub: sub}, nil -} - -// WatchSetTrustedSequencer is a free log subscription operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. -// -// Solidity: event SetTrustedSequencer(address newTrustedSequencer) -func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedSequencer(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedSequencer) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedSequencer") - 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(ZkEVMSetTrustedSequencer) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedSequencer", 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 -} - -// ParseSetTrustedSequencer is a log parse operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. -// -// Solidity: event SetTrustedSequencer(address newTrustedSequencer) -func (_ZkEVM *ZkEVMFilterer) ParseSetTrustedSequencer(log types.Log) (*ZkEVMSetTrustedSequencer, error) { - event := new(ZkEVMSetTrustedSequencer) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedSequencer", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetTrustedSequencerURLIterator is returned from FilterSetTrustedSequencerURL and is used to iterate over the raw logs and unpacked data for SetTrustedSequencerURL events raised by the ZkEVM contract. -type ZkEVMSetTrustedSequencerURLIterator struct { - Event *ZkEVMSetTrustedSequencerURL // 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 *ZkEVMSetTrustedSequencerURLIterator) 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(ZkEVMSetTrustedSequencerURL) - 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(ZkEVMSetTrustedSequencerURL) - 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 *ZkEVMSetTrustedSequencerURLIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetTrustedSequencerURLIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetTrustedSequencerURL represents a SetTrustedSequencerURL event raised by the ZkEVM contract. -type ZkEVMSetTrustedSequencerURL struct { - NewTrustedSequencerURL string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetTrustedSequencerURL is a free log retrieval operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. -// -// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) -func (_ZkEVM *ZkEVMFilterer) FilterSetTrustedSequencerURL(opts *bind.FilterOpts) (*ZkEVMSetTrustedSequencerURLIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetTrustedSequencerURL") - if err != nil { - return nil, err - } - return &ZkEVMSetTrustedSequencerURLIterator{contract: _ZkEVM.contract, event: "SetTrustedSequencerURL", logs: logs, sub: sub}, nil -} - -// WatchSetTrustedSequencerURL is a free log subscription operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. -// -// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) -func (_ZkEVM *ZkEVMFilterer) WatchSetTrustedSequencerURL(opts *bind.WatchOpts, sink chan<- *ZkEVMSetTrustedSequencerURL) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetTrustedSequencerURL") - 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(ZkEVMSetTrustedSequencerURL) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedSequencerURL", 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 -} - -// ParseSetTrustedSequencerURL is a log parse operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. -// -// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) -func (_ZkEVM *ZkEVMFilterer) ParseSetTrustedSequencerURL(log types.Log) (*ZkEVMSetTrustedSequencerURL, error) { - event := new(ZkEVMSetTrustedSequencerURL) - if err := _ZkEVM.contract.UnpackLog(event, "SetTrustedSequencerURL", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMSetVerifyBatchTimeTargetIterator is returned from FilterSetVerifyBatchTimeTarget and is used to iterate over the raw logs and unpacked data for SetVerifyBatchTimeTarget events raised by the ZkEVM contract. -type ZkEVMSetVerifyBatchTimeTargetIterator struct { - Event *ZkEVMSetVerifyBatchTimeTarget // 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 *ZkEVMSetVerifyBatchTimeTargetIterator) 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(ZkEVMSetVerifyBatchTimeTarget) - 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(ZkEVMSetVerifyBatchTimeTarget) - 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 *ZkEVMSetVerifyBatchTimeTargetIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMSetVerifyBatchTimeTargetIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMSetVerifyBatchTimeTarget represents a SetVerifyBatchTimeTarget event raised by the ZkEVM contract. -type ZkEVMSetVerifyBatchTimeTarget struct { - NewVerifyBatchTimeTarget uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSetVerifyBatchTimeTarget is a free log retrieval operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. -// -// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) -func (_ZkEVM *ZkEVMFilterer) FilterSetVerifyBatchTimeTarget(opts *bind.FilterOpts) (*ZkEVMSetVerifyBatchTimeTargetIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "SetVerifyBatchTimeTarget") - if err != nil { - return nil, err - } - return &ZkEVMSetVerifyBatchTimeTargetIterator{contract: _ZkEVM.contract, event: "SetVerifyBatchTimeTarget", logs: logs, sub: sub}, nil -} - -// WatchSetVerifyBatchTimeTarget is a free log subscription operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. -// -// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) -func (_ZkEVM *ZkEVMFilterer) WatchSetVerifyBatchTimeTarget(opts *bind.WatchOpts, sink chan<- *ZkEVMSetVerifyBatchTimeTarget) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "SetVerifyBatchTimeTarget") - 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(ZkEVMSetVerifyBatchTimeTarget) - if err := _ZkEVM.contract.UnpackLog(event, "SetVerifyBatchTimeTarget", 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 -} - -// ParseSetVerifyBatchTimeTarget is a log parse operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. -// -// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) -func (_ZkEVM *ZkEVMFilterer) ParseSetVerifyBatchTimeTarget(log types.Log) (*ZkEVMSetVerifyBatchTimeTarget, error) { - event := new(ZkEVMSetVerifyBatchTimeTarget) - if err := _ZkEVM.contract.UnpackLog(event, "SetVerifyBatchTimeTarget", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMTransferAdminRoleIterator is returned from FilterTransferAdminRole and is used to iterate over the raw logs and unpacked data for TransferAdminRole events raised by the ZkEVM contract. -type ZkEVMTransferAdminRoleIterator struct { - Event *ZkEVMTransferAdminRole // 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 *ZkEVMTransferAdminRoleIterator) 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(ZkEVMTransferAdminRole) - 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(ZkEVMTransferAdminRole) - 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 *ZkEVMTransferAdminRoleIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMTransferAdminRoleIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMTransferAdminRole represents a TransferAdminRole event raised by the ZkEVM contract. -type ZkEVMTransferAdminRole struct { - NewPendingAdmin common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTransferAdminRole is a free log retrieval operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. -// -// Solidity: event TransferAdminRole(address newPendingAdmin) -func (_ZkEVM *ZkEVMFilterer) FilterTransferAdminRole(opts *bind.FilterOpts) (*ZkEVMTransferAdminRoleIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "TransferAdminRole") - if err != nil { - return nil, err - } - return &ZkEVMTransferAdminRoleIterator{contract: _ZkEVM.contract, event: "TransferAdminRole", logs: logs, sub: sub}, nil -} - -// WatchTransferAdminRole is a free log subscription operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. -// -// Solidity: event TransferAdminRole(address newPendingAdmin) -func (_ZkEVM *ZkEVMFilterer) WatchTransferAdminRole(opts *bind.WatchOpts, sink chan<- *ZkEVMTransferAdminRole) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "TransferAdminRole") - 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(ZkEVMTransferAdminRole) - if err := _ZkEVM.contract.UnpackLog(event, "TransferAdminRole", 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 -} - -// ParseTransferAdminRole is a log parse operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. -// -// Solidity: event TransferAdminRole(address newPendingAdmin) -func (_ZkEVM *ZkEVMFilterer) ParseTransferAdminRole(log types.Log) (*ZkEVMTransferAdminRole, error) { - event := new(ZkEVMTransferAdminRole) - if err := _ZkEVM.contract.UnpackLog(event, "TransferAdminRole", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMUpdateZkEVMVersionIterator is returned from FilterUpdateZkEVMVersion and is used to iterate over the raw logs and unpacked data for UpdateZkEVMVersion events raised by the ZkEVM contract. -type ZkEVMUpdateZkEVMVersionIterator struct { - Event *ZkEVMUpdateZkEVMVersion // 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 *ZkEVMUpdateZkEVMVersionIterator) 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(ZkEVMUpdateZkEVMVersion) - 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(ZkEVMUpdateZkEVMVersion) - 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 *ZkEVMUpdateZkEVMVersionIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMUpdateZkEVMVersionIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMUpdateZkEVMVersion represents a UpdateZkEVMVersion event raised by the ZkEVM contract. -type ZkEVMUpdateZkEVMVersion struct { - NumBatch uint64 - ForkID uint64 - Version string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUpdateZkEVMVersion is a free log retrieval operation binding the contract event 0xed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd6. -// -// Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) -func (_ZkEVM *ZkEVMFilterer) FilterUpdateZkEVMVersion(opts *bind.FilterOpts) (*ZkEVMUpdateZkEVMVersionIterator, error) { - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "UpdateZkEVMVersion") - if err != nil { - return nil, err - } - return &ZkEVMUpdateZkEVMVersionIterator{contract: _ZkEVM.contract, event: "UpdateZkEVMVersion", logs: logs, sub: sub}, nil -} - -// WatchUpdateZkEVMVersion is a free log subscription operation binding the contract event 0xed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd6. -// -// Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) -func (_ZkEVM *ZkEVMFilterer) WatchUpdateZkEVMVersion(opts *bind.WatchOpts, sink chan<- *ZkEVMUpdateZkEVMVersion) (event.Subscription, error) { - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "UpdateZkEVMVersion") - 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(ZkEVMUpdateZkEVMVersion) - if err := _ZkEVM.contract.UnpackLog(event, "UpdateZkEVMVersion", 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 -} - -// ParseUpdateZkEVMVersion is a log parse operation binding the contract event 0xed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd6. -// -// Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) -func (_ZkEVM *ZkEVMFilterer) ParseUpdateZkEVMVersion(log types.Log) (*ZkEVMUpdateZkEVMVersion, error) { - event := new(ZkEVMUpdateZkEVMVersion) - if err := _ZkEVM.contract.UnpackLog(event, "UpdateZkEVMVersion", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMVerifyBatchesIterator is returned from FilterVerifyBatches and is used to iterate over the raw logs and unpacked data for VerifyBatches events raised by the ZkEVM contract. -type ZkEVMVerifyBatchesIterator struct { - Event *ZkEVMVerifyBatches // 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 *ZkEVMVerifyBatchesIterator) 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(ZkEVMVerifyBatches) - 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(ZkEVMVerifyBatches) - 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 *ZkEVMVerifyBatchesIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMVerifyBatchesIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMVerifyBatches represents a VerifyBatches event raised by the ZkEVM contract. -type ZkEVMVerifyBatches struct { - NumBatch uint64 - StateRoot [32]byte - Aggregator common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterVerifyBatches is a free log retrieval operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. -// -// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) FilterVerifyBatches(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*ZkEVMVerifyBatchesIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var aggregatorRule []interface{} - for _, aggregatorItem := range aggregator { - aggregatorRule = append(aggregatorRule, aggregatorItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) - if err != nil { - return nil, err - } - return &ZkEVMVerifyBatchesIterator{contract: _ZkEVM.contract, event: "VerifyBatches", logs: logs, sub: sub}, nil -} - -// WatchVerifyBatches is a free log subscription operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. -// -// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *ZkEVMVerifyBatches, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var aggregatorRule []interface{} - for _, aggregatorItem := range aggregator { - aggregatorRule = append(aggregatorRule, aggregatorItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) - 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(ZkEVMVerifyBatches) - if err := _ZkEVM.contract.UnpackLog(event, "VerifyBatches", 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 -} - -// ParseVerifyBatches is a log parse operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. -// -// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) ParseVerifyBatches(log types.Log) (*ZkEVMVerifyBatches, error) { - event := new(ZkEVMVerifyBatches) - if err := _ZkEVM.contract.UnpackLog(event, "VerifyBatches", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ZkEVMVerifyBatchesTrustedAggregatorIterator is returned from FilterVerifyBatchesTrustedAggregator and is used to iterate over the raw logs and unpacked data for VerifyBatchesTrustedAggregator events raised by the ZkEVM contract. -type ZkEVMVerifyBatchesTrustedAggregatorIterator struct { - Event *ZkEVMVerifyBatchesTrustedAggregator // 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 *ZkEVMVerifyBatchesTrustedAggregatorIterator) 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(ZkEVMVerifyBatchesTrustedAggregator) - 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(ZkEVMVerifyBatchesTrustedAggregator) - 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 *ZkEVMVerifyBatchesTrustedAggregatorIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ZkEVMVerifyBatchesTrustedAggregatorIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ZkEVMVerifyBatchesTrustedAggregator represents a VerifyBatchesTrustedAggregator event raised by the ZkEVM contract. -type ZkEVMVerifyBatchesTrustedAggregator struct { - NumBatch uint64 - StateRoot [32]byte - Aggregator common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterVerifyBatchesTrustedAggregator is a free log retrieval operation binding the contract event 0xcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe. -// -// Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) FilterVerifyBatchesTrustedAggregator(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*ZkEVMVerifyBatchesTrustedAggregatorIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var aggregatorRule []interface{} - for _, aggregatorItem := range aggregator { - aggregatorRule = append(aggregatorRule, aggregatorItem) - } - - logs, sub, err := _ZkEVM.contract.FilterLogs(opts, "VerifyBatchesTrustedAggregator", numBatchRule, aggregatorRule) - if err != nil { - return nil, err - } - return &ZkEVMVerifyBatchesTrustedAggregatorIterator{contract: _ZkEVM.contract, event: "VerifyBatchesTrustedAggregator", logs: logs, sub: sub}, nil -} - -// WatchVerifyBatchesTrustedAggregator is a free log subscription operation binding the contract event 0xcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe. -// -// Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) WatchVerifyBatchesTrustedAggregator(opts *bind.WatchOpts, sink chan<- *ZkEVMVerifyBatchesTrustedAggregator, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var aggregatorRule []interface{} - for _, aggregatorItem := range aggregator { - aggregatorRule = append(aggregatorRule, aggregatorItem) - } - - logs, sub, err := _ZkEVM.contract.WatchLogs(opts, "VerifyBatchesTrustedAggregator", numBatchRule, aggregatorRule) - 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(ZkEVMVerifyBatchesTrustedAggregator) - if err := _ZkEVM.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", 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 -} - -// ParseVerifyBatchesTrustedAggregator is a log parse operation binding the contract event 0xcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe. -// -// Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_ZkEVM *ZkEVMFilterer) ParseVerifyBatchesTrustedAggregator(log types.Log) (*ZkEVMVerifyBatchesTrustedAggregator, error) { - event := new(ZkEVMVerifyBatchesTrustedAggregator) - if err := _ZkEVM.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/pkg/event/zkevm/sequenceBatches.go b/pkg/event/zkevm/sequenceBatches.go index af6e306..8fd831a 100644 --- a/pkg/event/zkevm/sequenceBatches.go +++ b/pkg/event/zkevm/sequenceBatches.go @@ -11,11 +11,12 @@ import ( var ( SequenceBatchesName = "sequenceBatches" - SequenceBatchesNameHash = crypto.Keccak256([]byte("SequenceBatches(uint64)")) + SequenceBatchesNameHash = crypto.Keccak256([]byte("SequenceBatches(uint64,bytes32)")) ) type SequenceBatches struct { - BatchNum uint64 `json:"numBatch"` + BatchNum uint64 `json:"numBatch"` + L1InfoRoot string `json:"l1InfoRoot"` } func (*SequenceBatches) Name() string { @@ -36,7 +37,8 @@ func (t *SequenceBatches) ToObj(data string) error { func (*SequenceBatches) Data(log types.Log) (string, error) { transfer := &SequenceBatches{ - BatchNum: uint64(event.TopicToInt64(log, 1)), + BatchNum: uint64(event.TopicToInt64(log, 1)), + L1InfoRoot: event.DataToHash(log, 0).Hex(), } data, err := event.ToJSON(transfer) if err != nil { diff --git a/pkg/event/zkevm/verifybatches.go b/pkg/event/zkevm/verifybatches.go index 5bb4cb6..ddef40f 100644 --- a/pkg/event/zkevm/verifybatches.go +++ b/pkg/event/zkevm/verifybatches.go @@ -12,12 +12,14 @@ import ( var ( VerifyBatchesName = "verifyBatchesTrustedAggregator" - VerifyBatchesHash = crypto.Keccak256([]byte("VerifyBatchesTrustedAggregator(uint64,bytes32,address)")) + VerifyBatchesHash = crypto.Keccak256([]byte("VerifyBatchesTrustedAggregator(uint32,uint64,bytes32,bytes32,address)")) ) type VerifyBatches struct { + RollupID uint32 `json:"rollupID"` BatchNum uint64 `json:"numBatch"` StateRoot string `json:"stateRoot"` + ExitRoot string `json:"exitRoot"` Aggregator string `json:"aggregator"` } @@ -38,10 +40,13 @@ func (t *VerifyBatches) ToObj(data string) error { } func (*VerifyBatches) Data(log types.Log) (string, error) { + transfer := &VerifyBatches{ - BatchNum: uint64(event.TopicToInt64(log, 1)), - StateRoot: event.DataToHash(log, 0).Hex(), - Aggregator: event.TopicToHash(log, 2).Hex(), + RollupID: uint32(event.TopicToInt64(log, 1)), + Aggregator: event.TopicToAddress(log, 2).Hex(), + BatchNum: uint64(event.DataToInt64(log, 0)), + StateRoot: event.DataToHash(log, 1).Hex(), + ExitRoot: event.DataToHash(log, 2).Hex(), } data, err := event.ToJSON(transfer) if err != nil { diff --git a/test-docker/docker-compose.yml b/test-docker/docker-compose.yml index f9cf98a..a1bdb24 100644 --- a/test-docker/docker-compose.yml +++ b/test-docker/docker-compose.yml @@ -12,7 +12,22 @@ services: - ./mysql.sql:/docker-entrypoint-initdb.d/init.sql - ./mysql1/datadir:/var/lib/mysql -# mysql2: + postgres: + container_name: postgres + image: postgres:15.6 + environment: + - POSTGRES_PASSWORD=postgres + - POSTGRES_USER=postgres + - POSTGRES_DB=postgres + - PGDATA=/var/lib/postgresql/data/pgdata + ports: + - "5433:5432" + volumes: + - ./postgres1/datadir:/var/lib/postgresql/data + - ./mysql.sql:/docker-entrypoint-initdb.d/init.sql + + +# mysql2: # image: mysql:8.0.28 # environment: # MYSQL_ROOT_PASSWORD: "root" diff --git a/test-docker/postgres.sql b/test-docker/postgres.sql new file mode 100644 index 0000000..57f1f2e --- /dev/null +++ b/test-docker/postgres.sql @@ -0,0 +1,131 @@ +CREATE DATABASE b2_committer WITH ENCODING ='UTF8'; +-- Switch to the newly created database +\c b2_committer; + +-- Create rollbacks table +CREATE TABLE IF NOT EXISTS rollbacks +( + id SERIAL PRIMARY KEY, + created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + blockchain varchar(32) NOT NULL, + event_id bigint NOT NULL +); +CREATE INDEX if NOT EXISTS event_id_index ON rollbacks (event_id); + +-- Create sync_blocks table +CREATE TABLE IF NOT EXISTS sync_blocks +( + id SERIAL PRIMARY KEY, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + blockchain VARCHAR(32) NOT NULL, + miner VARCHAR(42) NOT NULL, + block_time BIGINT NOT NULL, + block_number BIGINT NOT NULL, + block_hash VARCHAR(66) NOT NULL, + tx_count BIGINT NOT NULL, + event_count BIGINT NOT NULL, + parent_hash VARCHAR(66) NOT NULL, + status VARCHAR(32) NOT NULL, + check_count BIGINT NOT NULL +); +CREATE INDEX if not exists status_index ON sync_blocks (status); +CREATE INDEX if not exists tx_count_index ON sync_blocks (tx_count); +CREATE INDEX if not exists check_count_index ON sync_blocks (check_count); + +-- Create sync_blocks_history table +CREATE TABLE IF NOT EXISTS sync_blocks_history +( + id SERIAL PRIMARY KEY, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + blockchain VARCHAR(32) NOT NULL, + miner VARCHAR(42) NOT NULL, + block_time BIGINT NOT NULL, + block_number BIGINT NOT NULL, + block_hash VARCHAR(66) NOT NULL, + tx_count BIGINT NOT NULL, + event_count BIGINT NOT NULL, + parent_hash VARCHAR(66) NOT NULL, + status VARCHAR(32) NOT NULL, + check_count BIGINT NOT NULL +); + +-- Create sync_events table +CREATE TABLE IF NOT EXISTS sync_events +( + id SERIAL PRIMARY KEY, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + sync_block_id BIGINT NOT NULL, + blockchain VARCHAR(32) NOT NULL, + block_time BIGINT NOT NULL, + block_number BIGINT NOT NULL, + block_hash VARCHAR(66) NOT NULL, + block_log_indexed BIGINT NOT NULL, + tx_index BIGINT NOT NULL, + tx_hash VARCHAR(66) NOT NULL, + event_name VARCHAR(32) NOT NULL, + event_hash VARCHAR(66) NOT NULL, + contract_address VARCHAR(42) NOT NULL, + data JSONB NOT NULL, + status VARCHAR(32) NOT NULL, + retry_count BIGINT DEFAULT 0 +); + +-- Create sync_events_history table +CREATE TABLE IF NOT EXISTS sync_events_history +( + id SERIAL PRIMARY KEY, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + sync_block_id BIGINT NOT NULL, + blockchain VARCHAR(32) NOT NULL, + block_time BIGINT NOT NULL, + block_number BIGINT NOT NULL, + block_hash VARCHAR(66) NOT NULL, + block_log_indexed BIGINT NOT NULL, + tx_index BIGINT NOT NULL, + tx_hash VARCHAR(66) NOT NULL, + event_name VARCHAR(32) NOT NULL, + event_hash VARCHAR(66) NOT NULL, + contract_address VARCHAR(42) NOT NULL, + data JSONB NOT NULL, + status VARCHAR(32) NOT NULL +); + +-- Create sync_tasks table +CREATE TABLE IF NOT EXISTS sync_tasks +( + id SERIAL PRIMARY KEY, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + blockchain VARCHAR(32) NOT NULL, + latest_block BIGINT NOT NULL, + start_block BIGINT NOT NULL, + end_block BIGINT NOT NULL, + handle_num BIGINT NOT NULL, + contracts TEXT NOT NULL, + status VARCHAR(32) NOT NULL +); + +-- Create proposal table +CREATE TABLE IF NOT EXISTS proposal +( + id bigserial PRIMARY KEY, + created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + proposal_id bigint NOT NULL, + proposer varchar(128) NOT NULL, + state_root_hash varchar(128) NOT NULL, + proof_root_hash varchar(128) NOT NULL, + start_batch_num bigint NOT NULL, + end_batch_num bigint NOT NULL, + btc_commit_tx_hash varchar(128), + btc_reveal_tx_hash varchar(128), + block_height bigint NOT NULL DEFAULT 0, + winner varchar(128), + status bigint NOT NULL DEFAULT 0 +); +CREATE INDEX if not exists proposal_id_index ON proposal (proposal_id); From c4f8e4d453c8fff202c1075c33e6252b06b8f733 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:25:11 +0800 Subject: [PATCH 04/29] add chain id and fix procedure --- .gitignore | 2 + abi/Committer.json | 969 +--------------- abi/PolygonSequence.json | 1224 +++++++++++++-------- docs/sql/listener.sql | 8 +- go.mod | 26 +- go.sum | 195 ++++ internal/blockchain/blockchain.go | 2 +- internal/handler/arweave.go | 77 ++ internal/handler/checkstatus.go | 63 +- internal/handler/committer.go | 26 +- internal/handler/committer_test.go | 2 +- internal/handler/handler.go | 16 +- internal/handler/inscribe.go | 19 +- internal/handler/sequenceBatchers_test.go | 19 + internal/handler/sequenceBatches.go | 81 +- internal/handler/syncProposal.go | 5 +- internal/schema/proposal.go | 25 +- internal/schema/sync_blocks.go | 4 +- internal/schema/sync_events.go | 4 +- internal/types/config.go | 21 +- pkg/b2node/b2node.go | 244 +--- pkg/b2node/b2node_test.go | 217 +--- pkg/contract/committer.go | 690 ++++++++---- test-docker/docker-compose.yml | 2 +- test-docker/mysql.sql | 245 +++-- test-docker/postgres.sql | 26 +- wallet/account.json | 1 + 27 files changed, 1944 insertions(+), 2269 deletions(-) create mode 100644 internal/handler/arweave.go create mode 100644 internal/handler/sequenceBatchers_test.go create mode 100644 wallet/account.json diff --git a/.gitignore b/.gitignore index 68821a3..9b41a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ b2-committer test-docker/mysql1 test-docker/mysql2 test-docker/postgres1 +wallet +batchFile diff --git a/abi/Committer.json b/abi/Committer.json index 68fe329..8cc2c11 100644 --- a/abi/Committer.json +++ b/abi/Committer.json @@ -1,968 +1 @@ -[ - { - "inputs": [ - - ], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [ - - ], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [ - - ], - "name": "NotInitializing", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "proposer", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "proofHash", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "startIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "endIndex", - "type": "uint256" - } - ], - "name": "ProposalSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "ProposalTimedOut", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "phase", - "type": "uint8" - } - ], - "name": "VoteProposal", - "type": "event" - }, - { - "inputs": [ - - ], - "name": "ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - - ], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "proposer", - "type": "address" - } - ], - "name": "addProposer", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - } - ], - "name": "allCommitPhaseVotes", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - - ], - "name": "allProposers", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - } - ], - "name": "allTimeoutPhaseVotes", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "string", - "name": "txHash", - "type": "string" - } - ], - "name": "bitcoinTx", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "commitPhaseVotes", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - - ], - "name": "getLastProposal", - "outputs": [ - { - "components": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, - { - "internalType": "address", - "name": "winner", - "type": "address" - }, - { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, - { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, - { - "internalType": "string", - "name": "txHash", - "type": "string" - } - ], - "internalType": "struct Committer.Proposal", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - - ], - "name": "initialize", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - } - ], - "name": "isProposalTimeout", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "isProposer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "address", - "name": "voter", - "type": "address" - } - ], - "name": "isVotedOnCommitPhase", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "address", - "name": "voter", - "type": "address" - } - ], - "name": "isVotedOnTimeoutPhase", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - - ], - "name": "lastProposal", - "outputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, - { - "internalType": "address", - "name": "winner", - "type": "address" - }, - { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, - { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, - { - "internalType": "string", - "name": "txHash", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - } - ], - "name": "proposal", - "outputs": [ - { - "components": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, - { - "internalType": "address", - "name": "winner", - "type": "address" - }, - { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, - { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, - { - "internalType": "string", - "name": "txHash", - "type": "string" - } - ], - "internalType": "struct Committer.Proposal", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "name": "proposals", - "outputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - }, - { - "internalType": "uint8", - "name": "status", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "timeout", - "type": "uint256" - }, - { - "internalType": "address", - "name": "winner", - "type": "address" - }, - { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, - { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, - { - "internalType": "string", - "name": "txHash", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "proposers", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "proposersList", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "proposer", - "type": "address" - } - ], - "name": "removeProposer", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "period", - "type": "uint256" - } - ], - "name": "setTimeoutPeriod", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - }, - { - "internalType": "string", - "name": "proofHash", - "type": "string" - }, - { - "internalType": "string", - "name": "stateRootHash", - "type": "string" - }, - { - "internalType": "uint64", - "name": "startIndex", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "endIndex", - "type": "uint64" - } - ], - "name": "submitProof", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - - ], - "name": "timeoutPeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "timeoutPhaseVotes", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "id", - "type": "uint64" - } - ], - "name": "timeoutProposal", - "outputs": [ - - ], - "stateMutability": "nonpayable", - "type": "function" - } -] +[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"ProposalIsNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainID","type":"uint64"},{"indexed":true,"internalType":"uint64","name":"proposalID","type":"uint64"},{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"string","name":"proofHash","type":"string"},{"indexed":false,"internalType":"string","name":"stateRootHash","type":"string"},{"indexed":true,"internalType":"uint256","name":"startIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"ProposalSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainID","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"ProposalTimedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainID","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"proposalID","type":"uint64"},{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint8","name":"phase","type":"uint8"}],"name":"VoteProposal","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"}],"name":"addChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proposer","type":"address"}],"name":"addProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allChains","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allProposers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"allSubmitBitcoinTxVotes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"allSubmitProofVotes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"txHash","type":"string"}],"name":"arweaveTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"txHash","type":"string"}],"name":"bitcoinTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"chains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainsList","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"a","type":"string"},{"internalType":"string","name":"b","type":"string"}],"name":"compareStrings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"}],"name":"getLastProposal","outputs":[{"components":[{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"endIndex","type":"uint64"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"string","name":"proofHash","type":"string"},{"internalType":"string","name":"stateRootHash","type":"string"},{"internalType":"string","name":"btcTxHash","type":"string"},{"internalType":"string","name":"arweaveTxHash","type":"string"}],"internalType":"struct Committer.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"isProposalTimeout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isProposer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"}],"name":"isSupportedChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOnBitcoinTxPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOnSubmitProofPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"lastProposal","outputs":[{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"endIndex","type":"uint64"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"string","name":"proofHash","type":"string"},{"internalType":"string","name":"stateRootHash","type":"string"},{"internalType":"string","name":"btcTxHash","type":"string"},{"internalType":"string","name":"arweaveTxHash","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"proposal","outputs":[{"components":[{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"endIndex","type":"uint64"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"string","name":"proofHash","type":"string"},{"internalType":"string","name":"stateRootHash","type":"string"},{"internalType":"string","name":"btcTxHash","type":"string"},{"internalType":"string","name":"arweaveTxHash","type":"string"}],"internalType":"struct Committer.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"proposals","outputs":[{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"endIndex","type":"uint64"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"string","name":"proofHash","type":"string"},{"internalType":"string","name":"stateRootHash","type":"string"},{"internalType":"string","name":"btcTxHash","type":"string"},{"internalType":"string","name":"arweaveTxHash","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposersList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"}],"name":"removeChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proposer","type":"address"}],"name":"removeProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setTimeoutPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"submitBitcoinTxPhaseVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"proofHash","type":"string"},{"internalType":"string","name":"stateRootHash","type":"string"},{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"endIndex","type":"uint64"}],"name":"submitProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"submitProofPhaseVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeoutPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"timeoutProposal","outputs":[],"stateMutability":"nonpayable","type":"function"}] diff --git a/abi/PolygonSequence.json b/abi/PolygonSequence.json index da9364c..c2da512 100644 --- a/abi/PolygonSequence.json +++ b/abi/PolygonSequence.json @@ -1,301 +1,409 @@ -[{ - "inputs": [{ - "internalType": "contract IPolygonZkEVMGlobalExitRootV2", - "name": "_globalExitRootManager", - "type": "address" - }, - { - "internalType": "contract IERC20Upgradeable", - "name": "_pol", - "type": "address" - }, - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "name": "_bridgeAddress", - "type": "address" - }, - { - "internalType": "contract PolygonRollupManager", - "name": "_rollupManager", - "type": "address" - }], - "stateMutability": "nonpayable", - "type": "constructor" -}, - { - "inputs": [], +[ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "contract PolygonRollupManager", + "name": "_rollupManager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + + ], "name": "BatchAlreadyVerified", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "BatchNotSequencedOrNotSequenceEnd", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ExceedMaxVerifyBatches", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "FinalNumBatchBelowLastVerifiedBatch", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "FinalNumBatchDoesNotMatchPendingState", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "FinalPendingStateNumInvalid", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForceBatchNotAllowed", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForceBatchTimeoutNotExpired", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForceBatchesAlreadyActive", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForceBatchesDecentralized", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForceBatchesNotAllowedOnEmergencyState", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForceBatchesOverflow", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "ForcedDataDoesNotMatch", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "GasTokenNetworkMustBeZeroOnEther", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "GlobalExitRootNotExist", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "HaltTimeoutNotExpired", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "HaltTimeoutNotExpiredAfterEmergencyState", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "HugeTokenMetadataNotSupported", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InitNumBatchAboveLastVerifiedBatch", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InitNumBatchDoesNotMatchPendingState", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InitSequencedBatchDoesNotMatch", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InvalidInitializeTransaction", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InvalidProof", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InvalidRangeBatchTimeTarget", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InvalidRangeForceBatchTimeout", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "InvalidRangeMultiplierBatchFee", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "MaxTimestampSequenceInvalid", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "NewAccInputHashDoesNotExist", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "NewPendingStateTimeoutMustBeLower", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "NewStateRootNotInsidePrime", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "NewTrustedAggregatorTimeoutMustBeLower", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "NotEnoughMaticAmount", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "NotEnoughPOLAmount", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OldAccInputHashDoesNotExist", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OldStateRootDoesNotExist", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OnlyAdmin", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OnlyPendingAdmin", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OnlyRollupManager", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OnlyTrustedAggregator", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "OnlyTrustedSequencer", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "PendingStateDoesNotExist", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "PendingStateInvalid", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "PendingStateNotConsolidable", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "PendingStateTimeoutExceedHaltAggregationTimeout", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "SequenceZeroBatches", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "SequencedTimestampBelowForcedTimestamp", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "SequencedTimestampInvalid", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "StoredRootMustBeDifferentThanNewRoot", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "TransactionsLengthAboveMax", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", "type": "error" }, { - "inputs": [], + "inputs": [ + + ], "name": "TrustedAggregatorTimeoutNotExpired", "type": "error" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - }], + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], "name": "AcceptAdminRole", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "uint64", - "name": "forceBatchNum", - "type": "uint64" - }, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "forceBatchNum", + "type": "uint64" + }, { "indexed": false, "internalType": "bytes32", @@ -313,18 +421,20 @@ "internalType": "bytes", "name": "transactions", "type": "bytes" - }], + } + ], "name": "ForceBatch", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, { "indexed": false, "internalType": "bytes32", @@ -336,112 +446,130 @@ "internalType": "address", "name": "sequencer", "type": "address" - }], + } + ], "name": "InitialSequenceBatches", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - }], + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], "name": "Initialized", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "uint64", - "name": "numBatch", - "type": "uint64" - }, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, { "indexed": false, "internalType": "bytes32", "name": "l1InfoRoot", "type": "bytes32" - }], + } + ], "name": "SequenceBatches", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "uint64", - "name": "numBatch", - "type": "uint64" - }], + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + } + ], "name": "SequenceForceBatches", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "address", - "name": "newForceBatchAddress", - "type": "address" - }], + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], "name": "SetForceBatchAddress", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "uint64", - "name": "newforceBatchTimeout", - "type": "uint64" - }], + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], "name": "SetForceBatchTimeout", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "address", - "name": "newTrustedSequencer", - "type": "address" - }], + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], "name": "SetTrustedSequencer", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "string", - "name": "newTrustedSequencerURL", - "type": "string" - }], + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], "name": "SetTrustedSequencerURL", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": false, - "internalType": "address", - "name": "newPendingAdmin", - "type": "address" - }], + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], "name": "TransferAdminRole", "type": "event" }, { "anonymous": false, - "inputs": [{ - "indexed": true, - "internalType": "uint64", - "name": "numBatch", - "type": "uint64" - }, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, { "indexed": false, "internalType": "bytes32", @@ -453,274 +581,368 @@ "internalType": "address", "name": "aggregator", "type": "address" - }], + } + ], "name": "VerifyBatches", "type": "event" }, { - "inputs": [], + "inputs": [ + + ], "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", - "outputs": [{ - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", - "outputs": [{ - "internalType": "uint8", - "name": "", - "type": "uint8" - }], + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_BRIDGE_PARAMS", - "outputs": [{ - "internalType": "bytes", - "name": "", - "type": "bytes" - }], + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", - "outputs": [{ - "internalType": "bytes", - "name": "", - "type": "bytes" - }], + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", - "outputs": [{ - "internalType": "bytes", - "name": "", - "type": "bytes" - }], + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_CONSTANT_BYTES", - "outputs": [{ - "internalType": "uint16", - "name": "", - "type": "uint16" - }], + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", - "outputs": [{ - "internalType": "uint16", - "name": "", - "type": "uint16" - }], + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", - "outputs": [{ - "internalType": "uint8", - "name": "", - "type": "uint8" - }], + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", - "outputs": [{ - "internalType": "bytes1", - "name": "", - "type": "bytes1" - }], + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "SIGNATURE_INITIALIZE_TX_R", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "SIGNATURE_INITIALIZE_TX_S", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "SIGNATURE_INITIALIZE_TX_V", - "outputs": [{ - "internalType": "uint8", - "name": "", - "type": "uint8" - }], + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "TIMESTAMP_RANGE", - "outputs": [{ - "internalType": "uint256", - "name": "", - "type": "uint256" - }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "acceptAdminRole", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "admin", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "bridgeAddress", - "outputs": [{ - "internalType": "contract IPolygonZkEVMBridgeV2", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "calculatePolPerForceBatch", - "outputs": [{ - "internalType": "uint256", - "name": "", - "type": "uint256" - }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, { "internalType": "uint256", "name": "polAmount", "type": "uint256" - }], + } + ], "name": "forceBatch", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "forceBatchAddress", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "forceBatchTimeout", - "outputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }], + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }], + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], "name": "forcedBatches", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "gasTokenAddress", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "gasTokenNetwork", - "outputs": [{ - "internalType": "uint32", - "name": "", - "type": "uint32" - }], + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ - "internalType": "uint32", - "name": "networkID", - "type": "uint32" - }, + "inputs": [ + { + "internalType": "uint32", + "name": "networkID", + "type": "uint32" + }, { "internalType": "address", "name": "_gasTokenAddress", @@ -735,33 +957,41 @@ "internalType": "bytes", "name": "_gasTokenMetadata", "type": "bytes" - }], + } + ], "name": "generateInitializeTransaction", - "outputs": [{ - "internalType": "bytes", - "name": "", - "type": "bytes" - }], + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "globalExitRootManager", - "outputs": [{ - "internalType": "contract IPolygonZkEVMGlobalExitRootV2", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ - "internalType": "address", - "name": "_admin", - "type": "address" - }, + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, { "internalType": "address", "name": "sequencer", @@ -786,62 +1016,82 @@ "internalType": "string", "name": "_networkName", "type": "string" - }], + } + ], "name": "initialize", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "lastAccInputHash", - "outputs": [{ - "internalType": "bytes32", - "name": "", - "type": "bytes32" - }], + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "lastForceBatch", - "outputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }], + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "lastForceBatchSequenced", - "outputs": [{ - "internalType": "uint64", - "name": "", - "type": "uint64" - }], + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "networkName", - "outputs": [{ - "internalType": "string", - "name": "", - "type": "string" - }], + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ - "internalType": "uint64", - "name": "lastVerifiedBatch", - "type": "uint64" - }, + "inputs": [ + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, { "internalType": "bytes32", "name": "newStateRoot", @@ -851,71 +1101,89 @@ "internalType": "address", "name": "aggregator", "type": "address" - }], + } + ], "name": "onVerifyBatches", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "pendingAdmin", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "pol", - "outputs": [{ - "internalType": "contract IERC20Upgradeable", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "rollupManager", - "outputs": [{ - "internalType": "contract PolygonRollupManager", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "contract PolygonRollupManager", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ - "components": [{ - "internalType": "bytes", - "name": "transactions", - "type": "bytes" + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" }, - { - "internalType": "bytes32", - "name": "forcedGlobalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "forcedTimestamp", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "forcedBlockHashL1", - "type": "bytes32" - }], - "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", - "name": "batches", - "type": "tuple[]" - }, { "internalType": "uint64", "name": "maxSequenceTimestamp", @@ -930,117 +1198,155 @@ "internalType": "address", "name": "l2Coinbase", "type": "address" - }], + } + ], "name": "sequenceBatches", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ - "components": [{ - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "forcedGlobalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "forcedTimestamp", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "forcedBlockHashL1", - "type": "bytes32" - }], - "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", - "name": "batches", - "type": "tuple[]" - }], + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], "name": "sequenceForceBatches", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ - "internalType": "address", - "name": "newForceBatchAddress", - "type": "address" - }], + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], "name": "setForceBatchAddress", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ - "internalType": "uint64", - "name": "newforceBatchTimeout", - "type": "uint64" - }], + "inputs": [ + { + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], "name": "setForceBatchTimeout", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ - "internalType": "address", - "name": "newTrustedSequencer", - "type": "address" - }], + "inputs": [ + { + "internalType": "address", + "name": "newTrustedSequencer", + "type": "address" + } + ], "name": "setTrustedSequencer", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ - "internalType": "string", - "name": "newTrustedSequencerURL", - "type": "string" - }], + "inputs": [ + { + "internalType": "string", + "name": "newTrustedSequencerURL", + "type": "string" + } + ], "name": "setTrustedSequencerURL", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ - "internalType": "address", - "name": "newPendingAdmin", - "type": "address" - }], + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], "name": "transferAdminRole", - "outputs": [], + "outputs": [ + + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "trustedSequencer", - "outputs": [{ - "internalType": "address", - "name": "", - "type": "address" - }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [], + "inputs": [ + + ], "name": "trustedSequencerURL", - "outputs": [{ - "internalType": "string", - "name": "", - "type": "string" - }], + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], "stateMutability": "view", "type": "function" - }] + } +] diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index 71815e5..f9fb930 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -1,5 +1,5 @@ -Create Database If Not Exists b2_committer Character Set UTF8; -USE b2_committer; +Create Database If Not Exists b2_committer2 Character Set UTF8; +USE b2_committer2; SET NAMES utf8mb4; @@ -148,7 +148,9 @@ CREATE TABLE `proposal` ( `btc_tx_hash` varchar(128) , `winner` varchar(128), `status` bigint NOT NULL DEFAULT 0, - `upload_details` tinyint(1) default 0, + `generate_details_file` tinyint default 0 comment '0:no generate details file 1:already generate details file for uploading', + `generate_details_file_time` datetime, + `ar_tx_hash` varchar(128), PRIMARY KEY (`id`), KEY `proposal_id_index` (`proposal_id`) ) diff --git a/go.mod b/go.mod index 7b0f58a..9520d14 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/btcsuite/btcd v0.23.4 github.com/btcsuite/btcd/btcec/v2 v2.3.2 - github.com/btcsuite/btcd/btcutil v1.1.2 + github.com/btcsuite/btcd/btcutil v1.1.3 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 github.com/caarlos0/env/v6 v6.10.1 github.com/ethereum/go-ethereum v1.13.14 @@ -33,30 +33,50 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/everFinance/arseeding v1.0.3 // indirect + github.com/everFinance/ethrpc v1.0.4 // indirect + github.com/everFinance/goar v1.6.2 // indirect + github.com/everFinance/goether v1.1.9 // indirect + github.com/everFinance/gojwk v1.0.0 // indirect + github.com/everFinance/ttcrsa v1.1.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/gogo/protobuf v1.3.3 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.4.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/hamba/avro v1.5.6 // indirect github.com/holiman/uint256 v1.2.4 // indirect + github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v5 v5.4.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect + github.com/linkedin/goavro/v2 v2.12.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/panjf2000/ants/v2 v2.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/rs/cors v1.8.2 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/supranational/blst v0.3.11 // indirect + github.com/tidwall/gjson v1.14.1 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect go.uber.org/atomic v1.10.0 // indirect @@ -71,7 +91,9 @@ require ( golang.org/x/tools v0.17.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/h2non/gentleman.v2 v2.0.5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/datatypes v1.0.1 // indirect gorm.io/driver/mysql v1.5.4 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 3d68ea9..0150058 100644 --- a/go.sum +++ b/go.sum @@ -31,6 +31,8 @@ github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9Ur github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= +github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= @@ -55,6 +57,7 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= @@ -71,12 +74,15 @@ github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/Yj github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -87,7 +93,10 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -96,6 +105,18 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= +github.com/everFinance/arseeding v1.0.3 h1:V1e98ehAGFJch6T7aP9jeb2cpoll68fB/GyuMmoBesM= +github.com/everFinance/arseeding v1.0.3/go.mod h1:fxoIIXIL7G7nd6glaEvtbOxbvY/6UWD1E/bVsdD9Qio= +github.com/everFinance/ethrpc v1.0.4 h1:Ww+qr8D93Id5QkyG5Mvw58edu5tqy0sL6hDP0IfhYsE= +github.com/everFinance/ethrpc v1.0.4/go.mod h1:cQipdwW4kM1v8C+q8Z+jDDXwL7a3KngvNk9Yo+lbXpI= +github.com/everFinance/goar v1.6.2 h1:Hfhanc++MpRmmJeppML3M4K164NJBatllZ1rzR4fcRQ= +github.com/everFinance/goar v1.6.2/go.mod h1:D9b5v9Xs/W6A7odVWtIU3EBWuQfQ0qcLH4zSjGPLxAo= +github.com/everFinance/goether v1.1.9 h1:Y/zz/chv0CmoXz119J3ZK4WbGoHnMjm/IDH5qwKrvVU= +github.com/everFinance/goether v1.1.9/go.mod h1:QhUIRE3g4CPN4+OGz96pIwguyRH1hZfYo2gAUSY00Qw= +github.com/everFinance/gojwk v1.0.0 h1:le/oI2NgXlrqg3MHU6ka+V30EWcD7TD6+Ilh+go7924= +github.com/everFinance/gojwk v1.0.0/go.mod h1:icXSXsIdpAczlpAtSljQlmABkMTRZENr73KHmo0GOGc= +github.com/everFinance/ttcrsa v1.1.3 h1:RJl9UizbevHZUiWPHVKz1aM6yA8cmkZWaCbOGTD/L0I= +github.com/everFinance/ttcrsa v1.1.3/go.mod h1:Ws7b/oDbYKaZlvyT17nm+zHmzVhGl51r/yPx/Ib5RQk= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -109,12 +130,18 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -130,6 +157,7 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -140,13 +168,17 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hamba/avro v1.5.6 h1:/UBljlJ9hLjkcY7PhpI/bFYb4RMEXHEwHr17gAm/+l8= +github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= @@ -158,41 +190,111 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac h1:n1DqxAo4oWPMvH1+v+DLYlMCecgumhhgnxAPdqDIFHI= +github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA= github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v1.0.6/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= +github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -202,6 +304,13 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= @@ -213,6 +322,9 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/panjf2000/ants/v2 v2.6.0 h1:xOSpw42m+BMiJ2I33we7h6fYzG4DAlpE1xyI7VS2gxU= +github.com/panjf2000/ants/v2 v2.6.0/go.mod h1:cU93usDlihJZ5CfRGNDYsiBYvoilLvBF5Qp/BT2GNRE= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -230,27 +342,54 @@ github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5 github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tidwall/gjson v1.6.3/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0= +github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -265,19 +404,35 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRT github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -286,6 +441,8 @@ golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUU golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= @@ -298,11 +455,13 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -314,23 +473,34 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -342,12 +512,19 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -377,13 +554,19 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/h2non/gentleman.v2 v2.0.5 h1:ckmb6cLxL2DDk7WN7LSdxXDq7jNkOicFg4JZ4ZnDNuE= +gopkg.in/h2non/gentleman.v2 v2.0.5/go.mod h1:A1c7zwrTgAyyf6AbpvVksYtBayTB4STBUGmdkEtlHeA= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -392,13 +575,25 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/datatypes v1.0.1 h1:6npnXbBtjpSb7FFVA2dG/llyTN8tvZfbUqs+WyLrYgQ= +gorm.io/datatypes v1.0.1/go.mod h1:HEHoUU3/PO5ZXfAJcVWl11+zWlE16+O0X2DgJEb4Ixs= +gorm.io/driver/mysql v1.0.5/go.mod h1:N1OIhHAIhx5SunkMGqWbGFVeh4yTNWKmMo1GOAsohLI= gorm.io/driver/mysql v1.5.4 h1:igQmHfKcbaTVyAIHNhhB888vvxh8EdQ2uSUT0LPcBso= gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tvs= +gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw= +gorm.io/driver/sqlserver v1.0.7/go.mod h1:ng66aHI47ZIKz/vvnxzDoonzmTS8HXP+JYlgg67wOog= +gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.21.6/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde h1:9DShaph9qhkIYw7QF91I/ynrr4cOO2PZra2PFD7Mfeg= gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/internal/blockchain/blockchain.go b/internal/blockchain/blockchain.go index f9ad55b..2fac333 100644 --- a/internal/blockchain/blockchain.go +++ b/internal/blockchain/blockchain.go @@ -25,8 +25,8 @@ func init() { register(&zkevm.VerifyBatches{}) register(&zkevm.SequenceBatches{}) cfg := config.GetConfig() - addContract(cfg.PolygonSequenceContract) addContract(cfg.PolygonVerifyBatchContract) + addContract(cfg.PolygonSequenceContract) } func register(event Event) { diff --git a/internal/handler/arweave.go b/internal/handler/arweave.go new file mode 100644 index 0000000..0b51397 --- /dev/null +++ b/internal/handler/arweave.go @@ -0,0 +1,77 @@ +package handler + +import ( + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/pkg/log" + "github.com/everFinance/goar" + "github.com/everFinance/goar/types" + "github.com/pkg/errors" + "os" + "strconv" + "time" +) + +func BatchDetailsToAr(ctx *svc.ServiceContext) { + for { + var dbProposal schema.Proposal + err := ctx.DB.Where("status = ? and generate_details_file = ? and winner = ? and ar_tx_hash=''", + schema.ProposalCommitting, true, ctx.B2NodeConfig.Address).Order("proposal_id asc").First(&dbProposal).Error + if err != nil { + log.Errorf("[Handler.BatchDetailsToAr] error info: %s", errors.WithStack(err).Error()) + time.Sleep(10 * time.Second) + continue + } + proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) + if proposal.Status == schema.ProposalSucceedStatus || proposal.ArweaveTxHash != "" { + log.Errorf("[Handler.BatchDetailsToAr] batch details already upload") + continue + } + + arTx, err := uploadDetailToAR(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) + if err != nil { + log.Errorf("[Handler.BatchDetailsToAr] upload detail to ar error: %s", errors.WithStack(err).Error()) + continue + } + _, err = ctx.NodeClient.ArweaveTx(dbProposal.ProposalID, arTx) + if err != nil { + log.Errorf("[Handler.BatchDetailsToAr] get ar tx error: %s", errors.WithStack(err).Error()) + continue + } + err = ctx.DB.Model(&dbProposal).Update("ar_tx_hash", arTx).Error + if err != nil { + log.Errorf("[Handler.BatchDetailsToAr] update proposal error: %s", errors.WithStack(err).Error()) + continue + } + time.Sleep(3 * time.Second) + } +} + +func uploadDetailToAR(ctx *svc.ServiceContext, startBatchNum uint64, endBatchNum uint64) (string, error) { + path, err := os.Getwd() + if err != nil { + log.Errorf("[WriteFile] get current path error: %s", errors.WithStack(err)) + return "", err + } + + arNode := ctx.Config.ArweaveRPC + wallet := ctx.Config.ArweaveWallet + fileName := strconv.FormatUint(startBatchNum, 10) + "-" + strconv.FormatUint(endBatchNum, 10) + ".json" + filePath := path + "/" + ctx.Config.BatchPath + content, err := os.ReadFile(filePath + "/" + fileName) + w, err := goar.NewWalletFromPath(wallet, arNode) + if err != nil { + log.Errorf("[WriteFile] new wallet error: %s", errors.WithStack(err)) + return "", err + } + tags := []types.Tag{ + {Name: "Content-Type", Value: "application/json"}, + {Name: "title", Value: "b2-batch"}, + } + tx, err := w.SendData(content, tags) + if err != nil { + log.Errorf("[WriteFile] send data error: %s", errors.WithStack(err)) + return "", err + } + return tx.ID, err +} diff --git a/internal/handler/checkstatus.go b/internal/handler/checkstatus.go index cc2f8b1..1484679 100644 --- a/internal/handler/checkstatus.go +++ b/internal/handler/checkstatus.go @@ -9,8 +9,8 @@ import ( "github.com/pkg/errors" ) -// CheckStatus check proposal vote status -func CheckStatus(ctx *svc.ServiceContext) { +// CheckStatusVoting check proposal vote status +func CheckStatusVoting(ctx *svc.ServiceContext) { for { var dbProposal schema.Proposal err := ctx.DB.Where("status=?", schema.ProposalVotingStatus).Order("end_batch_num asc").First(&dbProposal).Error @@ -33,11 +33,35 @@ func CheckStatus(ctx *svc.ServiceContext) { } } -func CheckStatusTimeOut(ctx *svc.ServiceContext) { +func CheckStatusPending(ctx *svc.ServiceContext) { + for { + var dbProposal schema.Proposal + err := ctx.DB.Where("status = ?", schema.ProposalPendingStatus).Order("end_batch_num asc").First(&dbProposal).Error + if err != nil { + log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal err: %s\n", errors.WithStack(err)) + time.Sleep(5 * time.Second) + continue + } + proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) + if err != nil { + log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) + continue + } + if proposal.Status == schema.ProposalCommitting { + dbProposal.Status = uint64(proposal.Status) + dbProposal.Winner = proposal.Winner.String() + dbProposal.BtcTxHash = proposal.BtcTxHash + ctx.DB.Save(dbProposal) + continue + } + time.Sleep(2 * time.Second) + } +} + +func CheckStatusCommitting(ctx *svc.ServiceContext) { for { - time.Sleep(30 * time.Second) var dbProposal schema.Proposal - err := ctx.DB.Where("status not in (? , ?)", schema.ProposalSucceedStatus, schema.ProposalTimeoutStatus).Order("end_batch_num asc").First(&dbProposal).Error + err := ctx.DB.Where("status = ?", schema.ProposalCommitting).Order("end_batch_num asc").First(&dbProposal).Error if err != nil { log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal err: %s\n", errors.WithStack(err)) time.Sleep(5 * time.Second) @@ -48,7 +72,34 @@ func CheckStatusTimeOut(ctx *svc.ServiceContext) { log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) continue } - if proposal.TxHash == "" && proposal.Status == schema.ProposalPendingStatus && proposal.Winner.String() != ctx.B2NodeConfig.Address { + if proposal.Status == schema.ProposalSucceedStatus { + dbProposal.Status = uint64(proposal.Status) + dbProposal.Winner = proposal.Winner.String() + dbProposal.ArTxHash = proposal.ArweaveTxHash + ctx.DB.Save(dbProposal) + continue + } + time.Sleep(2 * time.Second) + } +} + +func CheckStatusPendingTimeOut(ctx *svc.ServiceContext) { + for { + time.Sleep(30 * time.Second) + var dbProposal schema.Proposal + err := ctx.DB.Where("status = ? or status = ?", schema.ProposalPendingStatus, + schema.ProposalCommitting).Order("end_batch_num asc").First(&dbProposal).Error + if err != nil { + log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal and Committing proposal err: %s\n", errors.WithStack(err).Error()) + time.Sleep(5 * time.Second) + continue + } + proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) + if err != nil { + log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) + continue + } + if (proposal.BtcTxHash == "" || proposal.ArweaveTxHash == "") && proposal.Winner.String() != ctx.B2NodeConfig.Address { res, err := ctx.NodeClient.IsProposalTimeout(proposal.Id) if err != nil { log.Errorf("[Handler.CheckStatusTimeOut] TimeoutProposal err: %s\n", errors.WithStack(err)) diff --git a/internal/handler/committer.go b/internal/handler/committer.go index 4d63304..8ff9c6a 100644 --- a/internal/handler/committer.go +++ b/internal/handler/committer.go @@ -44,7 +44,6 @@ type VerifyRangBatchInfo struct { // Committer find verifyBatchesTrustedAggregator event and commit stateRoot proof to b2node func Committer(ctx *svc.ServiceContext) { for { - //var proposals []schema.Proposal proposal, err := ctx.NodeClient.QueryLastProposal() lastProposalID, lastFinalBatchNum := proposal.Id, proposal.EndIndex if err != nil { @@ -52,16 +51,19 @@ func Committer(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) continue } - //err = ctx.DB.Where("end_batch_num > ?", lastFinalBatchNum).Find(&proposals).Error - //if err != nil { - // log.Errorf("[Handler.Committer][DB] error info: %s", errors.WithStack(err).Error()) - // time.Sleep(10 * time.Second) - // continue - //} - //if len(proposals) > 0 { - // log.Errorf("[Handler.Committer] proposal already is existed, lastFinalBatchNum: %s", lastFinalBatchNum) - // continue - //} + + proposalLatest, err := ctx.NodeClient.QueryProposalByID(lastProposalID) + if err != nil { + log.Errorf("[Handler.Committer][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) + return + } + + if proposalLatest.Status != schema.ProposalTimeoutStatus { + log.Infof("[Handler.Committer] proposal status is processing, proposalID: %d, proposal status: %d", lastProposalID, proposalLatest.Status) + time.Sleep(10 * time.Second) + continue + } + verifyBatchInfo, err := GetVerifyBatchInfoByLastBatchNum(ctx, lastFinalBatchNum) if err != nil { log.Errorf("[Handler.Committer] error info: %s", errors.WithStack(err).Error()) @@ -104,7 +106,7 @@ func committerProposal(ctx *svc.ServiceContext, verifyBatchInfo *VerifyRangBatch _, err := ctx.NodeClient.SubmitProof(proposalID, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, verifyBatchInfo.startBatchNum, verifyBatchInfo.endBatchNum) if err != nil { - return fmt.Errorf("[committerProposal] submit proof error info: %s", errors.WithStack(err)) + return fmt.Errorf("[committerProposal] submit proof error info: %s, %d", errors.WithStack(err), verifyBatchInfo.startBatchNum) } return nil } diff --git a/internal/handler/committer_test.go b/internal/handler/committer_test.go index e40086c..4d4e559 100644 --- a/internal/handler/committer_test.go +++ b/internal/handler/committer_test.go @@ -25,7 +25,7 @@ func TestGetVerifyBatchesParamsByTxHash(t *testing.T) { methodSigData := tx.Data()[:4] inputsSigData := tx.Data()[4:] - abiObject, err := abi.JSON(strings.NewReader(contract.ZkEVMMetaData.ABI)) + abiObject, err := abi.JSON(strings.NewReader(contract.VerifyMetaData.ABI)) require.NoError(t, err) method, err := abiObject.MethodById(methodSigData) require.NoError(t, err) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index a01213b..1e72570 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -10,18 +10,22 @@ func Run(ctx *svc.ServiceContext) { go LatestBlackNumber(ctx) // sync blocks go SyncBlock(ctx) - //sync events + // sync events go SyncEvent(ctx) // execute committer go Committer(ctx) - // check status - go CheckStatus(ctx) // check and inscribe go Inscribe(ctx) + // check status + go CheckStatusVoting(ctx) + // check pending + go CheckStatusPending(ctx) // check time out - go CheckStatusTimeOut(ctx) + go CheckStatusPendingTimeOut(ctx) // sync proposal go SyncProposal(ctx) - //sequence batches - //go SequenceBatches(ctx) + // sequence batches + go SequenceBatches(ctx) + // upload batch detail to ar + go BatchDetailsToAr(ctx) } diff --git a/internal/handler/inscribe.go b/internal/handler/inscribe.go index 029a601..f6b4a6f 100644 --- a/internal/handler/inscribe.go +++ b/internal/handler/inscribe.go @@ -19,9 +19,9 @@ func Inscribe(ctx *svc.ServiceContext) { time.Sleep(30 * time.Second) for { var dbProposal schema.Proposal - err := ctx.DB.Where("status=?", schema.ProposalPendingStatus).Order("end_batch_num asc").First(&dbProposal).Error + err := ctx.DB.Where("status=? AND btc_tx_hash=''", schema.ProposalPendingStatus).Order("end_batch_num asc").First(&dbProposal).Error if err != nil { - log.Errorf("[Handler.Inscribe] Pending and timeout proposal err: %s\n", errors.WithStack(err).Error()) + log.Errorf("[Handler.Inscribe] no proposal wait for inscribe. err: %s\n", errors.WithStack(err).Error()) time.Sleep(5 * time.Second) continue } @@ -30,14 +30,9 @@ func Inscribe(ctx *svc.ServiceContext) { log.Errorf("[CheckProposalPending] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) continue } - if proposal.Status == schema.ProposalSucceedStatus { - dbProposal.Status = uint64(proposal.Status) - dbProposal.Winner = proposal.Winner.String() - dbProposal.BtcTxHash = proposal.TxHash - ctx.DB.Save(dbProposal) - } + if proposal.Status == schema.ProposalPendingStatus && - proposal.Winner.String() == ctx.B2NodeConfig.Address && proposal.TxHash == "" { + proposal.Winner.String() == ctx.B2NodeConfig.Address && proposal.BtcTxHash == "" { rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, proposal.StateRootHash, proposal.ProofHash, ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) if err != nil { @@ -60,16 +55,16 @@ func Inscribe(ctx *svc.ServiceContext) { dbProposal.BtcTxHash = bitcoinTxHash ctx.DB.Save(dbProposal) } - if proposal.Status == schema.ProposalPendingStatus && proposal.TxHash != "" && proposal.Winner.String() != ctx.B2NodeConfig.Address { + if proposal.Status == schema.ProposalPendingStatus && proposal.BtcTxHash != "" && proposal.Winner.String() != ctx.B2NodeConfig.Address { // Get bitcoin txHash and query on btc network confirm status If the comparison is greater than 6 heights, submit the proposal after confirmation btcAPIClient := btcmempool.NewClient(btcapi.ChainParams(ctx.BTCConfig.NetworkName)) - transaction, err := btcAPIClient.GetTransactionByID(proposal.TxHash) + transaction, err := btcAPIClient.GetTransactionByID(proposal.BtcTxHash) if err != nil { log.Errorf("[Handler.Inscribe] GetTransactionByID err: %s\n", errors.WithStack(err).Error()) continue } if transaction.Status.Confirmed && (ctx.LatestBTCBlockNumber-transaction.Status.BlockHeight) >= 6 { - _, err = ctx.NodeClient.BitcoinTxHash(proposal.Id, proposal.TxHash) + _, err = ctx.NodeClient.BitcoinTxHash(proposal.Id, proposal.BtcTxHash) if err != nil { log.Errorf("[Handler.Inscribe] BitcoinTx err: %s\n", errors.WithStack(err).Error()) continue diff --git a/internal/handler/sequenceBatchers_test.go b/internal/handler/sequenceBatchers_test.go new file mode 100644 index 0000000..7e94ac6 --- /dev/null +++ b/internal/handler/sequenceBatchers_test.go @@ -0,0 +1,19 @@ +package handler + +import ( + "fmt" + "testing" + "time" +) + +func TestReadFile(t *testing.T) { + //content, _ := os.ReadFile("../../batchFile/56908-56949.json") + ////fmt.Println(content) + //seq := make(map[uint64][]byte) + //json.Unmarshal(content, &seq) + //for k, v := range seq { + // fmt.Println(k) + // fmt.Println(string(v)) + //} + fmt.Println(time.Now().Format("2006-01-02")) +} diff --git a/internal/handler/sequenceBatches.go b/internal/handler/sequenceBatches.go index 1298390..f29fe96 100644 --- a/internal/handler/sequenceBatches.go +++ b/internal/handler/sequenceBatches.go @@ -6,14 +6,12 @@ import ( "fmt" "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" - "github.com/b2network/b2committer/pkg/contract" "github.com/b2network/b2committer/pkg/event/zkevm" "github.com/b2network/b2committer/pkg/log" - "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" "os" - "strings" + "strconv" "time" ) @@ -32,10 +30,8 @@ type SequenceBatchesAndTxHash struct { func SequenceBatches(ctx *svc.ServiceContext) { for { var dbProposal schema.Proposal - err := ctx.DB.Where("status = ?", schema.ProposalSucceedStatus).Order("proposal_id asc").First(&dbProposal).Error - //dbProposal.StartBatchNum - //dbProposal.EndBatchNum - //collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, 718506, 719063) + err := ctx.DB.Where("status = ? and generate_details_file = ? and winner = ?", schema.ProposalCommitting, false, + ctx.B2NodeConfig.Address).Order("proposal_id asc").First(&dbProposal).Error collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) if err != nil { log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesFromStartBatchNum] error info: %s", errors.WithStack(err).Error()) @@ -53,7 +49,20 @@ func SequenceBatches(ctx *svc.ServiceContext) { time.Sleep(3 * time.Second) continue } - WriteFile(ctx, sequenceBatchesMap) + res, err := WriteFile(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum, sequenceBatchesMap) + if err != nil { + log.Errorf("[Handler.SequenceBatches][WriteFile] error info: %s", errors.WithStack(err).Error()) + time.Sleep(3 * time.Second) + continue + } + if res { + err = ctx.DB.Model(&dbProposal).Update("generate_details_file", true).Error + if err != nil { + log.Errorf("[Handler.SequenceBatches][Update] error info: %s", errors.WithStack(err).Error()) + time.Sleep(3 * time.Second) + continue + } + } } } @@ -92,48 +101,56 @@ func GetSequenceBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum }, nil } -func GetSequenceBatchesDetails(ctx *svc.ServiceContext, sequenceBatches []*SequenceBatchesAndTxHash) (map[uint64]map[string]interface{}, error) { - abiObject, err := abi.JSON(strings.NewReader(contract.SequenceMetaData.ABI)) - - if err != nil { - return nil, fmt.Errorf("[GetSequenceBatchesDetails] parse abi error: %s", errors.WithStack(err)) - } - sequenceBatchesMap := make(map[uint64]map[string]interface{}) +func GetSequenceBatchesDetails(ctx *svc.ServiceContext, sequenceBatches []*SequenceBatchesAndTxHash) (map[uint64][]byte, error) { + sequenceBatchesMap := make(map[uint64][]byte) for _, sequenceBatch := range sequenceBatches { txHash := sequenceBatch.TxHash tx, _, err := ctx.RPC.TransactionByHash(context.Background(), common.HexToHash(txHash)) if err != nil { return nil, fmt.Errorf("[GetSequenceBatchesDetails] get tx error: %s", errors.WithStack(err)) } - inputsMap, methodName := DecodeTransactionInputData(abiObject, tx.Data()) - - if methodName != "sequenceBatches" { - return nil, fmt.Errorf("[GetSequenceBatchesDetails] methodName is : %s parse method error: %s", methodName, errors.WithStack(err)) - } - sequenceBatchesMap[sequenceBatch.NumBatch] = inputsMap + sequenceBatchesMap[sequenceBatch.NumBatch] = tx.Data() } return sequenceBatchesMap, nil } -func WriteFile(ctx *svc.ServiceContext, sequenceBatchesMap map[uint64]map[string]interface{}) { +func WriteFile(ctx *svc.ServiceContext, startBatchNum uint64, endBatchNum uint64, sequenceBatchesMap map[uint64][]byte) (bool, error) { + fileName := strconv.FormatUint(startBatchNum, 10) + "-" + strconv.FormatUint(endBatchNum, 10) + ".json" jsonData, err := json.Marshal(sequenceBatchesMap) if err != nil { log.Errorf("[WriteFile] json marshal error: %s", errors.WithStack(err)) - return + return false, err } - - file, err := os.Create("output.json") + path, err := os.Getwd() if err != nil { - fmt.Println("create file error:", err) - return + log.Errorf("[WriteFile] get current path error: %s", errors.WithStack(err)) + return false, err } - defer file.Close() + filePath := path + "/" + ctx.Config.BatchPath + _, err2 := os.Stat(filePath) + if os.IsNotExist(err2) { + errDir := os.MkdirAll(filePath, os.ModePerm) + if errDir != nil { + log.Errorf("[WriteFile] create dir error: %s", errors.WithStack(errDir)) + return false, errDir + } + } + file, err := os.Create(filePath + "/" + fileName) + if err != nil { + log.Errorf("[WriteFile] create file error: %s", errors.WithStack(err)) + return false, err + } + defer func(file *os.File) { + err := file.Close() + if err != nil { + log.Errorf("[WriteFile] close file error: %s", errors.WithStack(err)) + } + }(file) _, err = file.Write(jsonData) if err != nil { - fmt.Println("write file error:", err) - return + log.Errorf("[WriteFile] write file error: %s", errors.WithStack(err)) + return false, nil } - - fmt.Println("map write file output.json success") + return true, nil } diff --git a/internal/handler/syncProposal.go b/internal/handler/syncProposal.go index 03611d3..520a93b 100644 --- a/internal/handler/syncProposal.go +++ b/internal/handler/syncProposal.go @@ -56,13 +56,14 @@ func SyncProposal(ctx *svc.ServiceContext) { ProofRootHash: proposal.ProofHash, StartBatchNum: proposal.StartIndex, EndBatchNum: proposal.EndIndex, - BtcTxHash: proposal.TxHash, + BtcTxHash: proposal.BtcTxHash, Winner: proposal.Winner.String(), Status: uint64(proposal.Status), + ArTxHash: proposal.ArweaveTxHash, } err = ctx.DB.Create(&dbProposal).Error if err != nil { - log.Errorf("[Handler.SyncProposal] db create error info:", errors.WithStack(err)) + log.Errorf("[Handler.SyncProposal] db create error info: %s", errors.WithStack(err).Error()) } } diff --git a/internal/schema/proposal.go b/internal/schema/proposal.go index 6e781e6..be2dc7e 100644 --- a/internal/schema/proposal.go +++ b/internal/schema/proposal.go @@ -3,22 +3,25 @@ package schema const ( ProposalVotingStatus = 0 ProposalPendingStatus = 1 - ProposalSucceedStatus = 2 - ProposalTimeoutStatus = 3 + ProposalCommitting = 2 + ProposalSucceedStatus = 3 + ProposalTimeoutStatus = 4 ) type Proposal struct { Base - ProposalID uint64 `json:"proposal_id"` - StateRootHash string `json:"state_root_hash"` - ProofRootHash string `json:"proof_root_hash"` - StartBatchNum uint64 `json:"start_batch_num"` - EndBatchNum uint64 `json:"end_batch_num"` - BtcTxHash string `json:"btc_tx_hash"` - Winner string `json:"winner"` - Status uint64 `json:"status"` + ProposalID uint64 `json:"proposal_id"` + StateRootHash string `json:"state_root_hash"` + ProofRootHash string `json:"proof_root_hash"` + StartBatchNum uint64 `json:"start_batch_num"` + EndBatchNum uint64 `json:"end_batch_num"` + BtcTxHash string `json:"btc_tx_hash"` + Winner string `json:"winner"` + Status uint64 `json:"status"` + GenerateDetailsFile bool `json:"generate_details_file"` + ArTxHash string `json:"ar_tx_hash"` } func (Proposal) TableName() string { - return "`proposal`" + return "proposal" } diff --git a/internal/schema/sync_blocks.go b/internal/schema/sync_blocks.go index 3972ffe..0afa244 100644 --- a/internal/schema/sync_blocks.go +++ b/internal/schema/sync_blocks.go @@ -22,11 +22,11 @@ type SyncBlock struct { } func (SyncBlock) TableName() string { - return "`sync_blocks`" + return "sync_blocks" } type SyncBlockHistory SyncBlock func (SyncBlockHistory) TableName() string { - return "`sync_blocks_history`" + return "sync_blocks_history" } diff --git a/internal/schema/sync_events.go b/internal/schema/sync_events.go index ea2bce8..a5fd184 100644 --- a/internal/schema/sync_events.go +++ b/internal/schema/sync_events.go @@ -26,11 +26,11 @@ type SyncEvent struct { } func (SyncEvent) TableName() string { - return "`sync_events`" + return "sync_events" } type SyncEventHistory SyncEvent func (SyncEventHistory) TableName() string { - return "`sync_events_history`" + return "sync_events_history" } diff --git a/internal/types/config.go b/internal/types/config.go index 58a0b0d..5f538cb 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -11,24 +11,27 @@ type Config struct { // "console","json" LogFormat string `env:"LOG_FORMAT" envDefault:"console"` PostgresqlDataSource string `env:"POSTGRESQL_DATA_SOURCE" envDefault:"host=localhost port=5433 user=postgres password=postgres dbname=b2_committer sslmode=disable"` - MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` + MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer2?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` - RPCUrl string `env:"RPC_URL" envDefault:"https://sepolia.drpc.org"` + RPCUrl string `env:"RPC_URL" envDefault:"https://habitat-hub-rpc.bsquared.network"` Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` - InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"5158900"` - InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0xc05e1c7dd54b60c5bc13ad09bad119f49a2fc82cc60215dd7eb9b1d68e147ab0"` - PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xA13Ddb14437A8F34897131367ad3ca78416d6bCa"` - PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0x32d33D5137a7cFFb54c5Bf8371172bcEc5f310ff"` + InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"0"` + InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0x49a34ca5e11dbcd56b4cad717a98efe5c76552a2dcfbdcd693a248e2fd5f8d51"` + PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xa6AAdA6845b2083ff6812bAc773038442e7f4dE6"` + PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0xDdee8ddfA81F5E36373637240038DCCC14529BF7"` LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` + BatchPath string `env:"BATCH_PATH" envDefault:"batchFile"` + ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"./wallet/account.json"` + ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` } type B2NODEConfig struct { - ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` - RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512"` - CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x12BBD3f7EF1ABEd6B9DB12A3dE77b00aE10618E0"` + ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"1113"` + RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://habitat-hub-rpc.bsquared.network"` + CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x0DD3684F0C7e6b383C7bEc2901dCDa4b5360D893"` Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go index 2076d35..49c1f38 100644 --- a/pkg/b2node/b2node.go +++ b/pkg/b2node/b2node.go @@ -72,7 +72,7 @@ func (n NodeClient) RemoveProposers(address common.Address) (*types.Transaction, func (n NodeClient) QueryLastProposal() (*contract.CommitterProposal, error) { proposal, err := n.Committer.GetLastProposal(&bind.CallOpts{ From: common.HexToAddress(n.Address), - }) + }, uint64(n.ChainID)) if err != nil { return nil, fmt.Errorf("[QueryLastProposalID] err: %s", err) } @@ -82,7 +82,7 @@ func (n NodeClient) QueryLastProposal() (*contract.CommitterProposal, error) { func (n NodeClient) QueryProposalByID(id uint64) (*contract.CommitterProposal, error) { proposal, err := n.Committer.Proposal(&bind.CallOpts{ From: common.HexToAddress(n.Address), - }, id) + }, uint64(n.ChainID), id) if err != nil { return nil, fmt.Errorf("[QueryProposalByID] err: %s", err) } @@ -95,7 +95,7 @@ func (n NodeClient) SubmitProof(id uint64, proofHash string, stateRootHash strin tx, err := n.Committer.SubmitProof(&bind.TransactOpts{ From: n.Auth.From, Signer: n.Auth.Signer, - }, id, proofHash, stateRootHash, startIndex, endIndex) + }, uint64(n.ChainID), id, proofHash, stateRootHash, startIndex, endIndex) if err != nil { return nil, fmt.Errorf("[SubmitProof] err: %s", err) } @@ -106,18 +106,29 @@ func (n NodeClient) BitcoinTxHash(id uint64, txHash string) (*types.Transaction, tx, err := n.Committer.BitcoinTx(&bind.TransactOpts{ From: n.Auth.From, Signer: n.Auth.Signer, - }, id, txHash) + }, uint64(n.ChainID), id, txHash) if err != nil { return nil, fmt.Errorf("[BitcoinTxHash] err: %s", err) } return tx, nil } +func (n NodeClient) ArweaveTx(id uint64, txHash string) (*types.Transaction, error) { + tx, err := n.Committer.ArweaveTx(&bind.TransactOpts{ + From: n.Auth.From, + Signer: n.Auth.Signer, + }, uint64(n.ChainID), id, txHash) + if err != nil { + return nil, fmt.Errorf("[ArweaveTx] err: %s", err) + } + return tx, nil +} + func (n NodeClient) TimeoutProposal(id uint64) (*types.Transaction, error) { tx, err := n.Committer.TimeoutProposal(&bind.TransactOpts{ From: n.Auth.From, Signer: n.Auth.Signer, - }, id) + }, uint64(n.ChainID), id) if err != nil { return nil, fmt.Errorf("[TimeoutProposal] err: %s", err) } @@ -127,230 +138,9 @@ func (n NodeClient) TimeoutProposal(id uint64) (*types.Transaction, error) { func (n NodeClient) IsProposalTimeout(id uint64) (bool, error) { res, err := n.Committer.IsProposalTimeout(&bind.CallOpts{ From: common.HexToAddress(n.Address), - }, id) + }, uint64(n.ChainID), id) if err != nil { return false, fmt.Errorf("[IsProposalTimeout] err: %s", err) } return res, nil } - -// -//func (n NodeClient) GetAccountInfo(address string) (*eTypes.EthAccount, error) { -// authClient := authTypes.NewQueryClient(n.GrpcConn) -// res, err := authClient.Account(context.Background(), &authTypes.QueryAccountRequest{Address: address}) -// if err != nil { -// return nil, fmt.Errorf("[NodeClient] GetAccountInfo err: %s", err) -// } -// ethAccount := &eTypes.EthAccount{} -// err = ethAccount.Unmarshal(res.GetAccount().GetValue()) -// if err != nil { -// return nil, fmt.Errorf("[NodeClient][ethAccount.Unmarshal] err: %s", err) -// } -// return ethAccount, nil -//} -// -//func (n NodeClient) SubmitProof(id uint64, from string, proofHash string, stateRootHash string, -// startIndex uint64, endIndex uint64, -//) (uint64, error) { -// msg := committerTypes.NewMsgSubmitProof(id, from, proofHash, stateRootHash, startIndex, endIndex) -// msgResponse, err := n.broadcastTx(msg) -// if err != nil { -// return 0, fmt.Errorf("[SubmitProof] err: %s", err) -// } -// code := msgResponse.TxResponse.Code -// rawLog := msgResponse.TxResponse.RawLog -// if code != 0 { -// return 0, fmt.Errorf("[SubmitProof][msgResponse.TxResponse.Code] err: %s", rawLog) -// } -// hexData := msgResponse.TxResponse.Data -// byteData, err := hex.DecodeString(hexData) -// if err != nil { -// return 0, fmt.Errorf("[SubmitProof][hex.DecodeString] err: %s", err) -// } -// pbMsg := &sdk.TxMsgData{} -// err = pbMsg.Unmarshal(byteData) -// if err != nil { -// return 0, fmt.Errorf("[SubmitProof][pbMsg.Unmarshal] err: %s", err) -// } -// -// resMsgRes := &committerTypes.MsgSubmitProofResponse{} -// err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) -// if err != nil { -// return 0, fmt.Errorf("[SubmitProof][resMsgRes.Unmarshal] err: %s", err) -// } -// return resMsgRes.Id, err -//} -// -//func (n NodeClient) BitcoinTx(proposalID uint64, from string, bitcoinTxHash string) (uint64, error) { -// msg := committerTypes.NewMsgBitcoinTx(proposalID, from, bitcoinTxHash) -// msgResponse, err := n.broadcastTx(msg) -// if err != nil { -// return 0, fmt.Errorf("[BitcoinTx] err: %s", err) -// } -// code := msgResponse.TxResponse.Code -// rawLog := msgResponse.TxResponse.RawLog -// if code != 0 { -// return 0, fmt.Errorf("[BitcoinTx][msgResponse.TxResponse.Code] err: %s", rawLog) -// } -// hexData := msgResponse.TxResponse.Data -// byteData, err := hex.DecodeString(hexData) -// if err != nil { -// return 0, fmt.Errorf("[BitcoinTx][hex.DecodeString] err: %s", err) -// } -// pbMsg := &sdk.TxMsgData{} -// err = pbMsg.Unmarshal(byteData) -// if err != nil { -// return 0, fmt.Errorf("[BitcoinTx][pbMsg.Unmarshal] err: %s", err) -// } -// -// resMsgRes := &committerTypes.MsgSubmitProofResponse{} -// err = resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) -// if err != nil { -// return 0, fmt.Errorf("[BitcoinTx][resMsgRes.Unmarshal] err: %s", err) -// } -// return resMsgRes.Id, err -//} -// -//func (n NodeClient) GetEthGasPrice() (uint64, error) { -// gasPriceByte, err := rpc.HTTPPostJSON("", n.RPCUrl, `{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}`) -// if err != nil { -// return 0, fmt.Errorf("[GetEthGasPrice] err: %s", err) -// } -// var g GasPriceRsp -// if err := json.Unmarshal(gasPriceByte, &g); err != nil { -// return 0, fmt.Errorf("[GetEthGasPrice.json.Unmarshal] err: %s", err) -// } -// parseUint, err := strconv.ParseUint(g.Result, 0, 64) -// if err != nil { -// return 0, fmt.Errorf("[GetEthGasPrice.strconv.ParseUint] err: %s", err) -// } -// return parseUint, nil -//} -// -//func (n NodeClient) GetGasPrice() (uint64, error) { -// queryClient := feeTypes.NewQueryClient(n.GrpcConn) -// res, err := queryClient.Params(context.Background(), &feeTypes.QueryParamsRequest{}) -// if err != nil { -// return 0, fmt.Errorf("[GetGasPrice] err: %s", err) -// } -// return res.Params.BaseFee.Uint64(), nil -//} -// -//func (n NodeClient) broadcastTx(msgs ...sdk.Msg) (*tx.BroadcastTxResponse, error) { -// gasPrice, err := n.GetGasPrice() -// if err != nil { -// return nil, fmt.Errorf("[broadcastTx][GetGasPrice] err: %s", err) -// } -// txBytes, err := n.buildSimTx(gasPrice, msgs...) -// if err != nil { -// return nil, fmt.Errorf("[SubmitProof] err: %s", err) -// } -// txClient := tx.NewServiceClient(n.GrpcConn) -// res, err := txClient.BroadcastTx(context.Background(), &tx.BroadcastTxRequest{ -// Mode: tx.BroadcastMode_BROADCAST_MODE_BLOCK, -// TxBytes: txBytes, -// }) -// if err != nil { -// return nil, fmt.Errorf("[SubmitProof][BroadcastTx] err: %s", err) -// } -// return res, err -//} -// -//func (n NodeClient) buildSimTx(gasPrice uint64, msgs ...sdk.Msg) ([]byte, error) { -// encCfg := simapp.MakeTestEncodingConfig() -// txBuilder := encCfg.TxConfig.NewTxBuilder() -// err := txBuilder.SetMsgs(msgs...) -// if err != nil { -// return nil, fmt.Errorf("[BuildSimTx][SetMsgs] err: %s", err) -// } -// ethAccount, err := n.GetAccountInfo(n.Address) -// if nil != err { -// return nil, fmt.Errorf("[BuildSimTx][GetAccountInfo]err: %s", err) -// } -// signV2 := signing.SignatureV2{ -// PubKey: n.PrivateKey.PubKey(), -// Data: &signing.SingleSignatureData{ -// SignMode: encCfg.TxConfig.SignModeHandler().DefaultMode(), -// }, -// Sequence: ethAccount.BaseAccount.Sequence, -// } -// err = txBuilder.SetSignatures(signV2) -// if err != nil { -// return nil, fmt.Errorf("[BuildSimTx][SetSignatures 1]err: %s", err) -// } -// txBuilder.SetGasLimit(DefaultBaseGasPrice) -// txBuilder.SetFeeAmount(sdk.NewCoins(sdk.Coin{ -// Denom: n.Denom, -// Amount: sdkmath.NewIntFromUint64(gasPrice * DefaultBaseGasPrice), -// })) -// -// signerData := xauthsigning.SignerData{ -// ChainID: n.ChainID, -// AccountNumber: ethAccount.BaseAccount.AccountNumber, -// Sequence: ethAccount.BaseAccount.Sequence, -// } -// -// sigV2, err := clientTx.SignWithPrivKey( -// encCfg.TxConfig.SignModeHandler().DefaultMode(), signerData, -// txBuilder, &n.PrivateKey, encCfg.TxConfig, ethAccount.BaseAccount.Sequence) -// if err != nil { -// return nil, fmt.Errorf("[BuildSimTx][SignWithPrivKey] err: %s", err) -// } -// -// err = txBuilder.SetSignatures(sigV2) -// if err != nil { -// return nil, fmt.Errorf("[BuildSimTx][SetSignatures 2] err: %s", err) -// } -// txBytes, err := encCfg.TxConfig.TxEncoder()(txBuilder.GetTx()) -// if err != nil { -// return nil, fmt.Errorf("[BuildSimTx][GetTx] err: %s", err) -// } -// return txBytes, err -//} -// -//func (n NodeClient) QueryLastProposalID() (uint64, uint64, error) { -// queryClient := committerTypes.NewQueryClient(n.GrpcConn) -// res, err := queryClient.LastProposalID(context.Background(), &committerTypes.QueryLastProposalIdRequest{}) -// if err != nil { -// return 0, 0, fmt.Errorf("[QueryLastProposalID] err: %s", err) -// } -// return res.LastProposalId, res.EndIndex, nil -//} -// -//func (n NodeClient) QueryProposalByID(id uint64) (*committerTypes.Proposal, error) { -// queryClient := committerTypes.NewQueryClient(n.GrpcConn) -// res, err := queryClient.Proposal(context.Background(), &committerTypes.QueryProposalRequest{ProposalId: id}) -// if err != nil { -// return nil, fmt.Errorf("[QueryProposalByID] err: %s", err) -// } -// return res.Proposal, nil -//} -// -//func (n NodeClient) CommitterBitcoinTx(msg *committerTypes.MsgBitcoinTx) (*tx.BroadcastTxResponse, error) { -// gasPrice, err := n.GetGasPrice() -// if err != nil { -// return nil, fmt.Errorf("[CommitterBitcoinTx][GetGasPrice] err: %s", err) -// } -// txBytes, err := n.buildSimTx(gasPrice, msg) -// if err != nil { -// return nil, fmt.Errorf("[SubmitProof] err: %s", err) -// } -// txClient := tx.NewServiceClient(n.GrpcConn) -// res, err := txClient.BroadcastTx(context.Background(), &tx.BroadcastTxRequest{ -// Mode: tx.BroadcastMode_BROADCAST_MODE_BLOCK, -// TxBytes: txBytes, -// }) -// if err != nil { -// return nil, fmt.Errorf("[SubmitProof][BroadcastTx] err: %s", err) -// } -// return res, err -//} -// -//func (n NodeClient) TimeoutProposal(id uint64) error { -// msg := &committerTypes.MsgTimeoutProposal{Id: id, From: n.Address} -// _, err := n.broadcastTx(msg) -// if err != nil { -// return fmt.Errorf("[TimeoutProposal] err: %s", err) -// } -// return nil -//} diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index 6e7cd8b..369c163 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -15,9 +15,9 @@ import ( const ( creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" - contractAddress = "0x12BBD3f7EF1ABEd6B9DB12A3dE77b00aE10618E0" - URL = "https://eth-sepolia.g.alchemy.com/v2/lV2e-64nNnEMUA7UG0IT0uwjzlxEI512" - chainID = 11155111 + contractAddress = "0x0DD3684F0C7e6b383C7bEc2901dCDa4b5360D893" + URL = "https://habitat-hub-rpc.bsquared.network" + chainID = 1113 ) func TestQueryTimeoutPeriod(t *testing.T) { @@ -51,6 +51,38 @@ func TestSetTimeoutPeriod(t *testing.T) { fmt.Println(tx.Hash()) } +func TestAddChain(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.AddChain(&bind.TransactOpts{ + From: auth.From, + Signer: auth.Signer, + }, 1113) + require.NoError(t, err) + fmt.Println(tx.Hash()) +} + +func TestQueryAllChain(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + res, err := committer.AllChains(&bind.CallOpts{ + From: common.HexToAddress(creatorAddress), + }) + fmt.Println(res) + require.NoError(t, err) + require.Containsf(t, res, uint64(1113), "error message %s") +} + func TestAddCommitter(t *testing.T) { conn, err := ethclient.Dial(URL) require.NoError(t, err) @@ -111,7 +143,7 @@ func TestQueryLastProposalID(t *testing.T) { require.NoError(t, err) proposal, err := committer.GetLastProposal(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), - }) + }, chainID) require.NoError(t, err) fmt.Println(proposal) } @@ -125,7 +157,7 @@ func TestQueryProposalByID(t *testing.T) { require.NoError(t, err) proposal, err := committer.Proposal(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), - }, 3) + }, chainID, 1) require.NoError(t, err) fmt.Println(proposal) } @@ -143,7 +175,7 @@ func TestSubmitProof(t *testing.T) { tx, err := committer.SubmitProof(&bind.TransactOpts{ From: common.HexToAddress(creatorAddress), Signer: auth.Signer, - }, 1, "proofHash", "stateRoot", 1, 53893) + }, chainID, 1, "proofHash", "stateRoot", 1, 56908) require.NoError(t, err) fmt.Println(tx.Hash()) } @@ -161,7 +193,25 @@ func TestBitcoinTxHash(t *testing.T) { tx, err := committer.BitcoinTx(&bind.TransactOpts{ From: common.HexToAddress(creatorAddress), Signer: auth.Signer, - }, 1, "txHash") + }, chainID, 1, "txHash") + require.NoError(t, err) + fmt.Println(tx.Hash()) +} + +func TestAr(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + require.NoError(t, err) + tx, err := committer.ArweaveTx(&bind.TransactOpts{ + From: common.HexToAddress(creatorAddress), + Signer: auth.Signer, + }, chainID, 1, "arTxhash") require.NoError(t, err) fmt.Println(tx.Hash()) } @@ -179,158 +229,7 @@ func TestTimeoutProposal(t *testing.T) { tx, err := committer.TimeoutProposal(&bind.TransactOpts{ From: common.HexToAddress(creatorAddress), Signer: auth.Signer, - }, 1) + }, chainID, 1) require.NoError(t, err) fmt.Println(tx.Hash()) } - -//func TestGetAccountInfo(t *testing.T) { -// privateKeHex := "234def6d66bb45c288521bbbd20b7b3cd542e5b6e26386dcec24f8e918251f5a" -// chainID := "ethermint_9000-1" -// address := "ethm1jvqt5echmshc8gjsqdzk9unclt8qkx4knxcjdj" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// addInfo, err := nodeClient.GetAccountInfo(address) -// // -// fmt.Println(addInfo.CodeHash) -// fmt.Println(addInfo.BaseAccount.Sequence) -// fmt.Println(addInfo.BaseAccount.Address) -//} -// -//func TestSubmitProof(t *testing.T) { -// privateKeHex := "234def6d66bb45c288521bbbd20b7b3cd542e5b6e26386dcec24f8e918251f5a" -// chainID := "ethermint_9000-1" -// address := "ethm1jvqt5echmshc8gjsqdzk9unclt8qkx4knxcjdj" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// proposalID, err := nodeClient.SubmitProof(0, address, "proof7", "stateRoot", 1, 70) -// require.NoError(t, err) -// fmt.Println(proposalID) -//} -// -//func TestDecodeTxResponseData(t *testing.T) { -// byteData, _ := hex.DecodeString("12370A312F65766D6F732E65746865726D696E742E636F6D6D69747465722E4D73675375626D697450726F6F66526573706F6E736512020808") -// pbMsg := &sdk.TxMsgData{} -// // proto.Marshal(&sdk.TxMsgData{MsgResponses: msgResponses}) -// pbMsg.Unmarshal(byteData) -// fmt.Println(pbMsg.MsgResponses[0].TypeUrl) -// resMsgRes := &xcommitterTypes.MsgSubmitProofResponse{} -// resMsgRes.Unmarshal(pbMsg.MsgResponses[0].GetValue()) -// fmt.Println(resMsgRes.Id) -//} -// -//func TestQueryLastProposalID(t *testing.T) { -// privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" -// chainID := "ethermint_9000-1" -// address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// lastID, endIndex, err := nodeClient.QueryLastProposalID() -// if err != nil { -// panic(err) -// } -// fmt.Println("lastID:", lastID) -// fmt.Println("index:", endIndex) -//} -// -//func TestQueryProposalByID(t *testing.T) { -// privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" -// chainID := "ethermint_9000-1" -// address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// proposal, err := nodeClient.QueryProposalByID(6) -// fmt.Println("id:", proposal.Id) -// fmt.Println("proposer:", proposal.Proposer) -// fmt.Println("status:", proposal.Status) -// fmt.Println("stateRootHash:", proposal.StateRootHash) -// fmt.Println("winner:", proposal.Winner) -// fmt.Println("voteList:", proposal.VotedListPhaseCommit) -// fmt.Println("start index:", proposal.StartIndex) -// fmt.Println("end index:", proposal.EndIndex) -// fmt.Println("bitcoinTx:", proposal.BitcoinTxHash) -//} -// -//func TestCommitterBitcoinTx(t *testing.T) { -// privateKeHex := "53da55319c649af5dec2d9ff11c0476698b27cf3bf8dfbce55fd29ab78caadf0" -// chainID := "ethermint_9000-1" -// address := "ethm17ezey9h6zw0yzaxq00w3gmt0rdet063v3vfmee" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// res, err := nodeClient.CommitterBitcoinTx(&xcommitterTypes.MsgBitcoinTx{Id: 1, From: "ethm10ky5utnz5ddlmus5t2mm5ftxal3u0u6rsnx5nl", BitcoinTxHash: "1234567890"}) -// require.NoError(t, err) -// fmt.Println(res) -//} -// -//func TestGetETHGasPrice(t *testing.T) { -// privateKeHex := "0c993419ff40521f20370c45721c92626c2f1fd35267258fb3d093ed0826b611" -// chainID := "ethermint_9000-1" -// address := "ethm1mffw0yzmusgm9fwd40jaal3vwustuhhx8rh03q" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// gasprice, err := nodeClient.GetEthGasPrice() -// require.NoError(t, err) -// fmt.Println(gasprice) -//} -// -//func TestGetGasPrice(t *testing.T) { -// privateKeHex := "37927fcde10259a7114a58487cb6303d04c33291ba29bbb8e488eef150e6a59a" -// chainID := "ethermint_9000-1" -// address := "ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// gasPrice, err := nodeClient.GetGasPrice() -// require.NoError(t, err) -// fmt.Println(gasPrice) -//} -// -//func TestAddCommitter(t *testing.T) { -// privateKeHex := "37927fcde10259a7114a58487cb6303d04c33291ba29bbb8e488eef150e6a59a" -// chainID := "ethermint_9000-1" -// address := "ethm1nexknt73vdv6cm3h6ep6u7pe9vg8kr6kqwyl0a" -// rpcUrl := "http://localhost:8545" -// denom := "aphoton" -// grpcConn, err := types.GetClientConnection("127.0.0.1", types.WithClientPortOption(9090)) -// if err != nil { -// panic(err) -// } -// nodeClient := NewNodeClient(privateKeHex, chainID, address, grpcConn, rpcUrl, denom) -// add, err := nodeClient.AddCommitter("ethm1c3csplac80qt22p5qwx3l5telv6ge9ycmzwe3w") -// require.NoError(t, err) -// fmt.Println(add) -//} diff --git a/pkg/contract/committer.go b/pkg/contract/committer.go index f16d8f6..200784c 100644 --- a/pkg/contract/committer.go +++ b/pkg/contract/committer.go @@ -39,12 +39,13 @@ type CommitterProposal struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string } // CommitterMetaData contains all meta data concerning the Committer contract. var CommitterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ProposalTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"phase\",\"type\":\"uint8\"}],\"name\":\"VoteProposal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"addProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allCommitPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allProposers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"allTimeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"bitcoinTx\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"commitPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"isProposalTimeout\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isProposer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnCommitPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnTimeoutPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"proposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"proposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proposers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proposersList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"removeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"}],\"name\":\"submitProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"timeoutPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"}],\"name\":\"timeoutProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProposalIsNotExist\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"ProposalSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"ProposalTimedOut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"phase\",\"type\":\"uint8\"}],\"name\":\"VoteProposal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"}],\"name\":\"addChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"addProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allProposers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"allSubmitBitcoinTxVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"allSubmitProofVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"arweaveTx\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"bitcoinTx\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"chains\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"chainsList\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"a\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"b\",\"type\":\"string\"}],\"name\":\"compareStrings\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"}],\"name\":\"getLastProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"btcTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"arweaveTxHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"isProposalTimeout\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isProposer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnBitcoinTxPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnSubmitProofPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"lastProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"btcTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"arweaveTxHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"proposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"btcTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"arweaveTxHash\",\"type\":\"string\"}],\"internalType\":\"structCommitter.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"proposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"btcTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"arweaveTxHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proposers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proposersList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"}],\"name\":\"removeChain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"removeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"submitBitcoinTxPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"proofHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"stateRootHash\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endIndex\",\"type\":\"uint64\"}],\"name\":\"submitProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"submitProofPhaseVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"timeoutProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // CommitterABI is the input ABI used to generate the binding from. @@ -255,35 +256,35 @@ func (_Committer *CommitterCallerSession) DEFAULTADMINROLE() ([32]byte, error) { return _Committer.Contract.DEFAULTADMINROLE(&_Committer.CallOpts) } -// AllCommitPhaseVotes is a free data retrieval call binding the contract method 0x80214794. +// AllChains is a free data retrieval call binding the contract method 0x7f3f94b1. // -// Solidity: function allCommitPhaseVotes(uint64 id) view returns(address[]) -func (_Committer *CommitterCaller) AllCommitPhaseVotes(opts *bind.CallOpts, id uint64) ([]common.Address, error) { +// Solidity: function allChains() view returns(uint64[]) +func (_Committer *CommitterCaller) AllChains(opts *bind.CallOpts) ([]uint64, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "allCommitPhaseVotes", id) + err := _Committer.contract.Call(opts, &out, "allChains") if err != nil { - return *new([]common.Address), err + return *new([]uint64), err } - out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) return out0, err } -// AllCommitPhaseVotes is a free data retrieval call binding the contract method 0x80214794. +// AllChains is a free data retrieval call binding the contract method 0x7f3f94b1. // -// Solidity: function allCommitPhaseVotes(uint64 id) view returns(address[]) -func (_Committer *CommitterSession) AllCommitPhaseVotes(id uint64) ([]common.Address, error) { - return _Committer.Contract.AllCommitPhaseVotes(&_Committer.CallOpts, id) +// Solidity: function allChains() view returns(uint64[]) +func (_Committer *CommitterSession) AllChains() ([]uint64, error) { + return _Committer.Contract.AllChains(&_Committer.CallOpts) } -// AllCommitPhaseVotes is a free data retrieval call binding the contract method 0x80214794. +// AllChains is a free data retrieval call binding the contract method 0x7f3f94b1. // -// Solidity: function allCommitPhaseVotes(uint64 id) view returns(address[]) -func (_Committer *CommitterCallerSession) AllCommitPhaseVotes(id uint64) ([]common.Address, error) { - return _Committer.Contract.AllCommitPhaseVotes(&_Committer.CallOpts, id) +// Solidity: function allChains() view returns(uint64[]) +func (_Committer *CommitterCallerSession) AllChains() ([]uint64, error) { + return _Committer.Contract.AllChains(&_Committer.CallOpts) } // AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. @@ -317,12 +318,12 @@ func (_Committer *CommitterCallerSession) AllProposers() ([]common.Address, erro return _Committer.Contract.AllProposers(&_Committer.CallOpts) } -// AllTimeoutPhaseVotes is a free data retrieval call binding the contract method 0xd1264f6b. +// AllSubmitBitcoinTxVotes is a free data retrieval call binding the contract method 0xbedc7561. // -// Solidity: function allTimeoutPhaseVotes(uint64 id) view returns(address[]) -func (_Committer *CommitterCaller) AllTimeoutPhaseVotes(opts *bind.CallOpts, id uint64) ([]common.Address, error) { +// Solidity: function allSubmitBitcoinTxVotes(uint64 chainID, uint64 proposalID) view returns(address[]) +func (_Committer *CommitterCaller) AllSubmitBitcoinTxVotes(opts *bind.CallOpts, chainID uint64, proposalID uint64) ([]common.Address, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "allTimeoutPhaseVotes", id) + err := _Committer.contract.Call(opts, &out, "allSubmitBitcoinTxVotes", chainID, proposalID) if err != nil { return *new([]common.Address), err @@ -334,57 +335,150 @@ func (_Committer *CommitterCaller) AllTimeoutPhaseVotes(opts *bind.CallOpts, id } -// AllTimeoutPhaseVotes is a free data retrieval call binding the contract method 0xd1264f6b. +// AllSubmitBitcoinTxVotes is a free data retrieval call binding the contract method 0xbedc7561. // -// Solidity: function allTimeoutPhaseVotes(uint64 id) view returns(address[]) -func (_Committer *CommitterSession) AllTimeoutPhaseVotes(id uint64) ([]common.Address, error) { - return _Committer.Contract.AllTimeoutPhaseVotes(&_Committer.CallOpts, id) +// Solidity: function allSubmitBitcoinTxVotes(uint64 chainID, uint64 proposalID) view returns(address[]) +func (_Committer *CommitterSession) AllSubmitBitcoinTxVotes(chainID uint64, proposalID uint64) ([]common.Address, error) { + return _Committer.Contract.AllSubmitBitcoinTxVotes(&_Committer.CallOpts, chainID, proposalID) } -// AllTimeoutPhaseVotes is a free data retrieval call binding the contract method 0xd1264f6b. +// AllSubmitBitcoinTxVotes is a free data retrieval call binding the contract method 0xbedc7561. // -// Solidity: function allTimeoutPhaseVotes(uint64 id) view returns(address[]) -func (_Committer *CommitterCallerSession) AllTimeoutPhaseVotes(id uint64) ([]common.Address, error) { - return _Committer.Contract.AllTimeoutPhaseVotes(&_Committer.CallOpts, id) +// Solidity: function allSubmitBitcoinTxVotes(uint64 chainID, uint64 proposalID) view returns(address[]) +func (_Committer *CommitterCallerSession) AllSubmitBitcoinTxVotes(chainID uint64, proposalID uint64) ([]common.Address, error) { + return _Committer.Contract.AllSubmitBitcoinTxVotes(&_Committer.CallOpts, chainID, proposalID) } -// CommitPhaseVotes is a free data retrieval call binding the contract method 0xf5033e0d. +// AllSubmitProofVotes is a free data retrieval call binding the contract method 0xea7d929a. // -// Solidity: function commitPhaseVotes(uint64 , uint256 ) view returns(address) -func (_Committer *CommitterCaller) CommitPhaseVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { +// Solidity: function allSubmitProofVotes(uint64 chainID, uint64 proposalID) view returns(address[]) +func (_Committer *CommitterCaller) AllSubmitProofVotes(opts *bind.CallOpts, chainID uint64, proposalID uint64) ([]common.Address, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "commitPhaseVotes", arg0, arg1) + err := _Committer.contract.Call(opts, &out, "allSubmitProofVotes", chainID, proposalID) if err != nil { - return *new(common.Address), err + return *new([]common.Address), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) return out0, err } -// CommitPhaseVotes is a free data retrieval call binding the contract method 0xf5033e0d. +// AllSubmitProofVotes is a free data retrieval call binding the contract method 0xea7d929a. // -// Solidity: function commitPhaseVotes(uint64 , uint256 ) view returns(address) -func (_Committer *CommitterSession) CommitPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { - return _Committer.Contract.CommitPhaseVotes(&_Committer.CallOpts, arg0, arg1) +// Solidity: function allSubmitProofVotes(uint64 chainID, uint64 proposalID) view returns(address[]) +func (_Committer *CommitterSession) AllSubmitProofVotes(chainID uint64, proposalID uint64) ([]common.Address, error) { + return _Committer.Contract.AllSubmitProofVotes(&_Committer.CallOpts, chainID, proposalID) } -// CommitPhaseVotes is a free data retrieval call binding the contract method 0xf5033e0d. +// AllSubmitProofVotes is a free data retrieval call binding the contract method 0xea7d929a. // -// Solidity: function commitPhaseVotes(uint64 , uint256 ) view returns(address) -func (_Committer *CommitterCallerSession) CommitPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { - return _Committer.Contract.CommitPhaseVotes(&_Committer.CallOpts, arg0, arg1) +// Solidity: function allSubmitProofVotes(uint64 chainID, uint64 proposalID) view returns(address[]) +func (_Committer *CommitterCallerSession) AllSubmitProofVotes(chainID uint64, proposalID uint64) ([]common.Address, error) { + return _Committer.Contract.AllSubmitProofVotes(&_Committer.CallOpts, chainID, proposalID) } -// GetLastProposal is a free data retrieval call binding the contract method 0xf0ab3dd9. +// Chains is a free data retrieval call binding the contract method 0xada8bcdc. // -// Solidity: function getLastProposal() view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) -func (_Committer *CommitterCaller) GetLastProposal(opts *bind.CallOpts) (CommitterProposal, error) { +// Solidity: function chains(uint64 ) view returns(bool) +func (_Committer *CommitterCaller) Chains(opts *bind.CallOpts, arg0 uint64) (bool, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "getLastProposal") + err := _Committer.contract.Call(opts, &out, "chains", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Chains is a free data retrieval call binding the contract method 0xada8bcdc. +// +// Solidity: function chains(uint64 ) view returns(bool) +func (_Committer *CommitterSession) Chains(arg0 uint64) (bool, error) { + return _Committer.Contract.Chains(&_Committer.CallOpts, arg0) +} + +// Chains is a free data retrieval call binding the contract method 0xada8bcdc. +// +// Solidity: function chains(uint64 ) view returns(bool) +func (_Committer *CommitterCallerSession) Chains(arg0 uint64) (bool, error) { + return _Committer.Contract.Chains(&_Committer.CallOpts, arg0) +} + +// ChainsList is a free data retrieval call binding the contract method 0x2bc3db0a. +// +// Solidity: function chainsList(uint256 ) view returns(uint64) +func (_Committer *CommitterCaller) ChainsList(opts *bind.CallOpts, arg0 *big.Int) (uint64, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "chainsList", arg0) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ChainsList is a free data retrieval call binding the contract method 0x2bc3db0a. +// +// Solidity: function chainsList(uint256 ) view returns(uint64) +func (_Committer *CommitterSession) ChainsList(arg0 *big.Int) (uint64, error) { + return _Committer.Contract.ChainsList(&_Committer.CallOpts, arg0) +} + +// ChainsList is a free data retrieval call binding the contract method 0x2bc3db0a. +// +// Solidity: function chainsList(uint256 ) view returns(uint64) +func (_Committer *CommitterCallerSession) ChainsList(arg0 *big.Int) (uint64, error) { + return _Committer.Contract.ChainsList(&_Committer.CallOpts, arg0) +} + +// CompareStrings is a free data retrieval call binding the contract method 0xbed34bba. +// +// Solidity: function compareStrings(string a, string b) pure returns(bool) +func (_Committer *CommitterCaller) CompareStrings(opts *bind.CallOpts, a string, b string) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "compareStrings", a, b) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// CompareStrings is a free data retrieval call binding the contract method 0xbed34bba. +// +// Solidity: function compareStrings(string a, string b) pure returns(bool) +func (_Committer *CommitterSession) CompareStrings(a string, b string) (bool, error) { + return _Committer.Contract.CompareStrings(&_Committer.CallOpts, a, b) +} + +// CompareStrings is a free data retrieval call binding the contract method 0xbed34bba. +// +// Solidity: function compareStrings(string a, string b) pure returns(bool) +func (_Committer *CommitterCallerSession) CompareStrings(a string, b string) (bool, error) { + return _Committer.Contract.CompareStrings(&_Committer.CallOpts, a, b) +} + +// GetLastProposal is a free data retrieval call binding the contract method 0xa2c732fd. +// +// Solidity: function getLastProposal(uint64 chainID) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string,string)) +func (_Committer *CommitterCaller) GetLastProposal(opts *bind.CallOpts, chainID uint64) (CommitterProposal, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "getLastProposal", chainID) if err != nil { return *new(CommitterProposal), err @@ -396,18 +490,18 @@ func (_Committer *CommitterCaller) GetLastProposal(opts *bind.CallOpts) (Committ } -// GetLastProposal is a free data retrieval call binding the contract method 0xf0ab3dd9. +// GetLastProposal is a free data retrieval call binding the contract method 0xa2c732fd. // -// Solidity: function getLastProposal() view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) -func (_Committer *CommitterSession) GetLastProposal() (CommitterProposal, error) { - return _Committer.Contract.GetLastProposal(&_Committer.CallOpts) +// Solidity: function getLastProposal(uint64 chainID) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string,string)) +func (_Committer *CommitterSession) GetLastProposal(chainID uint64) (CommitterProposal, error) { + return _Committer.Contract.GetLastProposal(&_Committer.CallOpts, chainID) } -// GetLastProposal is a free data retrieval call binding the contract method 0xf0ab3dd9. +// GetLastProposal is a free data retrieval call binding the contract method 0xa2c732fd. // -// Solidity: function getLastProposal() view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) -func (_Committer *CommitterCallerSession) GetLastProposal() (CommitterProposal, error) { - return _Committer.Contract.GetLastProposal(&_Committer.CallOpts) +// Solidity: function getLastProposal(uint64 chainID) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string,string)) +func (_Committer *CommitterCallerSession) GetLastProposal(chainID uint64) (CommitterProposal, error) { + return _Committer.Contract.GetLastProposal(&_Committer.CallOpts, chainID) } // GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. @@ -472,12 +566,12 @@ func (_Committer *CommitterCallerSession) HasRole(role [32]byte, account common. return _Committer.Contract.HasRole(&_Committer.CallOpts, role, account) } -// IsProposalTimeout is a free data retrieval call binding the contract method 0x6e06958d. +// IsProposalTimeout is a free data retrieval call binding the contract method 0x1b77a930. // -// Solidity: function isProposalTimeout(uint64 id) view returns(bool) -func (_Committer *CommitterCaller) IsProposalTimeout(opts *bind.CallOpts, id uint64) (bool, error) { +// Solidity: function isProposalTimeout(uint64 chainID, uint64 proposalID) view returns(bool) +func (_Committer *CommitterCaller) IsProposalTimeout(opts *bind.CallOpts, chainID uint64, proposalID uint64) (bool, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "isProposalTimeout", id) + err := _Committer.contract.Call(opts, &out, "isProposalTimeout", chainID, proposalID) if err != nil { return *new(bool), err @@ -489,18 +583,18 @@ func (_Committer *CommitterCaller) IsProposalTimeout(opts *bind.CallOpts, id uin } -// IsProposalTimeout is a free data retrieval call binding the contract method 0x6e06958d. +// IsProposalTimeout is a free data retrieval call binding the contract method 0x1b77a930. // -// Solidity: function isProposalTimeout(uint64 id) view returns(bool) -func (_Committer *CommitterSession) IsProposalTimeout(id uint64) (bool, error) { - return _Committer.Contract.IsProposalTimeout(&_Committer.CallOpts, id) +// Solidity: function isProposalTimeout(uint64 chainID, uint64 proposalID) view returns(bool) +func (_Committer *CommitterSession) IsProposalTimeout(chainID uint64, proposalID uint64) (bool, error) { + return _Committer.Contract.IsProposalTimeout(&_Committer.CallOpts, chainID, proposalID) } -// IsProposalTimeout is a free data retrieval call binding the contract method 0x6e06958d. +// IsProposalTimeout is a free data retrieval call binding the contract method 0x1b77a930. // -// Solidity: function isProposalTimeout(uint64 id) view returns(bool) -func (_Committer *CommitterCallerSession) IsProposalTimeout(id uint64) (bool, error) { - return _Committer.Contract.IsProposalTimeout(&_Committer.CallOpts, id) +// Solidity: function isProposalTimeout(uint64 chainID, uint64 proposalID) view returns(bool) +func (_Committer *CommitterCallerSession) IsProposalTimeout(chainID uint64, proposalID uint64) (bool, error) { + return _Committer.Contract.IsProposalTimeout(&_Committer.CallOpts, chainID, proposalID) } // IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. @@ -534,12 +628,43 @@ func (_Committer *CommitterCallerSession) IsProposer(sender common.Address) (boo return _Committer.Contract.IsProposer(&_Committer.CallOpts, sender) } -// IsVotedOnCommitPhase is a free data retrieval call binding the contract method 0x9cd80503. +// IsSupportedChain is a free data retrieval call binding the contract method 0x8926f54f. +// +// Solidity: function isSupportedChain(uint64 chainID) view returns(bool) +func (_Committer *CommitterCaller) IsSupportedChain(opts *bind.CallOpts, chainID uint64) (bool, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "isSupportedChain", chainID) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsSupportedChain is a free data retrieval call binding the contract method 0x8926f54f. +// +// Solidity: function isSupportedChain(uint64 chainID) view returns(bool) +func (_Committer *CommitterSession) IsSupportedChain(chainID uint64) (bool, error) { + return _Committer.Contract.IsSupportedChain(&_Committer.CallOpts, chainID) +} + +// IsSupportedChain is a free data retrieval call binding the contract method 0x8926f54f. +// +// Solidity: function isSupportedChain(uint64 chainID) view returns(bool) +func (_Committer *CommitterCallerSession) IsSupportedChain(chainID uint64) (bool, error) { + return _Committer.Contract.IsSupportedChain(&_Committer.CallOpts, chainID) +} + +// IsVotedOnBitcoinTxPhase is a free data retrieval call binding the contract method 0x87c8eabd. // -// Solidity: function isVotedOnCommitPhase(uint64 id, address voter) view returns(bool) -func (_Committer *CommitterCaller) IsVotedOnCommitPhase(opts *bind.CallOpts, id uint64, voter common.Address) (bool, error) { +// Solidity: function isVotedOnBitcoinTxPhase(uint64 chainID, uint64 proposalID, address voter) view returns(bool) +func (_Committer *CommitterCaller) IsVotedOnBitcoinTxPhase(opts *bind.CallOpts, chainID uint64, proposalID uint64, voter common.Address) (bool, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "isVotedOnCommitPhase", id, voter) + err := _Committer.contract.Call(opts, &out, "isVotedOnBitcoinTxPhase", chainID, proposalID, voter) if err != nil { return *new(bool), err @@ -551,26 +676,26 @@ func (_Committer *CommitterCaller) IsVotedOnCommitPhase(opts *bind.CallOpts, id } -// IsVotedOnCommitPhase is a free data retrieval call binding the contract method 0x9cd80503. +// IsVotedOnBitcoinTxPhase is a free data retrieval call binding the contract method 0x87c8eabd. // -// Solidity: function isVotedOnCommitPhase(uint64 id, address voter) view returns(bool) -func (_Committer *CommitterSession) IsVotedOnCommitPhase(id uint64, voter common.Address) (bool, error) { - return _Committer.Contract.IsVotedOnCommitPhase(&_Committer.CallOpts, id, voter) +// Solidity: function isVotedOnBitcoinTxPhase(uint64 chainID, uint64 proposalID, address voter) view returns(bool) +func (_Committer *CommitterSession) IsVotedOnBitcoinTxPhase(chainID uint64, proposalID uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnBitcoinTxPhase(&_Committer.CallOpts, chainID, proposalID, voter) } -// IsVotedOnCommitPhase is a free data retrieval call binding the contract method 0x9cd80503. +// IsVotedOnBitcoinTxPhase is a free data retrieval call binding the contract method 0x87c8eabd. // -// Solidity: function isVotedOnCommitPhase(uint64 id, address voter) view returns(bool) -func (_Committer *CommitterCallerSession) IsVotedOnCommitPhase(id uint64, voter common.Address) (bool, error) { - return _Committer.Contract.IsVotedOnCommitPhase(&_Committer.CallOpts, id, voter) +// Solidity: function isVotedOnBitcoinTxPhase(uint64 chainID, uint64 proposalID, address voter) view returns(bool) +func (_Committer *CommitterCallerSession) IsVotedOnBitcoinTxPhase(chainID uint64, proposalID uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnBitcoinTxPhase(&_Committer.CallOpts, chainID, proposalID, voter) } -// IsVotedOnTimeoutPhase is a free data retrieval call binding the contract method 0xee253cf5. +// IsVotedOnSubmitProofPhase is a free data retrieval call binding the contract method 0x975a4ce7. // -// Solidity: function isVotedOnTimeoutPhase(uint64 id, address voter) view returns(bool) -func (_Committer *CommitterCaller) IsVotedOnTimeoutPhase(opts *bind.CallOpts, id uint64, voter common.Address) (bool, error) { +// Solidity: function isVotedOnSubmitProofPhase(uint64 chainID, uint64 proposalID, address voter) view returns(bool) +func (_Committer *CommitterCaller) IsVotedOnSubmitProofPhase(opts *bind.CallOpts, chainID uint64, proposalID uint64, voter common.Address) (bool, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "isVotedOnTimeoutPhase", id, voter) + err := _Committer.contract.Call(opts, &out, "isVotedOnSubmitProofPhase", chainID, proposalID, voter) if err != nil { return *new(bool), err @@ -582,24 +707,24 @@ func (_Committer *CommitterCaller) IsVotedOnTimeoutPhase(opts *bind.CallOpts, id } -// IsVotedOnTimeoutPhase is a free data retrieval call binding the contract method 0xee253cf5. +// IsVotedOnSubmitProofPhase is a free data retrieval call binding the contract method 0x975a4ce7. // -// Solidity: function isVotedOnTimeoutPhase(uint64 id, address voter) view returns(bool) -func (_Committer *CommitterSession) IsVotedOnTimeoutPhase(id uint64, voter common.Address) (bool, error) { - return _Committer.Contract.IsVotedOnTimeoutPhase(&_Committer.CallOpts, id, voter) +// Solidity: function isVotedOnSubmitProofPhase(uint64 chainID, uint64 proposalID, address voter) view returns(bool) +func (_Committer *CommitterSession) IsVotedOnSubmitProofPhase(chainID uint64, proposalID uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnSubmitProofPhase(&_Committer.CallOpts, chainID, proposalID, voter) } -// IsVotedOnTimeoutPhase is a free data retrieval call binding the contract method 0xee253cf5. +// IsVotedOnSubmitProofPhase is a free data retrieval call binding the contract method 0x975a4ce7. // -// Solidity: function isVotedOnTimeoutPhase(uint64 id, address voter) view returns(bool) -func (_Committer *CommitterCallerSession) IsVotedOnTimeoutPhase(id uint64, voter common.Address) (bool, error) { - return _Committer.Contract.IsVotedOnTimeoutPhase(&_Committer.CallOpts, id, voter) +// Solidity: function isVotedOnSubmitProofPhase(uint64 chainID, uint64 proposalID, address voter) view returns(bool) +func (_Committer *CommitterCallerSession) IsVotedOnSubmitProofPhase(chainID uint64, proposalID uint64, voter common.Address) (bool, error) { + return _Committer.Contract.IsVotedOnSubmitProofPhase(&_Committer.CallOpts, chainID, proposalID, voter) } -// LastProposal is a free data retrieval call binding the contract method 0xd6740cdb. +// LastProposal is a free data retrieval call binding the contract method 0x36a31476. // -// Solidity: function lastProposal() view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) -func (_Committer *CommitterCaller) LastProposal(opts *bind.CallOpts) (struct { +// Solidity: function lastProposal(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string btcTxHash, string arweaveTxHash) +func (_Committer *CommitterCaller) LastProposal(opts *bind.CallOpts, arg0 uint64) (struct { Id uint64 StartIndex uint64 EndIndex uint64 @@ -608,10 +733,11 @@ func (_Committer *CommitterCaller) LastProposal(opts *bind.CallOpts) (struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "lastProposal") + err := _Committer.contract.Call(opts, &out, "lastProposal", arg0) outstruct := new(struct { Id uint64 @@ -622,7 +748,8 @@ func (_Committer *CommitterCaller) LastProposal(opts *bind.CallOpts) (struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }) if err != nil { return *outstruct, err @@ -636,16 +763,17 @@ func (_Committer *CommitterCaller) LastProposal(opts *bind.CallOpts) (struct { outstruct.Winner = *abi.ConvertType(out[5], new(common.Address)).(*common.Address) outstruct.ProofHash = *abi.ConvertType(out[6], new(string)).(*string) outstruct.StateRootHash = *abi.ConvertType(out[7], new(string)).(*string) - outstruct.TxHash = *abi.ConvertType(out[8], new(string)).(*string) + outstruct.BtcTxHash = *abi.ConvertType(out[8], new(string)).(*string) + outstruct.ArweaveTxHash = *abi.ConvertType(out[9], new(string)).(*string) return *outstruct, err } -// LastProposal is a free data retrieval call binding the contract method 0xd6740cdb. +// LastProposal is a free data retrieval call binding the contract method 0x36a31476. // -// Solidity: function lastProposal() view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) -func (_Committer *CommitterSession) LastProposal() (struct { +// Solidity: function lastProposal(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string btcTxHash, string arweaveTxHash) +func (_Committer *CommitterSession) LastProposal(arg0 uint64) (struct { Id uint64 StartIndex uint64 EndIndex uint64 @@ -654,15 +782,16 @@ func (_Committer *CommitterSession) LastProposal() (struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }, error) { - return _Committer.Contract.LastProposal(&_Committer.CallOpts) + return _Committer.Contract.LastProposal(&_Committer.CallOpts, arg0) } -// LastProposal is a free data retrieval call binding the contract method 0xd6740cdb. +// LastProposal is a free data retrieval call binding the contract method 0x36a31476. // -// Solidity: function lastProposal() view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) -func (_Committer *CommitterCallerSession) LastProposal() (struct { +// Solidity: function lastProposal(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string btcTxHash, string arweaveTxHash) +func (_Committer *CommitterCallerSession) LastProposal(arg0 uint64) (struct { Id uint64 StartIndex uint64 EndIndex uint64 @@ -671,17 +800,18 @@ func (_Committer *CommitterCallerSession) LastProposal() (struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }, error) { - return _Committer.Contract.LastProposal(&_Committer.CallOpts) + return _Committer.Contract.LastProposal(&_Committer.CallOpts, arg0) } -// Proposal is a free data retrieval call binding the contract method 0x7afa0aa3. +// Proposal is a free data retrieval call binding the contract method 0x0f93fa52. // -// Solidity: function proposal(uint64 id) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) -func (_Committer *CommitterCaller) Proposal(opts *bind.CallOpts, id uint64) (CommitterProposal, error) { +// Solidity: function proposal(uint64 chainID, uint64 proposalID) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string,string)) +func (_Committer *CommitterCaller) Proposal(opts *bind.CallOpts, chainID uint64, proposalID uint64) (CommitterProposal, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "proposal", id) + err := _Committer.contract.Call(opts, &out, "proposal", chainID, proposalID) if err != nil { return *new(CommitterProposal), err @@ -693,24 +823,24 @@ func (_Committer *CommitterCaller) Proposal(opts *bind.CallOpts, id uint64) (Com } -// Proposal is a free data retrieval call binding the contract method 0x7afa0aa3. +// Proposal is a free data retrieval call binding the contract method 0x0f93fa52. // -// Solidity: function proposal(uint64 id) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) -func (_Committer *CommitterSession) Proposal(id uint64) (CommitterProposal, error) { - return _Committer.Contract.Proposal(&_Committer.CallOpts, id) +// Solidity: function proposal(uint64 chainID, uint64 proposalID) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string,string)) +func (_Committer *CommitterSession) Proposal(chainID uint64, proposalID uint64) (CommitterProposal, error) { + return _Committer.Contract.Proposal(&_Committer.CallOpts, chainID, proposalID) } -// Proposal is a free data retrieval call binding the contract method 0x7afa0aa3. +// Proposal is a free data retrieval call binding the contract method 0x0f93fa52. // -// Solidity: function proposal(uint64 id) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string)) -func (_Committer *CommitterCallerSession) Proposal(id uint64) (CommitterProposal, error) { - return _Committer.Contract.Proposal(&_Committer.CallOpts, id) +// Solidity: function proposal(uint64 chainID, uint64 proposalID) view returns((uint64,uint64,uint64,uint8,uint256,address,string,string,string,string)) +func (_Committer *CommitterCallerSession) Proposal(chainID uint64, proposalID uint64) (CommitterProposal, error) { + return _Committer.Contract.Proposal(&_Committer.CallOpts, chainID, proposalID) } -// Proposals is a free data retrieval call binding the contract method 0x31c5eec8. +// Proposals is a free data retrieval call binding the contract method 0x7176d85d. // -// Solidity: function proposals(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) -func (_Committer *CommitterCaller) Proposals(opts *bind.CallOpts, arg0 uint64) (struct { +// Solidity: function proposals(uint64 , uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string btcTxHash, string arweaveTxHash) +func (_Committer *CommitterCaller) Proposals(opts *bind.CallOpts, arg0 uint64, arg1 uint64) (struct { Id uint64 StartIndex uint64 EndIndex uint64 @@ -719,10 +849,11 @@ func (_Committer *CommitterCaller) Proposals(opts *bind.CallOpts, arg0 uint64) ( Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }, error) { var out []interface{} - err := _Committer.contract.Call(opts, &out, "proposals", arg0) + err := _Committer.contract.Call(opts, &out, "proposals", arg0, arg1) outstruct := new(struct { Id uint64 @@ -733,7 +864,8 @@ func (_Committer *CommitterCaller) Proposals(opts *bind.CallOpts, arg0 uint64) ( Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }) if err != nil { return *outstruct, err @@ -747,16 +879,17 @@ func (_Committer *CommitterCaller) Proposals(opts *bind.CallOpts, arg0 uint64) ( outstruct.Winner = *abi.ConvertType(out[5], new(common.Address)).(*common.Address) outstruct.ProofHash = *abi.ConvertType(out[6], new(string)).(*string) outstruct.StateRootHash = *abi.ConvertType(out[7], new(string)).(*string) - outstruct.TxHash = *abi.ConvertType(out[8], new(string)).(*string) + outstruct.BtcTxHash = *abi.ConvertType(out[8], new(string)).(*string) + outstruct.ArweaveTxHash = *abi.ConvertType(out[9], new(string)).(*string) return *outstruct, err } -// Proposals is a free data retrieval call binding the contract method 0x31c5eec8. +// Proposals is a free data retrieval call binding the contract method 0x7176d85d. // -// Solidity: function proposals(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) -func (_Committer *CommitterSession) Proposals(arg0 uint64) (struct { +// Solidity: function proposals(uint64 , uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string btcTxHash, string arweaveTxHash) +func (_Committer *CommitterSession) Proposals(arg0 uint64, arg1 uint64) (struct { Id uint64 StartIndex uint64 EndIndex uint64 @@ -765,15 +898,16 @@ func (_Committer *CommitterSession) Proposals(arg0 uint64) (struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }, error) { - return _Committer.Contract.Proposals(&_Committer.CallOpts, arg0) + return _Committer.Contract.Proposals(&_Committer.CallOpts, arg0, arg1) } -// Proposals is a free data retrieval call binding the contract method 0x31c5eec8. +// Proposals is a free data retrieval call binding the contract method 0x7176d85d. // -// Solidity: function proposals(uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string txHash) -func (_Committer *CommitterCallerSession) Proposals(arg0 uint64) (struct { +// Solidity: function proposals(uint64 , uint64 ) view returns(uint64 id, uint64 startIndex, uint64 endIndex, uint8 status, uint256 timeout, address winner, string proofHash, string stateRootHash, string btcTxHash, string arweaveTxHash) +func (_Committer *CommitterCallerSession) Proposals(arg0 uint64, arg1 uint64) (struct { Id uint64 StartIndex uint64 EndIndex uint64 @@ -782,9 +916,10 @@ func (_Committer *CommitterCallerSession) Proposals(arg0 uint64) (struct { Winner common.Address ProofHash string StateRootHash string - TxHash string + BtcTxHash string + ArweaveTxHash string }, error) { - return _Committer.Contract.Proposals(&_Committer.CallOpts, arg0) + return _Committer.Contract.Proposals(&_Committer.CallOpts, arg0, arg1) } // Proposers is a free data retrieval call binding the contract method 0x18177497. @@ -849,6 +984,68 @@ func (_Committer *CommitterCallerSession) ProposersList(arg0 *big.Int) (common.A return _Committer.Contract.ProposersList(&_Committer.CallOpts, arg0) } +// SubmitBitcoinTxPhaseVotes is a free data retrieval call binding the contract method 0x9bfa86d3. +// +// Solidity: function submitBitcoinTxPhaseVotes(uint64 , uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCaller) SubmitBitcoinTxPhaseVotes(opts *bind.CallOpts, arg0 uint64, arg1 uint64, arg2 *big.Int) (common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "submitBitcoinTxPhaseVotes", arg0, arg1, arg2) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// SubmitBitcoinTxPhaseVotes is a free data retrieval call binding the contract method 0x9bfa86d3. +// +// Solidity: function submitBitcoinTxPhaseVotes(uint64 , uint64 , uint256 ) view returns(address) +func (_Committer *CommitterSession) SubmitBitcoinTxPhaseVotes(arg0 uint64, arg1 uint64, arg2 *big.Int) (common.Address, error) { + return _Committer.Contract.SubmitBitcoinTxPhaseVotes(&_Committer.CallOpts, arg0, arg1, arg2) +} + +// SubmitBitcoinTxPhaseVotes is a free data retrieval call binding the contract method 0x9bfa86d3. +// +// Solidity: function submitBitcoinTxPhaseVotes(uint64 , uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCallerSession) SubmitBitcoinTxPhaseVotes(arg0 uint64, arg1 uint64, arg2 *big.Int) (common.Address, error) { + return _Committer.Contract.SubmitBitcoinTxPhaseVotes(&_Committer.CallOpts, arg0, arg1, arg2) +} + +// SubmitProofPhaseVotes is a free data retrieval call binding the contract method 0x24ff16b3. +// +// Solidity: function submitProofPhaseVotes(uint64 , uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCaller) SubmitProofPhaseVotes(opts *bind.CallOpts, arg0 uint64, arg1 uint64, arg2 *big.Int) (common.Address, error) { + var out []interface{} + err := _Committer.contract.Call(opts, &out, "submitProofPhaseVotes", arg0, arg1, arg2) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// SubmitProofPhaseVotes is a free data retrieval call binding the contract method 0x24ff16b3. +// +// Solidity: function submitProofPhaseVotes(uint64 , uint64 , uint256 ) view returns(address) +func (_Committer *CommitterSession) SubmitProofPhaseVotes(arg0 uint64, arg1 uint64, arg2 *big.Int) (common.Address, error) { + return _Committer.Contract.SubmitProofPhaseVotes(&_Committer.CallOpts, arg0, arg1, arg2) +} + +// SubmitProofPhaseVotes is a free data retrieval call binding the contract method 0x24ff16b3. +// +// Solidity: function submitProofPhaseVotes(uint64 , uint64 , uint256 ) view returns(address) +func (_Committer *CommitterCallerSession) SubmitProofPhaseVotes(arg0 uint64, arg1 uint64, arg2 *big.Int) (common.Address, error) { + return _Committer.Contract.SubmitProofPhaseVotes(&_Committer.CallOpts, arg0, arg1, arg2) +} + // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // // Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) @@ -911,35 +1108,25 @@ func (_Committer *CommitterCallerSession) TimeoutPeriod() (*big.Int, error) { return _Committer.Contract.TimeoutPeriod(&_Committer.CallOpts) } -// TimeoutPhaseVotes is a free data retrieval call binding the contract method 0xae223c04. +// AddChain is a paid mutator transaction binding the contract method 0xe2947e54. // -// Solidity: function timeoutPhaseVotes(uint64 , uint256 ) view returns(address) -func (_Committer *CommitterCaller) TimeoutPhaseVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { - var out []interface{} - err := _Committer.contract.Call(opts, &out, "timeoutPhaseVotes", arg0, arg1) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - +// Solidity: function addChain(uint64 chainID) returns() +func (_Committer *CommitterTransactor) AddChain(opts *bind.TransactOpts, chainID uint64) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "addChain", chainID) } -// TimeoutPhaseVotes is a free data retrieval call binding the contract method 0xae223c04. +// AddChain is a paid mutator transaction binding the contract method 0xe2947e54. // -// Solidity: function timeoutPhaseVotes(uint64 , uint256 ) view returns(address) -func (_Committer *CommitterSession) TimeoutPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { - return _Committer.Contract.TimeoutPhaseVotes(&_Committer.CallOpts, arg0, arg1) +// Solidity: function addChain(uint64 chainID) returns() +func (_Committer *CommitterSession) AddChain(chainID uint64) (*types.Transaction, error) { + return _Committer.Contract.AddChain(&_Committer.TransactOpts, chainID) } -// TimeoutPhaseVotes is a free data retrieval call binding the contract method 0xae223c04. +// AddChain is a paid mutator transaction binding the contract method 0xe2947e54. // -// Solidity: function timeoutPhaseVotes(uint64 , uint256 ) view returns(address) -func (_Committer *CommitterCallerSession) TimeoutPhaseVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { - return _Committer.Contract.TimeoutPhaseVotes(&_Committer.CallOpts, arg0, arg1) +// Solidity: function addChain(uint64 chainID) returns() +func (_Committer *CommitterTransactorSession) AddChain(chainID uint64) (*types.Transaction, error) { + return _Committer.Contract.AddChain(&_Committer.TransactOpts, chainID) } // AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. @@ -963,25 +1150,46 @@ func (_Committer *CommitterTransactorSession) AddProposer(proposer common.Addres return _Committer.Contract.AddProposer(&_Committer.TransactOpts, proposer) } -// BitcoinTx is a paid mutator transaction binding the contract method 0x4b6ea54e. +// ArweaveTx is a paid mutator transaction binding the contract method 0xe0a9daf6. // -// Solidity: function bitcoinTx(uint64 id, string txHash) returns() -func (_Committer *CommitterTransactor) BitcoinTx(opts *bind.TransactOpts, id uint64, txHash string) (*types.Transaction, error) { - return _Committer.contract.Transact(opts, "bitcoinTx", id, txHash) +// Solidity: function arweaveTx(uint64 chainID, uint64 proposalID, string txHash) returns() +func (_Committer *CommitterTransactor) ArweaveTx(opts *bind.TransactOpts, chainID uint64, proposalID uint64, txHash string) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "arweaveTx", chainID, proposalID, txHash) } -// BitcoinTx is a paid mutator transaction binding the contract method 0x4b6ea54e. +// ArweaveTx is a paid mutator transaction binding the contract method 0xe0a9daf6. // -// Solidity: function bitcoinTx(uint64 id, string txHash) returns() -func (_Committer *CommitterSession) BitcoinTx(id uint64, txHash string) (*types.Transaction, error) { - return _Committer.Contract.BitcoinTx(&_Committer.TransactOpts, id, txHash) +// Solidity: function arweaveTx(uint64 chainID, uint64 proposalID, string txHash) returns() +func (_Committer *CommitterSession) ArweaveTx(chainID uint64, proposalID uint64, txHash string) (*types.Transaction, error) { + return _Committer.Contract.ArweaveTx(&_Committer.TransactOpts, chainID, proposalID, txHash) } -// BitcoinTx is a paid mutator transaction binding the contract method 0x4b6ea54e. +// ArweaveTx is a paid mutator transaction binding the contract method 0xe0a9daf6. // -// Solidity: function bitcoinTx(uint64 id, string txHash) returns() -func (_Committer *CommitterTransactorSession) BitcoinTx(id uint64, txHash string) (*types.Transaction, error) { - return _Committer.Contract.BitcoinTx(&_Committer.TransactOpts, id, txHash) +// Solidity: function arweaveTx(uint64 chainID, uint64 proposalID, string txHash) returns() +func (_Committer *CommitterTransactorSession) ArweaveTx(chainID uint64, proposalID uint64, txHash string) (*types.Transaction, error) { + return _Committer.Contract.ArweaveTx(&_Committer.TransactOpts, chainID, proposalID, txHash) +} + +// BitcoinTx is a paid mutator transaction binding the contract method 0x54cab80e. +// +// Solidity: function bitcoinTx(uint64 chainID, uint64 proposalID, string txHash) returns() +func (_Committer *CommitterTransactor) BitcoinTx(opts *bind.TransactOpts, chainID uint64, proposalID uint64, txHash string) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "bitcoinTx", chainID, proposalID, txHash) +} + +// BitcoinTx is a paid mutator transaction binding the contract method 0x54cab80e. +// +// Solidity: function bitcoinTx(uint64 chainID, uint64 proposalID, string txHash) returns() +func (_Committer *CommitterSession) BitcoinTx(chainID uint64, proposalID uint64, txHash string) (*types.Transaction, error) { + return _Committer.Contract.BitcoinTx(&_Committer.TransactOpts, chainID, proposalID, txHash) +} + +// BitcoinTx is a paid mutator transaction binding the contract method 0x54cab80e. +// +// Solidity: function bitcoinTx(uint64 chainID, uint64 proposalID, string txHash) returns() +func (_Committer *CommitterTransactorSession) BitcoinTx(chainID uint64, proposalID uint64, txHash string) (*types.Transaction, error) { + return _Committer.Contract.BitcoinTx(&_Committer.TransactOpts, chainID, proposalID, txHash) } // GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. @@ -1026,6 +1234,27 @@ func (_Committer *CommitterTransactorSession) Initialize() (*types.Transaction, return _Committer.Contract.Initialize(&_Committer.TransactOpts) } +// RemoveChain is a paid mutator transaction binding the contract method 0x39aa1335. +// +// Solidity: function removeChain(uint64 chainID) returns() +func (_Committer *CommitterTransactor) RemoveChain(opts *bind.TransactOpts, chainID uint64) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "removeChain", chainID) +} + +// RemoveChain is a paid mutator transaction binding the contract method 0x39aa1335. +// +// Solidity: function removeChain(uint64 chainID) returns() +func (_Committer *CommitterSession) RemoveChain(chainID uint64) (*types.Transaction, error) { + return _Committer.Contract.RemoveChain(&_Committer.TransactOpts, chainID) +} + +// RemoveChain is a paid mutator transaction binding the contract method 0x39aa1335. +// +// Solidity: function removeChain(uint64 chainID) returns() +func (_Committer *CommitterTransactorSession) RemoveChain(chainID uint64) (*types.Transaction, error) { + return _Committer.Contract.RemoveChain(&_Committer.TransactOpts, chainID) +} + // RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. // // Solidity: function removeProposer(address proposer) returns() @@ -1110,46 +1339,46 @@ func (_Committer *CommitterTransactorSession) SetTimeoutPeriod(period *big.Int) return _Committer.Contract.SetTimeoutPeriod(&_Committer.TransactOpts, period) } -// SubmitProof is a paid mutator transaction binding the contract method 0xbe091822. +// SubmitProof is a paid mutator transaction binding the contract method 0x1f981c36. // -// Solidity: function submitProof(uint64 id, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() -func (_Committer *CommitterTransactor) SubmitProof(opts *bind.TransactOpts, id uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { - return _Committer.contract.Transact(opts, "submitProof", id, proofHash, stateRootHash, startIndex, endIndex) +// Solidity: function submitProof(uint64 chainID, uint64 proposalID, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() +func (_Committer *CommitterTransactor) SubmitProof(opts *bind.TransactOpts, chainID uint64, proposalID uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "submitProof", chainID, proposalID, proofHash, stateRootHash, startIndex, endIndex) } -// SubmitProof is a paid mutator transaction binding the contract method 0xbe091822. +// SubmitProof is a paid mutator transaction binding the contract method 0x1f981c36. // -// Solidity: function submitProof(uint64 id, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() -func (_Committer *CommitterSession) SubmitProof(id uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { - return _Committer.Contract.SubmitProof(&_Committer.TransactOpts, id, proofHash, stateRootHash, startIndex, endIndex) +// Solidity: function submitProof(uint64 chainID, uint64 proposalID, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() +func (_Committer *CommitterSession) SubmitProof(chainID uint64, proposalID uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { + return _Committer.Contract.SubmitProof(&_Committer.TransactOpts, chainID, proposalID, proofHash, stateRootHash, startIndex, endIndex) } -// SubmitProof is a paid mutator transaction binding the contract method 0xbe091822. +// SubmitProof is a paid mutator transaction binding the contract method 0x1f981c36. // -// Solidity: function submitProof(uint64 id, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() -func (_Committer *CommitterTransactorSession) SubmitProof(id uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { - return _Committer.Contract.SubmitProof(&_Committer.TransactOpts, id, proofHash, stateRootHash, startIndex, endIndex) +// Solidity: function submitProof(uint64 chainID, uint64 proposalID, string proofHash, string stateRootHash, uint64 startIndex, uint64 endIndex) returns() +func (_Committer *CommitterTransactorSession) SubmitProof(chainID uint64, proposalID uint64, proofHash string, stateRootHash string, startIndex uint64, endIndex uint64) (*types.Transaction, error) { + return _Committer.Contract.SubmitProof(&_Committer.TransactOpts, chainID, proposalID, proofHash, stateRootHash, startIndex, endIndex) } -// TimeoutProposal is a paid mutator transaction binding the contract method 0x84237c46. +// TimeoutProposal is a paid mutator transaction binding the contract method 0x04956a75. // -// Solidity: function timeoutProposal(uint64 id) returns() -func (_Committer *CommitterTransactor) TimeoutProposal(opts *bind.TransactOpts, id uint64) (*types.Transaction, error) { - return _Committer.contract.Transact(opts, "timeoutProposal", id) +// Solidity: function timeoutProposal(uint64 chainID, uint64 proposalID) returns() +func (_Committer *CommitterTransactor) TimeoutProposal(opts *bind.TransactOpts, chainID uint64, proposalID uint64) (*types.Transaction, error) { + return _Committer.contract.Transact(opts, "timeoutProposal", chainID, proposalID) } -// TimeoutProposal is a paid mutator transaction binding the contract method 0x84237c46. +// TimeoutProposal is a paid mutator transaction binding the contract method 0x04956a75. // -// Solidity: function timeoutProposal(uint64 id) returns() -func (_Committer *CommitterSession) TimeoutProposal(id uint64) (*types.Transaction, error) { - return _Committer.Contract.TimeoutProposal(&_Committer.TransactOpts, id) +// Solidity: function timeoutProposal(uint64 chainID, uint64 proposalID) returns() +func (_Committer *CommitterSession) TimeoutProposal(chainID uint64, proposalID uint64) (*types.Transaction, error) { + return _Committer.Contract.TimeoutProposal(&_Committer.TransactOpts, chainID, proposalID) } -// TimeoutProposal is a paid mutator transaction binding the contract method 0x84237c46. +// TimeoutProposal is a paid mutator transaction binding the contract method 0x04956a75. // -// Solidity: function timeoutProposal(uint64 id) returns() -func (_Committer *CommitterTransactorSession) TimeoutProposal(id uint64) (*types.Transaction, error) { - return _Committer.Contract.TimeoutProposal(&_Committer.TransactOpts, id) +// Solidity: function timeoutProposal(uint64 chainID, uint64 proposalID) returns() +func (_Committer *CommitterTransactorSession) TimeoutProposal(chainID uint64, proposalID uint64) (*types.Transaction, error) { + return _Committer.Contract.TimeoutProposal(&_Committer.TransactOpts, chainID, proposalID) } // CommitterInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Committer contract. @@ -1355,7 +1584,8 @@ func (it *CommitterProposalSubmittedIterator) Close() error { // CommitterProposalSubmitted represents a ProposalSubmitted event raised by the Committer contract. type CommitterProposalSubmitted struct { - Id *big.Int + ChainID uint64 + ProposalID uint64 Proposer common.Address ProofHash string StateRootHash string @@ -1364,14 +1594,14 @@ type CommitterProposalSubmitted struct { Raw types.Log // Blockchain specific contextual infos } -// FilterProposalSubmitted is a free log retrieval operation binding the contract event 0x410eb7d56800677f6951f80f562e7d42ad630918b0ff4645be6a4bc29930ef8e. +// FilterProposalSubmitted is a free log retrieval operation binding the contract event 0x08db083a8474187b3aaed9068af476148cc1c18a272491f43b8a93c5ab91606a. // -// Solidity: event ProposalSubmitted(uint256 indexed id, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) -func (_Committer *CommitterFilterer) FilterProposalSubmitted(opts *bind.FilterOpts, id []*big.Int, proposer []common.Address, startIndex []*big.Int) (*CommitterProposalSubmittedIterator, error) { +// Solidity: event ProposalSubmitted(uint64 chainID, uint64 indexed proposalID, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) +func (_Committer *CommitterFilterer) FilterProposalSubmitted(opts *bind.FilterOpts, proposalID []uint64, proposer []common.Address, startIndex []*big.Int) (*CommitterProposalSubmittedIterator, error) { - var idRule []interface{} - for _, idItem := range id { - idRule = append(idRule, idItem) + var proposalIDRule []interface{} + for _, proposalIDItem := range proposalID { + proposalIDRule = append(proposalIDRule, proposalIDItem) } var proposerRule []interface{} for _, proposerItem := range proposer { @@ -1383,21 +1613,21 @@ func (_Committer *CommitterFilterer) FilterProposalSubmitted(opts *bind.FilterOp startIndexRule = append(startIndexRule, startIndexItem) } - logs, sub, err := _Committer.contract.FilterLogs(opts, "ProposalSubmitted", idRule, proposerRule, startIndexRule) + logs, sub, err := _Committer.contract.FilterLogs(opts, "ProposalSubmitted", proposalIDRule, proposerRule, startIndexRule) if err != nil { return nil, err } return &CommitterProposalSubmittedIterator{contract: _Committer.contract, event: "ProposalSubmitted", logs: logs, sub: sub}, nil } -// WatchProposalSubmitted is a free log subscription operation binding the contract event 0x410eb7d56800677f6951f80f562e7d42ad630918b0ff4645be6a4bc29930ef8e. +// WatchProposalSubmitted is a free log subscription operation binding the contract event 0x08db083a8474187b3aaed9068af476148cc1c18a272491f43b8a93c5ab91606a. // -// Solidity: event ProposalSubmitted(uint256 indexed id, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) -func (_Committer *CommitterFilterer) WatchProposalSubmitted(opts *bind.WatchOpts, sink chan<- *CommitterProposalSubmitted, id []*big.Int, proposer []common.Address, startIndex []*big.Int) (event.Subscription, error) { +// Solidity: event ProposalSubmitted(uint64 chainID, uint64 indexed proposalID, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) +func (_Committer *CommitterFilterer) WatchProposalSubmitted(opts *bind.WatchOpts, sink chan<- *CommitterProposalSubmitted, proposalID []uint64, proposer []common.Address, startIndex []*big.Int) (event.Subscription, error) { - var idRule []interface{} - for _, idItem := range id { - idRule = append(idRule, idItem) + var proposalIDRule []interface{} + for _, proposalIDItem := range proposalID { + proposalIDRule = append(proposalIDRule, proposalIDItem) } var proposerRule []interface{} for _, proposerItem := range proposer { @@ -1409,7 +1639,7 @@ func (_Committer *CommitterFilterer) WatchProposalSubmitted(opts *bind.WatchOpts startIndexRule = append(startIndexRule, startIndexItem) } - logs, sub, err := _Committer.contract.WatchLogs(opts, "ProposalSubmitted", idRule, proposerRule, startIndexRule) + logs, sub, err := _Committer.contract.WatchLogs(opts, "ProposalSubmitted", proposalIDRule, proposerRule, startIndexRule) if err != nil { return nil, err } @@ -1441,9 +1671,9 @@ func (_Committer *CommitterFilterer) WatchProposalSubmitted(opts *bind.WatchOpts }), nil } -// ParseProposalSubmitted is a log parse operation binding the contract event 0x410eb7d56800677f6951f80f562e7d42ad630918b0ff4645be6a4bc29930ef8e. +// ParseProposalSubmitted is a log parse operation binding the contract event 0x08db083a8474187b3aaed9068af476148cc1c18a272491f43b8a93c5ab91606a. // -// Solidity: event ProposalSubmitted(uint256 indexed id, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) +// Solidity: event ProposalSubmitted(uint64 chainID, uint64 indexed proposalID, address indexed proposer, string proofHash, string stateRootHash, uint256 indexed startIndex, uint256 endIndex) func (_Committer *CommitterFilterer) ParseProposalSubmitted(log types.Log) (*CommitterProposalSubmitted, error) { event := new(CommitterProposalSubmitted) if err := _Committer.contract.UnpackLog(event, "ProposalSubmitted", log); err != nil { @@ -1522,13 +1752,14 @@ func (it *CommitterProposalTimedOutIterator) Close() error { // CommitterProposalTimedOut represents a ProposalTimedOut event raised by the Committer contract. type CommitterProposalTimedOut struct { - Id *big.Int - Raw types.Log // Blockchain specific contextual infos + ChainID uint64 + ProposalID uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterProposalTimedOut is a free log retrieval operation binding the contract event 0x54b873b562a45d8ac963d9576955e8cffecb769f75cb8ac8db3fc7534b972537. +// FilterProposalTimedOut is a free log retrieval operation binding the contract event 0xe81e592c2f9a76eb49a3b40a0a0f6955323a7ec31c08805d2c04a4eea8b558fd. // -// Solidity: event ProposalTimedOut(uint256 id) +// Solidity: event ProposalTimedOut(uint64 chainID, uint64 proposalID) func (_Committer *CommitterFilterer) FilterProposalTimedOut(opts *bind.FilterOpts) (*CommitterProposalTimedOutIterator, error) { logs, sub, err := _Committer.contract.FilterLogs(opts, "ProposalTimedOut") @@ -1538,9 +1769,9 @@ func (_Committer *CommitterFilterer) FilterProposalTimedOut(opts *bind.FilterOpt return &CommitterProposalTimedOutIterator{contract: _Committer.contract, event: "ProposalTimedOut", logs: logs, sub: sub}, nil } -// WatchProposalTimedOut is a free log subscription operation binding the contract event 0x54b873b562a45d8ac963d9576955e8cffecb769f75cb8ac8db3fc7534b972537. +// WatchProposalTimedOut is a free log subscription operation binding the contract event 0xe81e592c2f9a76eb49a3b40a0a0f6955323a7ec31c08805d2c04a4eea8b558fd. // -// Solidity: event ProposalTimedOut(uint256 id) +// Solidity: event ProposalTimedOut(uint64 chainID, uint64 proposalID) func (_Committer *CommitterFilterer) WatchProposalTimedOut(opts *bind.WatchOpts, sink chan<- *CommitterProposalTimedOut) (event.Subscription, error) { logs, sub, err := _Committer.contract.WatchLogs(opts, "ProposalTimedOut") @@ -1575,9 +1806,9 @@ func (_Committer *CommitterFilterer) WatchProposalTimedOut(opts *bind.WatchOpts, }), nil } -// ParseProposalTimedOut is a log parse operation binding the contract event 0x54b873b562a45d8ac963d9576955e8cffecb769f75cb8ac8db3fc7534b972537. +// ParseProposalTimedOut is a log parse operation binding the contract event 0xe81e592c2f9a76eb49a3b40a0a0f6955323a7ec31c08805d2c04a4eea8b558fd. // -// Solidity: event ProposalTimedOut(uint256 id) +// Solidity: event ProposalTimedOut(uint64 chainID, uint64 proposalID) func (_Committer *CommitterFilterer) ParseProposalTimedOut(log types.Log) (*CommitterProposalTimedOut, error) { event := new(CommitterProposalTimedOut) if err := _Committer.contract.UnpackLog(event, "ProposalTimedOut", log); err != nil { @@ -2142,15 +2373,16 @@ func (it *CommitterVoteProposalIterator) Close() error { // CommitterVoteProposal represents a VoteProposal event raised by the Committer contract. type CommitterVoteProposal struct { - Id *big.Int - Voter common.Address - Phase uint8 - Raw types.Log // Blockchain specific contextual infos + ChainID uint64 + ProposalID uint64 + Voter common.Address + Phase uint8 + Raw types.Log // Blockchain specific contextual infos } -// FilterVoteProposal is a free log retrieval operation binding the contract event 0xb3af8d0ccb8c5065b2daf8bb24b7a0ac9a8822fac445978a1524fb9a6f560e1f. +// FilterVoteProposal is a free log retrieval operation binding the contract event 0xc488e7e4772e55cf4eb67cd1cc5a8a0169f7b08a7565742e419b88aac6744116. // -// Solidity: event VoteProposal(uint256 id, address voter, uint8 phase) +// Solidity: event VoteProposal(uint64 chainID, uint64 proposalID, address voter, uint8 phase) func (_Committer *CommitterFilterer) FilterVoteProposal(opts *bind.FilterOpts) (*CommitterVoteProposalIterator, error) { logs, sub, err := _Committer.contract.FilterLogs(opts, "VoteProposal") @@ -2160,9 +2392,9 @@ func (_Committer *CommitterFilterer) FilterVoteProposal(opts *bind.FilterOpts) ( return &CommitterVoteProposalIterator{contract: _Committer.contract, event: "VoteProposal", logs: logs, sub: sub}, nil } -// WatchVoteProposal is a free log subscription operation binding the contract event 0xb3af8d0ccb8c5065b2daf8bb24b7a0ac9a8822fac445978a1524fb9a6f560e1f. +// WatchVoteProposal is a free log subscription operation binding the contract event 0xc488e7e4772e55cf4eb67cd1cc5a8a0169f7b08a7565742e419b88aac6744116. // -// Solidity: event VoteProposal(uint256 id, address voter, uint8 phase) +// Solidity: event VoteProposal(uint64 chainID, uint64 proposalID, address voter, uint8 phase) func (_Committer *CommitterFilterer) WatchVoteProposal(opts *bind.WatchOpts, sink chan<- *CommitterVoteProposal) (event.Subscription, error) { logs, sub, err := _Committer.contract.WatchLogs(opts, "VoteProposal") @@ -2197,9 +2429,9 @@ func (_Committer *CommitterFilterer) WatchVoteProposal(opts *bind.WatchOpts, sin }), nil } -// ParseVoteProposal is a log parse operation binding the contract event 0xb3af8d0ccb8c5065b2daf8bb24b7a0ac9a8822fac445978a1524fb9a6f560e1f. +// ParseVoteProposal is a log parse operation binding the contract event 0xc488e7e4772e55cf4eb67cd1cc5a8a0169f7b08a7565742e419b88aac6744116. // -// Solidity: event VoteProposal(uint256 id, address voter, uint8 phase) +// Solidity: event VoteProposal(uint64 chainID, uint64 proposalID, address voter, uint8 phase) func (_Committer *CommitterFilterer) ParseVoteProposal(log types.Log) (*CommitterVoteProposal, error) { event := new(CommitterVoteProposal) if err := _Committer.contract.UnpackLog(event, "VoteProposal", log); err != nil { diff --git a/test-docker/docker-compose.yml b/test-docker/docker-compose.yml index a1bdb24..d6f0b5f 100644 --- a/test-docker/docker-compose.yml +++ b/test-docker/docker-compose.yml @@ -24,7 +24,7 @@ services: - "5433:5432" volumes: - ./postgres1/datadir:/var/lib/postgresql/data - - ./mysql.sql:/docker-entrypoint-initdb.d/init.sql + - ./postgres.sql:/docker-entrypoint-initdb.d/init.sql # mysql2: diff --git a/test-docker/mysql.sql b/test-docker/mysql.sql index 9e62e7f..51d28c7 100644 --- a/test-docker/mysql.sql +++ b/test-docker/mysql.sql @@ -9,148 +9,171 @@ SET FOREIGN_KEY_CHECKS = 0; -- Table structure for rollbacks -- ---------------------------- DROP TABLE IF EXISTS `rollbacks`; -CREATE TABLE `rollbacks` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名, eth', - `event_id` bigint NOT NULL COMMENT ' 事件ID', - PRIMARY KEY (`id`), - KEY `event_id_index` (`event_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `rollbacks` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `blockchain` varchar(32) NOT NULL COMMENT ' 链名, eth', + `event_id` bigint NOT NULL COMMENT ' 事件ID', + PRIMARY KEY (`id`), + KEY `event_id_index` (`event_id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1000000 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_blocks -- ---------------------------- DROP TABLE IF EXISTS `sync_blocks`; -CREATE TABLE `sync_blocks` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `miner` varchar(42) NOT NULL COMMENT ' 出块人', - `block_time` bigint NOT NULL COMMENT ' 出块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `tx_count` bigint NOT NULL COMMENT ' 交易数量', - `event_count` bigint NOT NULL COMMENT ' 事件数量', - `parent_hash` varchar(66) NOT NULL COMMENT ' 父Hash', - `status` varchar(32) NOT NULL COMMENT ' 状态', - `check_count` bigint NOT NULL COMMENT ' 检查次数', - PRIMARY KEY (`id`), - KEY `status_index` (`status`), - KEY `tx_count_index` (`tx_count`), - KEY `check_count_index` (`check_count`) -) ENGINE=InnoDB AUTO_INCREMENT=2923365 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_blocks` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `blockchain` varchar(32) NOT NULL COMMENT ' 链名', + `miner` varchar(42) NOT NULL COMMENT ' 出块人', + `block_time` bigint NOT NULL COMMENT ' 出块时间', + `block_number` bigint NOT NULL COMMENT ' 区块高度', + `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', + `tx_count` bigint NOT NULL COMMENT ' 交易数量', + `event_count` bigint NOT NULL COMMENT ' 事件数量', + `parent_hash` varchar(66) NOT NULL COMMENT ' 父Hash', + `status` varchar(32) NOT NULL COMMENT ' 状态', + `check_count` bigint NOT NULL COMMENT ' 检查次数', + PRIMARY KEY (`id`), + KEY `status_index` (`status`), + KEY `tx_count_index` (`tx_count`), + KEY `check_count_index` (`check_count`) +) ENGINE = InnoDB + AUTO_INCREMENT = 2923365 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_blocks_history -- ---------------------------- DROP TABLE IF EXISTS `sync_blocks_history`; -CREATE TABLE `sync_blocks_history` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `miner` varchar(42) NOT NULL COMMENT ' 出块人', - `block_time` bigint NOT NULL COMMENT ' 出块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `tx_count` bigint NOT NULL COMMENT ' 交易数量', - `event_count` bigint NOT NULL COMMENT ' 事件数量', - `parent_hash` varchar(66) NOT NULL COMMENT ' 父Hash', - `status` varchar(32) NOT NULL COMMENT ' 状态', - `check_count` bigint NOT NULL COMMENT ' 检查次数', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2792531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_blocks_history` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `blockchain` varchar(32) NOT NULL COMMENT ' 链名', + `miner` varchar(42) NOT NULL COMMENT ' 出块人', + `block_time` bigint NOT NULL COMMENT ' 出块时间', + `block_number` bigint NOT NULL COMMENT ' 区块高度', + `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', + `tx_count` bigint NOT NULL COMMENT ' 交易数量', + `event_count` bigint NOT NULL COMMENT ' 事件数量', + `parent_hash` varchar(66) NOT NULL COMMENT ' 父Hash', + `status` varchar(32) NOT NULL COMMENT ' 状态', + `check_count` bigint NOT NULL COMMENT ' 检查次数', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 2792531 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_events -- ---------------------------- DROP TABLE IF EXISTS `sync_events`; -CREATE TABLE `sync_events` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `sync_block_id` bigint NOT NULL COMMENT ' 同步区块ID', - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `block_time` bigint NOT NULL COMMENT ' 区块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `block_log_indexed` bigint NOT NULL COMMENT ' 日志index', - `tx_index` bigint NOT NULL COMMENT ' 交易index', - `tx_hash` varchar(66) NOT NULL COMMENT ' 交易Hash', - `event_name` varchar(32) NOT NULL COMMENT ' 事件名称', - `event_hash` varchar(66) NOT NULL COMMENT ' 事件Hash', - `contract_address` varchar(42) NOT NULL COMMENT ' 合约地址', - `data` json NOT NULL COMMENT ' 数据内容', - `status` varchar(32) NOT NULL COMMENT ' 状态', - `retry_count` bigint DEFAULT '0' COMMENT '重试次数', - PRIMARY KEY (`id`), - KEY `status_index` (`status`) -) ENGINE=InnoDB AUTO_INCREMENT=1011299 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_events` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `sync_block_id` bigint NOT NULL COMMENT ' 同步区块ID', + `blockchain` varchar(32) NOT NULL COMMENT ' 链名', + `block_time` bigint NOT NULL COMMENT ' 区块时间', + `block_number` bigint NOT NULL COMMENT ' 区块高度', + `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', + `block_log_indexed` bigint NOT NULL COMMENT ' 日志index', + `tx_index` bigint NOT NULL COMMENT ' 交易index', + `tx_hash` varchar(66) NOT NULL COMMENT ' 交易Hash', + `event_name` varchar(32) NOT NULL COMMENT ' 事件名称', + `event_hash` varchar(66) NOT NULL COMMENT ' 事件Hash', + `contract_address` varchar(42) NOT NULL COMMENT ' 合约地址', + `data` json NOT NULL COMMENT ' 数据内容', + `status` varchar(32) NOT NULL COMMENT ' 状态', + `retry_count` bigint DEFAULT '0' COMMENT '重试次数', + PRIMARY KEY (`id`), + KEY `status_index` (`status`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1011299 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_events_history -- ---------------------------- DROP TABLE IF EXISTS `sync_events_history`; -CREATE TABLE `sync_events_history` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `sync_block_id` bigint NOT NULL COMMENT ' 同步区块ID', - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `block_time` bigint NOT NULL COMMENT ' 区块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `block_log_indexed` bigint NOT NULL COMMENT ' 日志index', - `tx_index` bigint NOT NULL COMMENT ' 交易index', - `tx_hash` varchar(66) NOT NULL COMMENT ' 交易Hash', - `event_name` varchar(32) NOT NULL COMMENT ' 事件名称', - `event_hash` varchar(66) NOT NULL COMMENT ' 事件Hash', - `contract_address` varchar(42) NOT NULL COMMENT ' 合约地址', - `data` json NOT NULL COMMENT ' 数据内容', - `status` varchar(32) NOT NULL COMMENT ' 状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_events_history` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `sync_block_id` bigint NOT NULL COMMENT ' 同步区块ID', + `blockchain` varchar(32) NOT NULL COMMENT ' 链名', + `block_time` bigint NOT NULL COMMENT ' 区块时间', + `block_number` bigint NOT NULL COMMENT ' 区块高度', + `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', + `block_log_indexed` bigint NOT NULL COMMENT ' 日志index', + `tx_index` bigint NOT NULL COMMENT ' 交易index', + `tx_hash` varchar(66) NOT NULL COMMENT ' 交易Hash', + `event_name` varchar(32) NOT NULL COMMENT ' 事件名称', + `event_hash` varchar(66) NOT NULL COMMENT ' 事件Hash', + `contract_address` varchar(42) NOT NULL COMMENT ' 合约地址', + `data` json NOT NULL COMMENT ' 数据内容', + `status` varchar(32) NOT NULL COMMENT ' 状态', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1000000 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_tasks -- ---------------------------- DROP TABLE IF EXISTS `sync_tasks`; -CREATE TABLE `sync_tasks` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `latest_block` bigint NOT NULL COMMENT ' 同步高度', - `start_block` bigint NOT NULL COMMENT ' 同步开始区块高度', - `end_block` bigint NOT NULL COMMENT ' 同步结束区块高度', - `handle_num` bigint NOT NULL COMMENT ' 处理数', - `contracts` text NOT NULL COMMENT ' 合约地址,多个用,分割', - `status` varchar(32) NOT NULL COMMENT ' 状态', - PRIMARY KEY (`id`), - KEY `status_index` (`status`) -) ENGINE=InnoDB AUTO_INCREMENT=1000010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_tasks` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `blockchain` varchar(32) NOT NULL COMMENT ' 链名', + `latest_block` bigint NOT NULL COMMENT ' 同步高度', + `start_block` bigint NOT NULL COMMENT ' 同步开始区块高度', + `end_block` bigint NOT NULL COMMENT ' 同步结束区块高度', + `handle_num` bigint NOT NULL COMMENT ' 处理数', + `contracts` text NOT NULL COMMENT ' 合约地址,多个用,分割', + `status` varchar(32) NOT NULL COMMENT ' 状态', + PRIMARY KEY (`id`), + KEY `status_index` (`status`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1000010 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; SET FOREIGN_KEY_CHECKS = 1; DROP TABLE IF EXISTS `proposal`; -CREATE TABLE `proposal` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `proposal_id` bigint NOT NULL, - `proposer` varchar(128) NOT NULL, +CREATE TABLE `proposal` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `proposal_id` bigint NOT NULL, `state_root_hash` varchar(128) NOT NULL, `proof_root_hash` varchar(128) NOT NULL, - `start_batch_num` bigint NOT NULL, - `end_batch_num` bigint NOT NULL, - `btc_commit_tx_hash` varchar(128) , - `btc_reveal_tx_hash` varchar(128) , - `block_height` bigint NOT NULL DEFAULT 0, - `winner` varchar(128), - `status` bigint NOT NULL DEFAULT 0, + `start_batch_num` bigint NOT NULL, + `end_batch_num` bigint NOT NULL, + `btc_tx_hash` varchar(128), + `winner` varchar(128), + `status` bigint NOT NULL DEFAULT 0, + `upload_details` tinyint(1) default 0, PRIMARY KEY (`id`), KEY `proposal_id_index` (`proposal_id`) ) diff --git a/test-docker/postgres.sql b/test-docker/postgres.sql index 57f1f2e..38635e6 100644 --- a/test-docker/postgres.sql +++ b/test-docker/postgres.sql @@ -110,22 +110,20 @@ CREATE TABLE IF NOT EXISTS sync_tasks status VARCHAR(32) NOT NULL ); +drop table if exists proposal; -- Create proposal table CREATE TABLE IF NOT EXISTS proposal ( - id bigserial PRIMARY KEY, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - proposal_id bigint NOT NULL, - proposer varchar(128) NOT NULL, - state_root_hash varchar(128) NOT NULL, - proof_root_hash varchar(128) NOT NULL, - start_batch_num bigint NOT NULL, - end_batch_num bigint NOT NULL, - btc_commit_tx_hash varchar(128), - btc_reveal_tx_hash varchar(128), - block_height bigint NOT NULL DEFAULT 0, - winner varchar(128), - status bigint NOT NULL DEFAULT 0 + id bigserial PRIMARY KEY, + created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + proposal_id bigint NOT NULL, + state_root_hash varchar(128) NOT NULL, + proof_root_hash varchar(128) NOT NULL, + start_batch_num bigint NOT NULL, + end_batch_num bigint NOT NULL, + btc_tx_hash varchar(128), + winner varchar(128), + status bigint NOT NULL DEFAULT 0 ); CREATE INDEX if not exists proposal_id_index ON proposal (proposal_id); diff --git a/wallet/account.json b/wallet/account.json new file mode 100644 index 0000000..e9a96e2 --- /dev/null +++ b/wallet/account.json @@ -0,0 +1 @@ +{"d":"ILjwNjpJOacItj9hSd9LZkHtt3K4uxTMY0niPHHIHudWoGBnwRUi8oxqEQbwKTyKq2o-3L5NkRNq8PSSbO8EcdNV6KP2QtIpyqcMkD8ZaGSV5FAu6066Iw684I-PnfyYlFaBTRHpHP6V30hD30dbX2u3PCl30EhxC3N2FszlqboMfSDHP_wt-QLH0gxfPYz76kFMZ9tA-9yCs4pVDwgrObQNRKAHzdGa-866qNxqPdZCclpxdnQ0fDSJ_jC76daP3xVJUBOXtkSUuB9RwDP1VYFGWqIigzQ8zffxMDG42rvjrRUF9WAlD2pQrmvNchFiDYD6sJgtGSAfP8c2X9QlXhDAE5fsNu_t9UHvSJ56vtc_jXSvihdVrcmGmo5z87CTu-QWlpKdtoDMMTdmM1WYh4qU4fgi7vkEvZ1AmGIOgIe8FSuGTBhJ5al8Yt9COdI3KqwRfqO8nljW67Yx5q-R5_w4jV8_GgsFXVPOe9kQc6czefUwVoEsUKLRwcwYEgkW4k9HVTGc7mN549visheDZuUK5RJiN1TEw1mDyxk5dOu0tnqmAoiclP_SVbZFkX63yEqRHcnRSVDMHqywyQON47IFcTvROPlGxoC9gWgmEjJ8lRM1yVDh83MAsvh9QJ6gDC-eJt40te42v-e7x0EjlxprAybCrwjpXrZFBsFfpPE","dp":"Ho1hvnTFHql6l3oSdWw6g9_l8ijjrfz888P8xbdIriR8D3rEHK8CtV6syc7T8stHsQuwsr_vs8QsOyZ8eW_A5fTAoO47ibGzrvyrXJRUIQp5-X7mR49oZQPEsUqcpcS0WTmg0ybfnzVhUg5nrYXjigMzJuzVh3Z54g3o8wTtLksMGaKNp3z9-DzbtOwLFeVTbqDL-nNbjSTggvYd41m1FbLWvhtS-mfJknMGijCX-k30unEgLax3sikQjd0NCcvlOzZ5G0DTfxJuv331-rBrM9nPnJZxGFZvOSXaFdWUsNMG5gob8Q3TmqsAH9jtmZm2fyhszJf-gncv81BfmBCvSQ","dq":"aao_caRzUVYH50wn2l2vXeMzCOIw9kUs3oCBCbgPha7joVGJdQDbqPbx1JNfJ9jsgxsKubxeVKws1atikmNRsOjEe2y52Xf0W2IyQUdSREyNRkim3ASGbsfHgOc-gxqsfgWe4lGsP9qaqH8yhK8Fkv0n2dKAvxf-qs8iWoY_I7cxqOtMvQSDM9DQs2_BUVzB__7PH9vLUsPZh-8w0Mx2ZXA1S-2lb184lyVjaDARfynY-eNndgnmITZ8OBJ0riBGIfV05K-2fnZ_l-LqWLyynrqvq8gdi_qPolRM34-WTvkdpE12ykQZZ1sYNR5b2DN7oxNUw4__I6N00rtWPBcrxw","e":"AQAB","ext":true,"kty":"RSA","n":"xbmvQelsJfXDy4I7Oe-aKlQG1IiGZE1n5zkbw9wKx3syjR_F4Hy4ST_KUC4Z97VRPbhk_2nwN-phQP3ccSP04RMcv4NZbWMZvyiIIGAmsnytvZUbUglJWoPkmpBcd2_kdBsil5uw2zgaAfBOurrnwRmBxHEzQp06fHKnQhy2X3HFulp0zneSmpJDztDG4OV1Gdm7M04ldgEBLm2glLqc3RjyqBXRyAvqOVlTTzzT6kwCR8ZPO8FhHPYvjdM0IRpVk6Q9fq0Nr8GRvhnRodEEzWi_X1I2miV7ZvmDSLghJk1JVZoC-8D9ZK0nt8kkoQpXTjK0RV3WxbqdkooVCAmQXm1ti6qUUQYSWfzvJlAz1Vd_ul2Yp5Z9lrYRpN-G0QubGFVSWPjVWVd0lYUu0Y8wrpGtynD36pXkDdhox1rNw6xv9iDX7GbkFNV7OFjgc6xN9IOkj8fquThib8pQfEJzJlY8wlnUlnZegTvZ6WNELxj04S3nISWmEJ0CkZUH0XWAqcS0BMfJq3yOs7MyLWiYUC7B6HuXrLZHKs5JR1ckXxcgCX8-1rY-0wiiFFV7C-BcEK6W096NMs8iuh8Ge7Z14kHiA-1E1qiIaUi57b_ErFdAWZdWT7Xy9mUspq_tqObmgmMc23jI83QIN2ukJ573Am5EHDs0jQ4koXCacGgLAEs","p":"6HKbAoL9MITw3yaDlLwPdPyMGO3tELjSMhMnsiNCMnAqcBC_2ZOviDa_SUaa8acJGozrkP0KoW4jhh0dEB1QHSx6IswBbKFbI50qLcIWJtTCXKFtYTtCKszf4B7YuQL5so0qwlqMGRzX3M3x-HBAMLOoGEAWefeZi2BR0IFX4sNigl4Cjpx8BkP-3TilDs_0Otm9aCzgNyva5-ME-hqFt9cANNesezzsZHfbTajtmdLqytukbfrPZfWALRoPid1gzFbodFGDDtt_6Jo56XwahHVQnCVCHkypgU9TvS5_CAQIlz2TzDj2Fqn1B3YHFr6Pv0ydTbWOi9lRcfPXmFkjTQ","q":"2cJtC5VLzkLwLRzu4bhR8jkM1ywCKT_nCs5iPqeIIe0gCGnlkWUKqjciGrAFPgre14-aixToE1cfMVcxMS1MX23aspOA5B79x-lgXPFOExGy2t1OLfX9RgNZ4mn7fqlB4RazTnwKOEK9N65dTJvVzTng70RLElYBQyTav-b2K6qNNw_lZ7gRAR59X6mc4Wsd9djq_JYL6yjnnVghS4MGPO1_swAuFjUU8PArg-ViSwmSmPhnT1xDWxNGe5cIg3s1UUMWiISP0uU751KWY3FZBWFBihCcI8Z8vB0BiVRnYiZW3x_YxyZKnqN2Bg7mfm3JEiUDTLcUhERt4oWfaSc19w","qi":"J9tASrsgUN8bSDuF_QUgldRAApGMXuLRZPsWQren43usX38oHPNaJT4IBy5b8-UAO22hddAKP8ouykZEZ5q-8rt_3Sa4UwpqktgEd5ia-JEz4qKd9E9CoHuYd6DcDBH10Qd-Th94A1fGQGMsDxyeYtwYGcH3kQraAYY1EayhHvOCz6gtp8rWgLESNLbx908EzoKA9VD3mwu6lzwyUb9yjuCiv-teP16U9ObUSjdWRhVrnE1T2kWscpYioKgq54EGLkBra9XEk9o0DSfvbO6kQscQd7gtRA9azmfiCBrZaER3S476TlxmDQuiRysHpd4UZZUE4H5Qkim6MXjcART7hQ"} \ No newline at end of file From a4b2af3728192b142e1b4508293abddeb83b066e Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:31:12 +0800 Subject: [PATCH 05/29] add chain id and fix procedure --- wallet/account.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 wallet/account.json diff --git a/wallet/account.json b/wallet/account.json deleted file mode 100644 index e9a96e2..0000000 --- a/wallet/account.json +++ /dev/null @@ -1 +0,0 @@ -{"d":"ILjwNjpJOacItj9hSd9LZkHtt3K4uxTMY0niPHHIHudWoGBnwRUi8oxqEQbwKTyKq2o-3L5NkRNq8PSSbO8EcdNV6KP2QtIpyqcMkD8ZaGSV5FAu6066Iw684I-PnfyYlFaBTRHpHP6V30hD30dbX2u3PCl30EhxC3N2FszlqboMfSDHP_wt-QLH0gxfPYz76kFMZ9tA-9yCs4pVDwgrObQNRKAHzdGa-866qNxqPdZCclpxdnQ0fDSJ_jC76daP3xVJUBOXtkSUuB9RwDP1VYFGWqIigzQ8zffxMDG42rvjrRUF9WAlD2pQrmvNchFiDYD6sJgtGSAfP8c2X9QlXhDAE5fsNu_t9UHvSJ56vtc_jXSvihdVrcmGmo5z87CTu-QWlpKdtoDMMTdmM1WYh4qU4fgi7vkEvZ1AmGIOgIe8FSuGTBhJ5al8Yt9COdI3KqwRfqO8nljW67Yx5q-R5_w4jV8_GgsFXVPOe9kQc6czefUwVoEsUKLRwcwYEgkW4k9HVTGc7mN549visheDZuUK5RJiN1TEw1mDyxk5dOu0tnqmAoiclP_SVbZFkX63yEqRHcnRSVDMHqywyQON47IFcTvROPlGxoC9gWgmEjJ8lRM1yVDh83MAsvh9QJ6gDC-eJt40te42v-e7x0EjlxprAybCrwjpXrZFBsFfpPE","dp":"Ho1hvnTFHql6l3oSdWw6g9_l8ijjrfz888P8xbdIriR8D3rEHK8CtV6syc7T8stHsQuwsr_vs8QsOyZ8eW_A5fTAoO47ibGzrvyrXJRUIQp5-X7mR49oZQPEsUqcpcS0WTmg0ybfnzVhUg5nrYXjigMzJuzVh3Z54g3o8wTtLksMGaKNp3z9-DzbtOwLFeVTbqDL-nNbjSTggvYd41m1FbLWvhtS-mfJknMGijCX-k30unEgLax3sikQjd0NCcvlOzZ5G0DTfxJuv331-rBrM9nPnJZxGFZvOSXaFdWUsNMG5gob8Q3TmqsAH9jtmZm2fyhszJf-gncv81BfmBCvSQ","dq":"aao_caRzUVYH50wn2l2vXeMzCOIw9kUs3oCBCbgPha7joVGJdQDbqPbx1JNfJ9jsgxsKubxeVKws1atikmNRsOjEe2y52Xf0W2IyQUdSREyNRkim3ASGbsfHgOc-gxqsfgWe4lGsP9qaqH8yhK8Fkv0n2dKAvxf-qs8iWoY_I7cxqOtMvQSDM9DQs2_BUVzB__7PH9vLUsPZh-8w0Mx2ZXA1S-2lb184lyVjaDARfynY-eNndgnmITZ8OBJ0riBGIfV05K-2fnZ_l-LqWLyynrqvq8gdi_qPolRM34-WTvkdpE12ykQZZ1sYNR5b2DN7oxNUw4__I6N00rtWPBcrxw","e":"AQAB","ext":true,"kty":"RSA","n":"xbmvQelsJfXDy4I7Oe-aKlQG1IiGZE1n5zkbw9wKx3syjR_F4Hy4ST_KUC4Z97VRPbhk_2nwN-phQP3ccSP04RMcv4NZbWMZvyiIIGAmsnytvZUbUglJWoPkmpBcd2_kdBsil5uw2zgaAfBOurrnwRmBxHEzQp06fHKnQhy2X3HFulp0zneSmpJDztDG4OV1Gdm7M04ldgEBLm2glLqc3RjyqBXRyAvqOVlTTzzT6kwCR8ZPO8FhHPYvjdM0IRpVk6Q9fq0Nr8GRvhnRodEEzWi_X1I2miV7ZvmDSLghJk1JVZoC-8D9ZK0nt8kkoQpXTjK0RV3WxbqdkooVCAmQXm1ti6qUUQYSWfzvJlAz1Vd_ul2Yp5Z9lrYRpN-G0QubGFVSWPjVWVd0lYUu0Y8wrpGtynD36pXkDdhox1rNw6xv9iDX7GbkFNV7OFjgc6xN9IOkj8fquThib8pQfEJzJlY8wlnUlnZegTvZ6WNELxj04S3nISWmEJ0CkZUH0XWAqcS0BMfJq3yOs7MyLWiYUC7B6HuXrLZHKs5JR1ckXxcgCX8-1rY-0wiiFFV7C-BcEK6W096NMs8iuh8Ge7Z14kHiA-1E1qiIaUi57b_ErFdAWZdWT7Xy9mUspq_tqObmgmMc23jI83QIN2ukJ573Am5EHDs0jQ4koXCacGgLAEs","p":"6HKbAoL9MITw3yaDlLwPdPyMGO3tELjSMhMnsiNCMnAqcBC_2ZOviDa_SUaa8acJGozrkP0KoW4jhh0dEB1QHSx6IswBbKFbI50qLcIWJtTCXKFtYTtCKszf4B7YuQL5so0qwlqMGRzX3M3x-HBAMLOoGEAWefeZi2BR0IFX4sNigl4Cjpx8BkP-3TilDs_0Otm9aCzgNyva5-ME-hqFt9cANNesezzsZHfbTajtmdLqytukbfrPZfWALRoPid1gzFbodFGDDtt_6Jo56XwahHVQnCVCHkypgU9TvS5_CAQIlz2TzDj2Fqn1B3YHFr6Pv0ydTbWOi9lRcfPXmFkjTQ","q":"2cJtC5VLzkLwLRzu4bhR8jkM1ywCKT_nCs5iPqeIIe0gCGnlkWUKqjciGrAFPgre14-aixToE1cfMVcxMS1MX23aspOA5B79x-lgXPFOExGy2t1OLfX9RgNZ4mn7fqlB4RazTnwKOEK9N65dTJvVzTng70RLElYBQyTav-b2K6qNNw_lZ7gRAR59X6mc4Wsd9djq_JYL6yjnnVghS4MGPO1_swAuFjUU8PArg-ViSwmSmPhnT1xDWxNGe5cIg3s1UUMWiISP0uU751KWY3FZBWFBihCcI8Z8vB0BiVRnYiZW3x_YxyZKnqN2Bg7mfm3JEiUDTLcUhERt4oWfaSc19w","qi":"J9tASrsgUN8bSDuF_QUgldRAApGMXuLRZPsWQren43usX38oHPNaJT4IBy5b8-UAO22hddAKP8ouykZEZ5q-8rt_3Sa4UwpqktgEd5ia-JEz4qKd9E9CoHuYd6DcDBH10Qd-Th94A1fGQGMsDxyeYtwYGcH3kQraAYY1EayhHvOCz6gtp8rWgLESNLbx908EzoKA9VD3mwu6lzwyUb9yjuCiv-teP16U9ObUSjdWRhVrnE1T2kWscpYioKgq54EGLkBra9XEk9o0DSfvbO6kQscQd7gtRA9azmfiCBrZaER3S476TlxmDQuiRysHpd4UZZUE4H5Qkim6MXjcART7hQ"} \ No newline at end of file From 0eee83db4b4ed6295bea0f819832788bf4ce347d Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 10 Apr 2024 09:57:55 +0800 Subject: [PATCH 06/29] fix procedure --- internal/handler/arweave.go | 77 -------------------- internal/handler/checkstatus.go | 104 ++++------------------------ internal/handler/committer.go | 38 +++++++--- internal/handler/handler.go | 18 ++--- internal/handler/sequenceBatches.go | 85 +++++++++++++++++------ internal/handler/syncProposal.go | 26 +------ internal/handler/vote.go | 1 - internal/types/config.go | 2 +- pkg/b2node/b2node.go | 23 ++++++ pkg/b2node/b2node_test.go | 17 ++++- 10 files changed, 152 insertions(+), 239 deletions(-) delete mode 100644 internal/handler/arweave.go delete mode 100644 internal/handler/vote.go diff --git a/internal/handler/arweave.go b/internal/handler/arweave.go deleted file mode 100644 index 0b51397..0000000 --- a/internal/handler/arweave.go +++ /dev/null @@ -1,77 +0,0 @@ -package handler - -import ( - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/internal/svc" - "github.com/b2network/b2committer/pkg/log" - "github.com/everFinance/goar" - "github.com/everFinance/goar/types" - "github.com/pkg/errors" - "os" - "strconv" - "time" -) - -func BatchDetailsToAr(ctx *svc.ServiceContext) { - for { - var dbProposal schema.Proposal - err := ctx.DB.Where("status = ? and generate_details_file = ? and winner = ? and ar_tx_hash=''", - schema.ProposalCommitting, true, ctx.B2NodeConfig.Address).Order("proposal_id asc").First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.BatchDetailsToAr] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) - if proposal.Status == schema.ProposalSucceedStatus || proposal.ArweaveTxHash != "" { - log.Errorf("[Handler.BatchDetailsToAr] batch details already upload") - continue - } - - arTx, err := uploadDetailToAR(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) - if err != nil { - log.Errorf("[Handler.BatchDetailsToAr] upload detail to ar error: %s", errors.WithStack(err).Error()) - continue - } - _, err = ctx.NodeClient.ArweaveTx(dbProposal.ProposalID, arTx) - if err != nil { - log.Errorf("[Handler.BatchDetailsToAr] get ar tx error: %s", errors.WithStack(err).Error()) - continue - } - err = ctx.DB.Model(&dbProposal).Update("ar_tx_hash", arTx).Error - if err != nil { - log.Errorf("[Handler.BatchDetailsToAr] update proposal error: %s", errors.WithStack(err).Error()) - continue - } - time.Sleep(3 * time.Second) - } -} - -func uploadDetailToAR(ctx *svc.ServiceContext, startBatchNum uint64, endBatchNum uint64) (string, error) { - path, err := os.Getwd() - if err != nil { - log.Errorf("[WriteFile] get current path error: %s", errors.WithStack(err)) - return "", err - } - - arNode := ctx.Config.ArweaveRPC - wallet := ctx.Config.ArweaveWallet - fileName := strconv.FormatUint(startBatchNum, 10) + "-" + strconv.FormatUint(endBatchNum, 10) + ".json" - filePath := path + "/" + ctx.Config.BatchPath - content, err := os.ReadFile(filePath + "/" + fileName) - w, err := goar.NewWalletFromPath(wallet, arNode) - if err != nil { - log.Errorf("[WriteFile] new wallet error: %s", errors.WithStack(err)) - return "", err - } - tags := []types.Tag{ - {Name: "Content-Type", Value: "application/json"}, - {Name: "title", Value: "b2-batch"}, - } - tx, err := w.SendData(content, tags) - if err != nil { - log.Errorf("[WriteFile] send data error: %s", errors.WithStack(err)) - return "", err - } - return tx.ID, err -} diff --git a/internal/handler/checkstatus.go b/internal/handler/checkstatus.go index 1484679..40af04f 100644 --- a/internal/handler/checkstatus.go +++ b/internal/handler/checkstatus.go @@ -9,107 +9,31 @@ import ( "github.com/pkg/errors" ) -// CheckStatusVoting check proposal vote status -func CheckStatusVoting(ctx *svc.ServiceContext) { +// CheckStatusByContract sync check proposal status +func CheckStatusByContract(ctx *svc.ServiceContext) { for { - var dbProposal schema.Proposal - err := ctx.DB.Where("status=?", schema.ProposalVotingStatus).Order("end_batch_num asc").First(&dbProposal).Error + proposal, err := ctx.NodeClient.QueryLastProposal() if err != nil { - log.Errorf("[Handler.CheckStatus] find Voting proposal err: %s\n", errors.WithStack(err).Error()) - time.Sleep(5 * time.Second) + log.Errorf("[Handler.CheckStatusByContract][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) continue } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) + proposalContract, err := ctx.NodeClient.QueryProposalByID(proposal.Id) if err != nil { - log.Errorf("[Handler.CheckStatus] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) + log.Errorf("[Handler.CheckStatusByContract][QueryProposalByID] error info: %s", errors.WithStack(err).Error()) continue } - if proposal.Status != schema.ProposalVotingStatus && proposal.Winner.String() != "" { - dbProposal.Winner = proposal.Winner.String() - dbProposal.Status = uint64(proposal.Status) - ctx.DB.Save(dbProposal) - } - time.Sleep(3 * time.Second) - } -} - -func CheckStatusPending(ctx *svc.ServiceContext) { - for { var dbProposal schema.Proposal - err := ctx.DB.Where("status = ?", schema.ProposalPendingStatus).Order("end_batch_num asc").First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal err: %s\n", errors.WithStack(err)) - time.Sleep(5 * time.Second) - continue - } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) + err = ctx.DB.Where("proposal_id=?", proposal.Id).First(&dbProposal).Error if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) + log.Errorf("[Handler.CheckStatusByContract] find proposal err: %s\n", errors.WithStack(err).Error()) continue } - if proposal.Status == schema.ProposalCommitting { - dbProposal.Status = uint64(proposal.Status) - dbProposal.Winner = proposal.Winner.String() - dbProposal.BtcTxHash = proposal.BtcTxHash - ctx.DB.Save(dbProposal) - continue - } - time.Sleep(2 * time.Second) + dbProposal.BtcTxHash = proposalContract.BtcTxHash + dbProposal.ArTxHash = proposalContract.ArweaveTxHash + dbProposal.Winner = proposalContract.Winner.String() + dbProposal.Status = uint64(proposalContract.Status) + ctx.DB.Save(&dbProposal) + time.Sleep(20 * time.Second) } -} -func CheckStatusCommitting(ctx *svc.ServiceContext) { - for { - var dbProposal schema.Proposal - err := ctx.DB.Where("status = ?", schema.ProposalCommitting).Order("end_batch_num asc").First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal err: %s\n", errors.WithStack(err)) - time.Sleep(5 * time.Second) - continue - } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) - continue - } - if proposal.Status == schema.ProposalSucceedStatus { - dbProposal.Status = uint64(proposal.Status) - dbProposal.Winner = proposal.Winner.String() - dbProposal.ArTxHash = proposal.ArweaveTxHash - ctx.DB.Save(dbProposal) - continue - } - time.Sleep(2 * time.Second) - } -} - -func CheckStatusPendingTimeOut(ctx *svc.ServiceContext) { - for { - time.Sleep(30 * time.Second) - var dbProposal schema.Proposal - err := ctx.DB.Where("status = ? or status = ?", schema.ProposalPendingStatus, - schema.ProposalCommitting).Order("end_batch_num asc").First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] find Voting proposal and Committing proposal err: %s\n", errors.WithStack(err).Error()) - time.Sleep(5 * time.Second) - continue - } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] QueryProposalByID err: %s\n", errors.WithStack(err)) - continue - } - if (proposal.BtcTxHash == "" || proposal.ArweaveTxHash == "") && proposal.Winner.String() != ctx.B2NodeConfig.Address { - res, err := ctx.NodeClient.IsProposalTimeout(proposal.Id) - if err != nil { - log.Errorf("[Handler.CheckStatusTimeOut] TimeoutProposal err: %s\n", errors.WithStack(err)) - continue - } - if res { - dbProposal.Status = schema.ProposalTimeoutStatus - ctx.DB.Save(dbProposal) - } - time.Sleep(2 * time.Second) - } - } } diff --git a/internal/handler/committer.go b/internal/handler/committer.go index 8ff9c6a..5887841 100644 --- a/internal/handler/committer.go +++ b/internal/handler/committer.go @@ -51,18 +51,34 @@ func Committer(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) continue } + if lastProposalID == 0 { + lastProposalID = 1 + } + + if proposal.Status == schema.ProposalSucceedStatus { + lastProposalID++ + proposal, err = ctx.NodeClient.QueryProposalByID(lastProposalID) + if err != nil { + log.Errorf("[Handler.Committer][QueryProposalByID] error info: %s", errors.WithStack(err).Error()) + time.Sleep(10 * time.Second) + continue + } + } - proposalLatest, err := ctx.NodeClient.QueryProposalByID(lastProposalID) + res, err := ctx.NodeClient.CheckProposalTimeout(lastProposalID) if err != nil { - log.Errorf("[Handler.Committer][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) - return + log.Errorf("[Handler.Committer][CheckProposalTimeout] error info: %s", errors.WithStack(err).Error()) + continue } - if proposalLatest.Status != schema.ProposalTimeoutStatus { - log.Infof("[Handler.Committer] proposal status is processing, proposalID: %d, proposal status: %d", lastProposalID, proposalLatest.Status) + if !res && proposal.Status != schema.ProposalVotingStatus { + log.Infof("[Handler.Committer] proposal status is processing, proposalID: %d", lastProposalID) time.Sleep(10 * time.Second) continue } + if res && lastProposalID == 1 { + lastFinalBatchNum = 0 + } verifyBatchInfo, err := GetVerifyBatchInfoByLastBatchNum(ctx, lastFinalBatchNum) if err != nil { @@ -70,23 +86,24 @@ func Committer(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) continue } + err = committerProposal(ctx, verifyBatchInfo, lastProposalID) if err != nil { log.Errorf("[Handler.Committer] error info: %s", errors.WithStack(err).Error()) time.Sleep(10 * time.Second) continue } - time.Sleep(3 * time.Second) + time.Sleep(30 * time.Second) } } func GetVerifyBatchInfoByLastBatchNum(ctx *svc.ServiceContext, lastFinalBatchNum uint64) (*VerifyRangBatchInfo, error) { - verifyBatchesAndTxHashs, err := GetVerifyBatchesFromStartBatchNum(ctx, lastFinalBatchNum, ctx.Config.LimitNum) - if err != nil || len(verifyBatchesAndTxHashs) != ctx.Config.LimitNum { + verifyBatchesAndTxHashes, err := GetVerifyBatchesFromStartBatchNum(ctx, lastFinalBatchNum, ctx.Config.LimitNum) + if err != nil || len(verifyBatchesAndTxHashes) != ctx.Config.LimitNum { return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) } verifyBatchesParams := make([]*VerifyBatchesTrustedAggregatorParams, 0, ctx.Config.LimitNum) - for _, verifyBatch := range verifyBatchesAndTxHashs { + for _, verifyBatch := range verifyBatchesAndTxHashes { verifyBatchParam, err := GetVerifyBatchesParamsByTxHash(ctx, common.HexToHash(verifyBatch.txHash)) if err != nil { return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) @@ -102,8 +119,7 @@ func GetVerifyBatchInfoByLastBatchNum(ctx *svc.ServiceContext, lastFinalBatchNum // CommitterProposal committer transaction to b2-node func committerProposal(ctx *svc.ServiceContext, verifyBatchInfo *VerifyRangBatchInfo, lastProposalID uint64) error { - proposalID := lastProposalID + 1 - _, err := ctx.NodeClient.SubmitProof(proposalID, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, + _, err := ctx.NodeClient.SubmitProof(lastProposalID, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, verifyBatchInfo.startBatchNum, verifyBatchInfo.endBatchNum) if err != nil { return fmt.Errorf("[committerProposal] submit proof error info: %s, %d", errors.WithStack(err), verifyBatchInfo.startBatchNum) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 1e72570..3ee8b68 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -7,25 +7,19 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - go LatestBlackNumber(ctx) - // sync blocks - go SyncBlock(ctx) - // sync events - go SyncEvent(ctx) + //go LatestBlackNumber(ctx) + //// sync blocks + //go SyncBlock(ctx) + //// sync events + //go SyncEvent(ctx) // execute committer go Committer(ctx) // check and inscribe go Inscribe(ctx) // check status - go CheckStatusVoting(ctx) - // check pending - go CheckStatusPending(ctx) - // check time out - go CheckStatusPendingTimeOut(ctx) + go CheckStatusByContract(ctx) // sync proposal go SyncProposal(ctx) // sequence batches go SequenceBatches(ctx) - // upload batch detail to ar - go BatchDetailsToAr(ctx) } diff --git a/internal/handler/sequenceBatches.go b/internal/handler/sequenceBatches.go index f29fe96..37d0416 100644 --- a/internal/handler/sequenceBatches.go +++ b/internal/handler/sequenceBatches.go @@ -9,6 +9,8 @@ import ( "github.com/b2network/b2committer/pkg/event/zkevm" "github.com/b2network/b2committer/pkg/log" "github.com/ethereum/go-ethereum/common" + "github.com/everFinance/goar" + "github.com/everFinance/goar/types" "github.com/pkg/errors" "os" "strconv" @@ -28,41 +30,82 @@ type SequenceBatchesAndTxHash struct { } func SequenceBatches(ctx *svc.ServiceContext) { + time.Sleep(40 * time.Second) for { var dbProposal schema.Proposal - err := ctx.DB.Where("status = ? and generate_details_file = ? and winner = ?", schema.ProposalCommitting, false, - ctx.B2NodeConfig.Address).Order("proposal_id asc").First(&dbProposal).Error - collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) + err := ctx.DB.Where("status = ? and ar_tx_hash=''", schema.ProposalCommitting).Order("proposal_id desc").First(&dbProposal).Error if err != nil { - log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesFromStartBatchNum] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) + log.Errorf("[Handler.SequenceBatches]query proposal from db, error info: %s", errors.WithStack(err).Error()) + time.Sleep(5 * time.Second) continue } - if !collectionSequenceBatches.IsCompleted { - log.Errorf("[Handler.SequenceBatches] sync batches not completed") - time.Sleep(10 * time.Second) - continue - } - sequenceBatchesMap, err := GetSequenceBatchesDetails(ctx, collectionSequenceBatches.SequenceBatches) + proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) if err != nil { - log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesDetails] error info: %s", errors.WithStack(err).Error()) + log.Errorf("[Handler.SequenceBatches] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) time.Sleep(3 * time.Second) continue } - res, err := WriteFile(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum, sequenceBatchesMap) - if err != nil { - log.Errorf("[Handler.SequenceBatches][WriteFile] error info: %s", errors.WithStack(err).Error()) - time.Sleep(3 * time.Second) - continue - } - if res { - err = ctx.DB.Model(&dbProposal).Update("generate_details_file", true).Error + if proposal.Status == schema.ProposalCommitting && proposal.Winner.String() == ctx.B2NodeConfig.Address && + proposal.ArweaveTxHash == "" { + collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) + if err != nil { + log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesFromStartBatchNum] error info: %s", errors.WithStack(err).Error()) + time.Sleep(10 * time.Second) + continue + } + if !collectionSequenceBatches.IsCompleted { + log.Errorf("[Handler.SequenceBatches] sync batches not completed") + time.Sleep(10 * time.Second) + continue + } + sequenceBatchesMap, err := GetSequenceBatchesDetails(ctx, collectionSequenceBatches.SequenceBatches) + if err != nil { + log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesDetails] error info: %s", errors.WithStack(err).Error()) + time.Sleep(3 * time.Second) + continue + } + jsonData, err := json.Marshal(sequenceBatchesMap) + if err != nil { + log.Errorf("[WriteFile] json marshal error: %s", errors.WithStack(err)) + continue + } + tags := []types.Tag{ + {Name: "Content-Type", Value: "application/json"}, + {Name: "title", Value: "b2-batch"}, + {Name: "chainID", Value: strconv.FormatInt(ctx.B2NodeConfig.ChainID, 10)}, + } + arNode := ctx.Config.ArweaveRPC + wallet := ctx.Config.ArweaveWallet + w, err := goar.NewWalletFromPath(wallet, arNode) + arTx, err := w.SendData(jsonData, tags) + + _, err = ctx.NodeClient.ArweaveTx(dbProposal.ProposalID, arTx.ID) + if err != nil { + log.Errorf("[Handler.BatchDetailsToAr] get ar tx error: %s", errors.WithStack(err).Error()) + continue + } + err = ctx.DB.Model(&dbProposal).Update("ar_tx_hash", arTx.ID).Error if err != nil { - log.Errorf("[Handler.SequenceBatches][Update] error info: %s", errors.WithStack(err).Error()) + log.Errorf("[Handler.BatchDetailsToAr] update proposal error: %s", errors.WithStack(err).Error()) + continue + } + + res, err := WriteFile(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum, sequenceBatchesMap) + if err != nil { + log.Errorf("[Handler.SequenceBatches][WriteFile] error info: %s", errors.WithStack(err).Error()) time.Sleep(3 * time.Second) continue } + if res { + err = ctx.DB.Model(&dbProposal).Update("generate_details_file", true).Error + if err != nil { + log.Errorf("[Handler.SequenceBatches][Update] error info: %s", errors.WithStack(err).Error()) + time.Sleep(3 * time.Second) + continue + } + } } + time.Sleep(3 * time.Second) } } diff --git a/internal/handler/syncProposal.go b/internal/handler/syncProposal.go index 520a93b..078fbdc 100644 --- a/internal/handler/syncProposal.go +++ b/internal/handler/syncProposal.go @@ -35,7 +35,6 @@ func SyncProposal(ctx *svc.ServiceContext) { } if proposal == nil { log.Infof("[Handler.SyncProposal] proposal is nil", proposalID) - proposalID++ continue } var dbProposal schema.Proposal @@ -67,31 +66,10 @@ func SyncProposal(ctx *svc.ServiceContext) { } } - if dbProposal.ProposalID != 0 && dbProposal.Status != uint64(schema.ProposalVotingStatus) { - log.Infof("[Handler.SyncProposal] already voted :", ctx.B2NodeConfig.Address) - proposalID++ - continue - } - - if proposal.Status == schema.ProposalVotingStatus { - // voting - verifyBatchInfo, err := GetVerifyBatchInfoByLastBatchNum(ctx, proposal.StartIndex) - if err != nil { - log.Errorf("[Handler.SyncProposal] GetVerifyBatchInfoByLastBatchNum error info:", errors.WithStack(err)) - time.Sleep(3 * time.Second) - continue - } - - _, err = ctx.NodeClient.SubmitProof(proposal.Id, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, - verifyBatchInfo.startBatchNum, verifyBatchInfo.endBatchNum) - if err != nil { - log.Errorf("[Handler.SyncProposal] vote proposal error info", errors.WithStack(err)) - time.Sleep(3 * time.Second) - continue - } + if dbProposal.ProposalID != 0 { + log.Infof("[Handler.SyncProposal] already sync :", ctx.B2NodeConfig.Address) proposalID++ continue } - time.Sleep(10 * time.Second) } } diff --git a/internal/handler/vote.go b/internal/handler/vote.go deleted file mode 100644 index abeebd1..0000000 --- a/internal/handler/vote.go +++ /dev/null @@ -1 +0,0 @@ -package handler diff --git a/internal/types/config.go b/internal/types/config.go index 5f538cb..0596345 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -31,7 +31,7 @@ type Config struct { type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"1113"` RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://habitat-hub-rpc.bsquared.network"` - CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x0DD3684F0C7e6b383C7bEc2901dCDa4b5360D893"` + CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go index 49c1f38..0842116 100644 --- a/pkg/b2node/b2node.go +++ b/pkg/b2node/b2node.go @@ -3,6 +3,7 @@ package b2node import ( "crypto/ecdsa" "fmt" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/pkg/contract" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -10,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "math/big" + "time" ) type NodeClient struct { @@ -144,3 +146,24 @@ func (n NodeClient) IsProposalTimeout(id uint64) (bool, error) { } return res, nil } + +func (n NodeClient) CheckProposalTimeout(id uint64) (bool, error) { + res, err := n.IsProposalTimeout(id) + if err != nil { + return false, err + } + if res { + proposalLatest, err := n.QueryProposalByID(id) + if err != nil { + return true, err + } + if proposalLatest.Status != schema.ProposalTimeoutStatus { + _, err := n.TimeoutProposal(id) + if err != nil { + return true, err + } + time.Sleep(5 * time.Second) + } + } + return res, nil +} diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index 369c163..be7a403 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -15,7 +15,7 @@ import ( const ( creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" - contractAddress = "0x0DD3684F0C7e6b383C7bEc2901dCDa4b5360D893" + contractAddress = "0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D" URL = "https://habitat-hub-rpc.bsquared.network" chainID = 1113 ) @@ -46,7 +46,7 @@ func TestSetTimeoutPeriod(t *testing.T) { tx, err := committer.SetTimeoutPeriod(&bind.TransactOpts{ From: common.HexToAddress(creatorAddress), Signer: auth.Signer, - }, big.NewInt(60*60*24)) + }, big.NewInt(60*20)) require.NoError(t, err) fmt.Println(tx.Hash()) } @@ -216,6 +216,19 @@ func TestAr(t *testing.T) { fmt.Println(tx.Hash()) } +func TestIsProposalTimeout(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + require.NoError(t, err) + res, err := committer.IsProposalTimeout(&bind.CallOpts{ + From: common.HexToAddress(creatorAddress), + }, chainID, 2) + fmt.Println(res) +} + func TestTimeoutProposal(t *testing.T) { conn, err := ethclient.Dial(URL) require.NoError(t, err) From c3bb3ecb02a80a6e8bc1d8c91defe08c24b09a9b Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Sun, 14 Apr 2024 17:08:10 +0800 Subject: [PATCH 07/29] add op blob process --- docs/sql/listener.sql | 102 ++----- go.mod | 153 ++++++++-- go.sum | 416 ++++++++++++++++++++++------ internal/blockchain/blockchain.go | 8 +- internal/handler/handler.go | 24 +- internal/handler/op.go | 116 ++++++++ internal/schema/blob.go | 17 ++ internal/svc/svc.go | 34 ++- internal/types/config.go | 43 +-- pkg/b2node/b2node_test.go | 5 +- pkg/beacon/l1_beacon_client.go | 134 +++++++++ pkg/beacon/l1_beacon_client_test.go | 134 +++++++++ pkg/client/http.go | 88 ++++++ pkg/errcode/code.go | 1 + pkg/errcode/err_test.go | 14 + pkg/errcode/error.go | 22 ++ pkg/errcode/errors.go | 8 + pkg/event/op/l2OutputOracle.go | 55 ++++ 18 files changed, 1128 insertions(+), 246 deletions(-) create mode 100644 internal/handler/op.go create mode 100644 internal/schema/blob.go create mode 100644 pkg/beacon/l1_beacon_client.go create mode 100644 pkg/beacon/l1_beacon_client_test.go create mode 100644 pkg/client/http.go create mode 100644 pkg/errcode/code.go create mode 100644 pkg/errcode/err_test.go create mode 100644 pkg/errcode/error.go create mode 100644 pkg/errcode/errors.go create mode 100644 pkg/event/op/l2OutputOracle.go diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index f9fb930..f33de92 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -1,24 +1,10 @@ -Create Database If Not Exists b2_committer2 Character Set UTF8; -USE b2_committer2; +Create Database If Not Exists b2_committer_op Character Set UTF8; +USE b2_committer_op; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; --- ---------------------------- --- Table structure for rollbacks --- ---------------------------- -DROP TABLE IF EXISTS `rollbacks`; -CREATE TABLE `rollbacks` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' chain_name, eth', - `event_id` bigint NOT NULL COMMENT ' event id', - PRIMARY KEY (`id`), - KEY `event_id_index` (`event_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - -- ---------------------------- -- Table structure for sync_blocks -- ---------------------------- @@ -43,26 +29,6 @@ CREATE TABLE `sync_blocks` ( KEY `check_count_index` (`check_count`) ) ENGINE=InnoDB AUTO_INCREMENT=2923365 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; --- ---------------------------- --- Table structure for sync_blocks_history --- ---------------------------- -DROP TABLE IF EXISTS `sync_blocks_history`; -CREATE TABLE `sync_blocks_history` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' block chain', - `miner` varchar(42) NOT NULL COMMENT ' miner ', - `block_time` bigint NOT NULL COMMENT ' block time', - `block_number` bigint NOT NULL COMMENT ' block number', - `block_hash` varchar(66) NOT NULL COMMENT ' block Hash', - `tx_count` bigint NOT NULL COMMENT ' tx count ', - `event_count` bigint NOT NULL COMMENT ' event count ', - `parent_hash` varchar(66) NOT NULL COMMENT ' parent hash', - `status` varchar(32) NOT NULL COMMENT ' status', - `check_count` bigint NOT NULL COMMENT ' check count', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2792531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_events @@ -90,51 +56,6 @@ CREATE TABLE `sync_events` ( KEY `status_index` (`status`) ) ENGINE=InnoDB AUTO_INCREMENT=1011299 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; --- ---------------------------- --- Table structure for sync_events_history --- ---------------------------- -DROP TABLE IF EXISTS `sync_events_history`; -CREATE TABLE `sync_events_history` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `sync_block_id` bigint NOT NULL COMMENT ' 同步区块ID', - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `block_time` bigint NOT NULL COMMENT ' 区块时间', - `block_number` bigint NOT NULL COMMENT ' 区块高度', - `block_hash` varchar(66) NOT NULL COMMENT ' 区块Hash', - `block_log_indexed` bigint NOT NULL COMMENT ' 日志index', - `tx_index` bigint NOT NULL COMMENT ' 交易index', - `tx_hash` varchar(66) NOT NULL COMMENT ' 交易Hash', - `event_name` varchar(32) NOT NULL COMMENT ' 事件名称', - `event_hash` varchar(66) NOT NULL COMMENT ' 事件Hash', - `contract_address` varchar(42) NOT NULL COMMENT ' 合约地址', - `data` json NOT NULL COMMENT ' 数据内容', - `status` varchar(32) NOT NULL COMMENT ' 状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - --- ---------------------------- --- Table structure for sync_tasks --- ---------------------------- -DROP TABLE IF EXISTS `sync_tasks`; -CREATE TABLE `sync_tasks` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' 链名', - `latest_block` bigint NOT NULL COMMENT ' 同步高度', - `start_block` bigint NOT NULL COMMENT ' 同步开始区块高度', - `end_block` bigint NOT NULL COMMENT ' 同步结束区块高度', - `handle_num` bigint NOT NULL COMMENT ' 处理数', - `contracts` text NOT NULL COMMENT ' 合约地址,多个用,分割', - `status` varchar(32) NOT NULL COMMENT ' 状态', - PRIMARY KEY (`id`), - KEY `status_index` (`status`) -) ENGINE=InnoDB AUTO_INCREMENT=1000010 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - -SET FOREIGN_KEY_CHECKS = 1; - DROP TABLE IF EXISTS `proposal`; CREATE TABLE `proposal` ( `id` bigint NOT NULL AUTO_INCREMENT, @@ -153,4 +74,21 @@ CREATE TABLE `proposal` ( `ar_tx_hash` varchar(128), PRIMARY KEY (`id`), KEY `proposal_id_index` (`proposal_id`) -) +) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +DROP TABLE IF EXISTS `blob_info`; +CREATE TABLE `blob_info` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `block_number` bigint NOT NULL, + `block_hash_hex` varchar(128) NOT NULL, + `block_time` bigint NOT NULL COMMENT ' block_time', + `blob_versioned_hash` varchar(128) NOT NULL, + `blob_hashes_index` bigint NOT NULL, + `blob_side_car_index` bigint NOT NULL, + `blob_side_car_commitment` varchar(128) NOT NULL, + `blob` MEDIUMTEXT NOT NULL, + PRIMARY KEY (`id`), + KEY `op_blob_index` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; diff --git a/go.mod b/go.mod index 9520d14..b9ef6e0 100644 --- a/go.mod +++ b/go.mod @@ -3,99 +3,196 @@ module github.com/b2network/b2committer go 1.21 require ( - github.com/btcsuite/btcd v0.23.4 + github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcec/v2 v2.3.2 - github.com/btcsuite/btcd/btcutil v1.1.3 - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 + github.com/btcsuite/btcd/btcutil v1.1.5 + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/caarlos0/env/v6 v6.10.1 - github.com/ethereum/go-ethereum v1.13.14 + github.com/ethereum-optimism/optimism v1.7.3 + github.com/ethereum/go-ethereum v1.13.11 + github.com/everFinance/goar v1.6.2 github.com/pkg/errors v0.9.1 github.com/shopspring/decimal v1.3.1 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/txaty/go-merkletree v0.2.2 - go.uber.org/zap v1.23.0 + go.uber.org/zap v1.26.0 google.golang.org/grpc v1.60.1 - gorm.io/driver/postgres v1.5.7 - gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde + gorm.io/driver/mysql v1.5.4 + gorm.io/gorm v1.25.9 ) require ( + github.com/BurntSushi/toml v1.3.2 // indirect + github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 // indirect + github.com/CloudyKit/jet/v6 v6.2.0 // indirect + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Joker/jade v1.1.3 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect + github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/aead/siphash v1.0.1 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 // indirect + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240318114348-52d3dbd1605d // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/everFinance/arseeding v1.0.3 // indirect github.com/everFinance/ethrpc v1.0.4 // indirect - github.com/everFinance/goar v1.6.2 // indirect github.com/everFinance/goether v1.1.9 // indirect github.com/everFinance/gojwk v1.0.0 // indirect github.com/everFinance/ttcrsa v1.1.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/fjl/memsize v0.0.2 // indirect + github.com/flosch/pongo2/v4 v4.0.2 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/getsentry/sentry-go v0.18.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/css v1.0.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hamba/avro v1.5.6 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-bexpr v0.1.11 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.4 // indirect + github.com/huin/goupnp v1.3.0 // indirect github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.4.3 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect + github.com/ipfs/go-datastore v0.6.0 // indirect + github.com/iris-contrib/schema v0.0.6 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jbenet/goprocess v0.1.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kataras/blocks v0.0.7 // indirect + github.com/kataras/golog v0.1.9 // indirect + github.com/kataras/iris/v12 v12.2.1 // indirect + github.com/kataras/pio v0.0.12 // indirect + github.com/kataras/sitemap v0.0.6 // indirect + github.com/kataras/tunnel v0.0.4 // indirect github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect + github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.32.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.10.0 // indirect github.com/linkedin/goavro/v2 v2.12.0 // indirect + github.com/mailgun/raymond/v2 v2.0.48 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/microcosm-cc/bluemonday v1.0.24 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multiaddr v0.12.3 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/panjf2000/ants/v2 v2.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/rs/cors v1.8.2 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/rivo/uniseg v0.4.3 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.9.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/schollz/closestmatch v2.1.0+incompatible // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect + github.com/tdewolff/minify/v2 v2.12.7 // indirect + github.com/tdewolff/parse/v2 v2.6.6 // indirect github.com/tidwall/gjson v1.14.1 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.18.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/urfave/cli/v2 v2.27.1 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + github.com/yosssi/ace v0.0.5 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.17.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/h2non/gentleman.v2 v2.0.5 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/datatypes v1.0.1 // indirect - gorm.io/driver/mysql v1.5.4 // indirect + lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) +replace github.com/ethereum/go-ethereum v1.13.11 => github.com/ethereum-optimism/op-geth v1.101311.0-rc.1 + replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/go.sum b/go.sum index 0150058..0a617da 100644 --- a/go.sum +++ b/go.sum @@ -1,41 +1,59 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/agiledragon/gomonkey/v2 v2.11.0 h1:5oxSgA+tC1xuGsrIorR+sYiziYltmJyEZ9qA25b6l5U= github.com/agiledragon/gomonkey/v2 v2.11.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.4 h1:IzV6qqkfwbItOS/sg/aDfPDsjPP8twrCOE2R93hxMlQ= -github.com/btcsuite/btcd v0.23.4/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= +github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcd/btcutil v1.1.3/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -55,19 +73,23 @@ github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= -github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 h1:PuHFhOUMnD62r80dN+Ik5qco2drekgsUSVdcHsvllec= +github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= @@ -83,28 +105,38 @@ github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJ github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= +github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= +github.com/ethereum-optimism/op-geth v1.101311.0-rc.1 h1:3JE5FyGXNQCnXUuiK3I6ZD3zbB2DBIcEMsXCpjrXUwM= +github.com/ethereum-optimism/op-geth v1.101311.0-rc.1/go.mod h1:K23yb9efVf9DdUOv/vl/Ux57Tng00rLaFqWYlFF45CA= +github.com/ethereum-optimism/optimism v1.7.3 h1:kAwQcXcOnSqpcHDe8ZKUgbMSZn4p6khzM5E6QfqC/yQ= +github.com/ethereum-optimism/optimism v1.7.3/go.mod h1:uKYwgk+8sx5IkEZi4XXYBVx8AEgCl7jD5apZV2ht0ZQ= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240318114348-52d3dbd1605d h1:K7HdD/ZAcSFhcqqnUAbvU+8vsg0DzL8pvetHw5vRLCc= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240318114348-52d3dbd1605d/go.mod h1:7xh2awFQqsiZxFrHKTgEd+InVfDRrkKVUIuK8SAFHp0= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= -github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/everFinance/arseeding v1.0.3 h1:V1e98ehAGFJch6T7aP9jeb2cpoll68fB/GyuMmoBesM= github.com/everFinance/arseeding v1.0.3/go.mod h1:fxoIIXIL7G7nd6glaEvtbOxbvY/6UWD1E/bVsdD9Qio= github.com/everFinance/ethrpc v1.0.4 h1:Ww+qr8D93Id5QkyG5Mvw58edu5tqy0sL6hDP0IfhYsE= @@ -117,17 +149,27 @@ github.com/everFinance/gojwk v1.0.0 h1:le/oI2NgXlrqg3MHU6ka+V30EWcD7TD6+Ilh+go79 github.com/everFinance/gojwk v1.0.0/go.mod h1:icXSXsIdpAczlpAtSljQlmABkMTRZENr73KHmo0GOGc= github.com/everFinance/ttcrsa v1.1.3 h1:RJl9UizbevHZUiWPHVKz1aM6yA8cmkZWaCbOGTD/L0I= github.com/everFinance/ttcrsa v1.1.3/go.mod h1:Ws7b/oDbYKaZlvyT17nm+zHmzVhGl51r/yPx/Ib5RQk= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -136,11 +178,13 @@ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -155,12 +199,15 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -168,19 +215,34 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 h1:Ep/joEub9YwcjRY6ND3+Y/w0ncE540RtGatVhtZL0/Q= +github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hamba/avro v1.5.6 h1:/UBljlJ9hLjkcY7PhpI/bFYb4RMEXHEwHr17gAm/+l8= github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= +github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= @@ -190,8 +252,23 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac h1:n1DqxAo4oWPMvH1+v+DLYlMCecgumhhgnxAPdqDIFHI= github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= +github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= +github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +github.com/iris-contrib/httpexpect/v2 v2.12.1 h1:3cTZSyBBen/kfjCtgNFoUKi1u0FVXNaAjyRJOo6AVS4= +github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3ZuUUYB3u61KCqeSgZ88= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -231,16 +308,23 @@ github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXg github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v1.0.6 h1:e81vOSexXU3mJuJ4l//geOmKIt+Vkxerk1feQBC8D0g= github.com/jarcoal/httpmock v1.0.6/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -249,16 +333,32 @@ github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= +github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= +github.com/kataras/iris/v12 v12.2.1 h1:KV4XwpkfmtFcsWUIqG1h5X4wXjhwvxvr5QCEk14HF20= +github.com/kataras/iris/v12 v12.2.1/go.mod h1:PIK2JnQFbcugm3EGp997vYHD5ZRpjhNouZj6bRxlEpU= +github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= +github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -277,8 +377,21 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= +github.com/libp2p/go-libp2p v0.32.0 h1:86I4B7nBUPIyTgw3+5Ibq6K7DdKRCuZw8URCfPc1hQM= +github.com/libp2p/go-libp2p v0.32.0/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= +github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= +github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -290,17 +403,24 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/microcosm-cc/bluemonday v1.0.24 h1:NGQoPtwGVcbGkKfvyYk1yRqknzBuoMiUrO6R7uFTPlw= +github.com/microcosm-cc/bluemonday v1.0.24/go.mod h1:ArQySAMps0790cHSkdPEJ7bGkF2VePWH773hsJNSHf8= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= @@ -311,62 +431,114 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.12.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= +github.com/multiformats/go-multiaddr v0.12.3/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= +github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= +github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/panjf2000/ants/v2 v2.6.0 h1:xOSpw42m+BMiJ2I33we7h6fYzG4DAlpE1xyI7VS2gxU= github.com/panjf2000/ants/v2 v2.6.0/go.mod h1:cU93usDlihJZ5CfRGNDYsiBYvoilLvBF5Qp/BT2GNRE= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -374,13 +546,22 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tdewolff/minify/v2 v2.12.7 h1:pBzz2tAfz5VghOXiQIsSta6srhmTeinQPjRDHWoumCA= +github.com/tdewolff/minify/v2 v2.12.7/go.mod h1:ZRKTheiOGyLSK8hOZWWv+YoJAECzDivNgAlVYDHp/Ws= +github.com/tdewolff/parse/v2 v2.6.6 h1:Yld+0CrKUJaCV78DL1G2nk3C9lKrxyRTux5aaK/AkDo= +github.com/tdewolff/parse/v2 v2.6.6/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tdewolff/test v1.0.9 h1:SswqJCmeN4B+9gEAi/5uqT0qpi1y2/2O47V/1hhGZT0= +github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tidwall/gjson v1.6.3/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0= github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -398,30 +579,50 @@ github.com/txaty/go-merkletree v0.2.2 h1:K5bHDFK+Q3KK+gEJeyTOECKuIwl/LVo4CI+cm0/ github.com/txaty/go-merkletree v0.2.2/go.mod h1:w5HPEu7ubNw5LzS+91m+1/GtuZcWHKiPU3vEGi+ThJM= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= +github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -433,8 +634,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= @@ -445,6 +646,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -453,6 +655,7 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -462,14 +665,19 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -485,7 +693,9 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -493,21 +703,34 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -520,7 +743,9 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -529,6 +754,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -555,6 +781,7 @@ google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7 google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -562,8 +789,11 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/h2non/gentleman.v2 v2.0.5 h1:ckmb6cLxL2DDk7WN7LSdxXDq7jNkOicFg4JZ4ZnDNuE= gopkg.in/h2non/gentleman.v2 v2.0.5/go.mod h1:A1c7zwrTgAyyf6AbpvVksYtBayTB4STBUGmdkEtlHeA= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -572,7 +802,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/datatypes v1.0.1 h1:6npnXbBtjpSb7FFVA2dG/llyTN8tvZfbUqs+WyLrYgQ= @@ -583,17 +812,24 @@ gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tv gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/driver/sqlite v1.1.4 h1:PDzwYE+sI6De2+mxAneV9Xs11+ZyKV6oxD3wDGkaNvM= gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw= +gorm.io/driver/sqlserver v1.0.7 h1:uwUtb0kdFwW5PkRbd2KJ2h4wlsqvLSjox1XVg/RnzRE= gorm.io/driver/sqlserver v1.0.7/go.mod h1:ng66aHI47ZIKz/vvnxzDoonzmTS8HXP+JYlgg67wOog= gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.6/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde h1:9DShaph9qhkIYw7QF91I/ynrr4cOO2PZra2PFD7Mfeg= gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8= +gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= +lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/internal/blockchain/blockchain.go b/internal/blockchain/blockchain.go index 2fac333..730be48 100644 --- a/internal/blockchain/blockchain.go +++ b/internal/blockchain/blockchain.go @@ -2,7 +2,7 @@ package blockchain import ( config "github.com/b2network/b2committer/internal/types" - "github.com/b2network/b2committer/pkg/event/zkevm" + "github.com/b2network/b2committer/pkg/event/op" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" ) @@ -22,11 +22,9 @@ var ( ) func init() { - register(&zkevm.VerifyBatches{}) - register(&zkevm.SequenceBatches{}) + register(&op.OutputProposed{}) cfg := config.GetConfig() - addContract(cfg.PolygonVerifyBatchContract) - addContract(cfg.PolygonSequenceContract) + addContract(cfg.L2OutputOracleProxyContract) } func register(event Event) { diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 3ee8b68..748b44b 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -7,19 +7,21 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - //go LatestBlackNumber(ctx) - //// sync blocks + go LatestBlackNumber(ctx) + // sync blocks //go SyncBlock(ctx) //// sync events //go SyncEvent(ctx) + // query blob and store in local + go QueryBlobOnChainAndStoreInLocal(ctx) // execute committer - go Committer(ctx) - // check and inscribe - go Inscribe(ctx) - // check status - go CheckStatusByContract(ctx) - // sync proposal - go SyncProposal(ctx) - // sequence batches - go SequenceBatches(ctx) + //go Committer(ctx) + //// check and inscribe + //go Inscribe(ctx) + //// check status + //go CheckStatusByContract(ctx) + //// sync proposal + //go SyncProposal(ctx) + //// sequence batches + //go SequenceBatches(ctx) } diff --git a/internal/handler/op.go b/internal/handler/op.go new file mode 100644 index 0000000..e10fe01 --- /dev/null +++ b/internal/handler/op.go @@ -0,0 +1,116 @@ +package handler + +import ( + "context" + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/pkg/errcode" + "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + "gorm.io/gorm" + "math/big" + "time" +) + +func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { + time.Sleep(10 * time.Second) + blobNum := ctx.Config.InitBlobBlockNumber + var dbBlob schema.BlobInfo + var count int64 + err := ctx.DB.Order("block_number desc").First(&dbBlob).Error + if err != nil && err != gorm.ErrRecordNotFound { + panic(err) + } + + switch err { + case gorm.ErrRecordNotFound: + ctx.SyncedBlobBlockNumber = ctx.Config.InitBlobBlockNumber + ctx.SyncedBlobBlockHash = common.HexToHash(ctx.Config.InitBlobBlockHash) + default: + ctx.SyncedBlobBlockNumber = dbBlob.BlockNumber + ctx.SyncedBlobBlockHash = common.HexToHash(dbBlob.BlockHashHex) + } + + log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal]SyncedBlobBlockNumber: %d", ctx.SyncedBlobBlockNumber) + log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal]SyncedBlobBlockHash:%s", ctx.SyncedBlobBlockHash.String()) + + for { + syncingBlobBlockNumber := ctx.SyncedBlobBlockNumber + 1 + log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal] Try to sync block number: %d\n", syncingBlobBlockNumber) + + if syncingBlobBlockNumber > ctx.LatestBlockNumber { + time.Sleep(3 * time.Second) + continue + } + + blockOnChain, err := ctx.RPC.BlockByNumber(context.Background(), big.NewInt(syncingBlobBlockNumber)) + if err != nil { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] Get block by number error: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + if blockOnChain.ParentHash() != ctx.SyncedBlobBlockHash { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] ParentHash of the block being synchronized is inconsistent: %s \n", ctx.SyncedBlobBlockHash) + continue + } + + blobInfos, err1 := ctx.BlobDataSource.GetBlobByBlockNum(context.Background(), blockOnChain.Number()) + if errors.Is(err1, errcode.ErrNoBlobFoundInBlock) { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal]", err1.Error()) + ctx.SyncedBlobBlockNumber = syncingBlobBlockNumber + ctx.SyncedBlobBlockHash = blockOnChain.Hash() + continue + } + if err1 != nil { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] Get blob by block number error: %s", err1.Error()) + continue + } + + err1 = ctx.DB.Where("block_number=? ", syncingBlobBlockNumber).Order("block_number desc").Find(&dbBlob).Count(&count).Error + if err1 != nil && err != gorm.ErrRecordNotFound { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] DB Count error: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + + if count != 0 { + if int(count) == len(blobInfos) { + err := ctx.DB.Where("block_number=? ", syncingBlobBlockNumber).Order("block_number desc").First(&dbBlob).Error + if err != nil { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] DB First error: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + ctx.SyncedBlobBlockNumber = syncingBlobBlockNumber + ctx.SyncedBlobBlockHash = common.HexToHash(dbBlob.BlockHashHex) + continue + } else { + err := ctx.DB.Delete(&dbBlob, "block_number=?", blobNum).Error + if err != nil { + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] DB Delete error: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + } + } + + for _, bif := range blobInfos { + err := ctx.DB.Create(&schema.BlobInfo{ + BlockNumber: blockOnChain.Number().Int64(), + BlockHashHex: blockOnChain.Hash().String(), + BlockTime: blockOnChain.Time(), + BlobVersionedHash: bif.Hash.Hash.String(), + BlobHashesIndex: bif.Hash.Index, + BlobSideCarIndex: uint64(bif.BlobSidecar.Index), + BlobSideCarCommitment: bif.BlobSidecar.KZGCommitment.String(), + Blob: bif.BlobSidecar.Blob.String(), + }).Error + if err != nil { + log.Errorf("[Handler.SyncBlock] DB Create SyncBlock error: %s\n", errors.WithStack(err)) + time.Sleep(1 * time.Second) + continue + } + } + } +} diff --git a/internal/schema/blob.go b/internal/schema/blob.go new file mode 100644 index 0000000..aebc67d --- /dev/null +++ b/internal/schema/blob.go @@ -0,0 +1,17 @@ +package schema + +type BlobInfo struct { + Base + BlockNumber int64 `json:"block_number"` + BlockHashHex string `json:"block_hash_hex"` + BlockTime uint64 `json:"block_time"` + BlobVersionedHash string `json:"blob_versioned_hash"` + BlobHashesIndex uint64 `json:"blob_hashes_index"` + BlobSideCarIndex uint64 `json:"blob_side_car_index"` + BlobSideCarCommitment string `json:"blob_side_car_commitment"` + Blob string `json:"blob"` +} + +func (BlobInfo) TableName() string { + return "blob_info" +} diff --git a/internal/svc/svc.go b/internal/svc/svc.go index bad6814..4de98f8 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -3,28 +3,36 @@ package svc import ( "github.com/b2network/b2committer/internal/types" "github.com/b2network/b2committer/pkg/b2node" + "github.com/b2network/b2committer/pkg/beacon" + "github.com/b2network/b2committer/pkg/client" "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + "math/big" "time" ) var svc *ServiceContext type ServiceContext struct { - Config *types.Config - RPC *ethclient.Client - DB *gorm.DB - BTCConfig *types.BitcoinRPCConfig - B2NodeConfig *types.B2NODEConfig - LatestBlockNumber int64 - SyncedBlockNumber int64 - SyncedBlockHash common.Hash - NodeClient *b2node.NodeClient - LatestBTCBlockNumber int64 + Config *types.Config + RPC *ethclient.Client + DB *gorm.DB + BTCConfig *types.BitcoinRPCConfig + B2NodeConfig *types.B2NODEConfig + LatestBlockNumber int64 + SyncedBlockNumber int64 + SyncedBlockHash common.Hash + NodeClient *b2node.NodeClient + LatestBTCBlockNumber int64 + BlobDataSource *beacon.BlobDataSource + SyncedBlobBlockNumber int64 + SyncedBlobBlockHash common.Hash } func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2nodeConfig *types.B2NODEConfig) *ServiceContext { @@ -61,6 +69,11 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 } nodeClient := b2node.NewNodeClient(privateKeHex, chainID, address, contractAddress, b2rpc) + l1Signer := ethTypes.NewCancunSigner(big.NewInt(chainID)) + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(cfg.BeaconChainRPCUrl)) + l1BlobFetcher := sources.NewL1BeaconClient(l1Beacon, sources.L1BeaconClientConfig{FetchAllSidecars: false}) + bds := beacon.NewBlobDataSource(l1Signer, common.HexToAddress(cfg.BatcherInbox), common.HexToAddress(cfg.BatcherSender), l1BlobFetcher, rpc) + svc = &ServiceContext{ BTCConfig: bitcoinCfg, DB: storage, @@ -69,6 +82,7 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 LatestBlockNumber: cfg.InitBlockNumber, B2NodeConfig: b2nodeConfig, NodeClient: nodeClient, + BlobDataSource: bds, } return svc } diff --git a/internal/types/config.go b/internal/types/config.go index 0596345..bc1ecfb 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -9,28 +9,33 @@ type Config struct { // debug", "info", "warn", "error", "panic", "fatal" LogLevel string `env:"LOG_LEVEL" envDefault:"info"` // "console","json" - LogFormat string `env:"LOG_FORMAT" envDefault:"console"` - PostgresqlDataSource string `env:"POSTGRESQL_DATA_SOURCE" envDefault:"host=localhost port=5433 user=postgres password=postgres dbname=b2_committer sslmode=disable"` - MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer2?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` - MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` - MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` - MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` - RPCUrl string `env:"RPC_URL" envDefault:"https://habitat-hub-rpc.bsquared.network"` - Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` - InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"0"` - InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0x49a34ca5e11dbcd56b4cad717a98efe5c76552a2dcfbdcd693a248e2fd5f8d51"` - PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xa6AAdA6845b2083ff6812bAc773038442e7f4dE6"` - PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0xDdee8ddfA81F5E36373637240038DCCC14529BF7"` - LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` - InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` - BatchPath string `env:"BATCH_PATH" envDefault:"batchFile"` - ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"./wallet/account.json"` - ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` + LogFormat string `env:"LOG_FORMAT" envDefault:"console"` + MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer_op?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` + MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` + MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` + MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` + RPCUrl string `env:"RPC_URL" envDefault:"https://1rpc.io/sepolia"` + BeaconChainRPCUrl string `env:"BEACON_CHAIN_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` + Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` + InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"4102885"` + InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0x9612534dc810c9c51211c77def2db781d7cc7979b0cb076a47c9fc6fb6dc475c"` + InitBlobBlockNumber int64 `env:"INIT_BLOB_BLOCK_NUMBER" envDefault:"5687501"` + InitBlobBlockHash string `env:"INIT_BLOB_BLOCK_HASH" envDefault:"0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee"` + PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xa6AAdA6845b2083ff6812bAc773038442e7f4dE6"` + PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0xDdee8ddfA81F5E36373637240038DCCC14529BF7"` + L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` //sepolia + BatcherInbox string `env:"BATCHER_INBOX" envDefault:"0xff00000000000000000000000000000011155420"` + BatcherSender string `env:"BATCHER_SENDER" envDefault:"0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c"` + LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` + InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` + BatchPath string `env:"BATCH_PATH" envDefault:"batchFile"` + ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"./wallet/account.json"` + ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` } type B2NODEConfig struct { - ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"1113"` - RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://habitat-hub-rpc.bsquared.network"` + ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` + RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://1rpc.io/sepolia"` CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index be7a403..0d68874 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -16,8 +16,11 @@ const ( creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" contractAddress = "0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D" - URL = "https://habitat-hub-rpc.bsquared.network" + URL = "https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30/" chainID = 1113 + + SepoliaBatcherSender = "0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c" + SepoliaBatcherInbox = "0xff00000000000000000000000000000011155420" ) func TestQueryTimeoutPeriod(t *testing.T) { diff --git a/pkg/beacon/l1_beacon_client.go b/pkg/beacon/l1_beacon_client.go new file mode 100644 index 0000000..4986d4b --- /dev/null +++ b/pkg/beacon/l1_beacon_client.go @@ -0,0 +1,134 @@ +package beacon + +import ( + "context" + "errors" + "fmt" + "github.com/b2network/b2committer/pkg/errcode" + "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "math/big" +) + +type BlobDataSource struct { + L1Signer types.Signer + BatchInboxAddress common.Address + BatchSenderAddress common.Address + data []BlockBlobInfo + BlobsFetcher *sources.L1BeaconClient + EthRPC *ethclient.Client +} + +func NewBlobDataSource(l1Signer types.Signer, batchInboxAddress common.Address, batchSenderAddress common.Address, + blobsFetcher *sources.L1BeaconClient, ethRPC *ethclient.Client) *BlobDataSource { + return &BlobDataSource{ + L1Signer: l1Signer, + BatchInboxAddress: batchInboxAddress, + BatchSenderAddress: batchSenderAddress, + BlobsFetcher: blobsFetcher, + EthRPC: ethRPC, + } +} + +func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big.Int) ([]BlockBlobInfo, error) { + block, err := bds.EthRPC.BlockByNumber(ctx, blockNum) + if err != nil { + return nil, fmt.Errorf("failed to get block %d: %v", blockNum, err) + } + txs := block.Transactions() + hashes := DataAndHashesFromTxs(txs, bds.L1Signer, bds.BatchInboxAddress, bds.BatchSenderAddress) + if len(hashes) == 0 { + // there are no blobs to fetch so we can return immediately + //return nil, fmt.Errorf("no blobs found in block %d", blockNum) + return nil, errcode.ErrNoBlobFoundInBlock + } + l1Block := eth.L1BlockRef{ + Hash: block.Hash(), + Number: block.Number().Uint64(), + ParentHash: block.ParentHash(), + Time: block.Time(), + } + //blobs, err := bds.BlobsFetcher.GetBlobs(context.Background(), l1Block, hashes) + blobSidecars, err := bds.BlobsFetcher.GetBlobSidecars(context.Background(), l1Block, hashes) + + if errors.Is(err, ethereum.NotFound) { + // If the L1 block was available, then the blobs should be available too. The only + // exception is if the blob retention window has expired, which we will ultimately handle + // by failing over to a blob archival service. + return nil, fmt.Errorf("failed to fetch blobs: %w", err) + } else if err != nil { + return nil, fmt.Errorf("failed to fetch blobs: %w", err) + } + var data []BlockBlobInfo + for i, hash := range hashes { + if &blobSidecars[i] == nil { + log.Errorf("blob %d not found in block %d", hash.Index, blockNum) + continue + } + data = append(data, BlockBlobInfo{ + BlobSidecar: blobSidecars[i], + Hash: &hash, + }) + } + return data, nil +} + +// dataAndHashesFromTxs extracts calldata and datahashes from the input transactions and returns them. It +// creates a placeholder blobOrCalldata element for each returned blob hash that must be populated +// by fillBlobPointers after blob bodies are retrieved. +func DataAndHashesFromTxs(txs types.Transactions, l1Signer types.Signer, batchInboxAddress common.Address, batcherAddr common.Address) []eth.IndexedBlobHash { + var hashes []eth.IndexedBlobHash + blobIndex := 0 // index of each blob in the block's blob sidecar + for _, tx := range txs { + // skip any non-batcher transactions + if !isValidBatchTx(tx, l1Signer, batchInboxAddress, batcherAddr) { + continue + } + // handle non-blob batcher transactions by extracting their calldata + if tx.Type() != types.BlobTxType { + continue + } + // handle blob batcher transactions by extracting their blob hashes, ignoring any calldata. + if len(tx.Data()) > 0 { + log.Errorf("blob tx has calldata, which will be ignored %s, %s", "txhash", tx.Hash()) + } + for _, h := range tx.BlobHashes() { + idh := eth.IndexedBlobHash{ + Index: uint64(blobIndex), + Hash: h, + } + hashes = append(hashes, idh) + blobIndex += 1 + } + } + return hashes +} + +// isValidBatchTx returns true if: +// 1. the transaction has a To() address that matches the batch inbox address, and +// 2. the transaction has a valid signature from the batcher address +func isValidBatchTx(tx *types.Transaction, l1Signer types.Signer, batchInboxAddr, batcherAddr common.Address) bool { + to := tx.To() + if to == nil || *to != batchInboxAddr { + return false + } + seqDataSubmitter, err := l1Signer.Sender(tx) // optimization: only derive sender if To is correct + if err != nil { + return false + } + // some random L1 user might have sent a transaction to our batch inbox, ignore them + if seqDataSubmitter != batcherAddr { + return false + } + return true +} + +type BlockBlobInfo struct { + BlobSidecar *eth.BlobSidecar + Hash *eth.IndexedBlobHash +} diff --git a/pkg/beacon/l1_beacon_client_test.go b/pkg/beacon/l1_beacon_client_test.go new file mode 100644 index 0000000..cef93dc --- /dev/null +++ b/pkg/beacon/l1_beacon_client_test.go @@ -0,0 +1,134 @@ +package beacon + +import ( + "context" + "fmt" + "github.com/b2network/b2committer/pkg/client" + "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +const ( + URL = "https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30/" + chainID = 11155111 + SepoliaBatcherSender = "0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c" + SepoliaBatcherInbox = "0xff00000000000000000000000000000011155420" +) + +func TestBlockByNumber(t *testing.T) { + l1Signer := types.NewCancunSigner(big.NewInt(chainID)) + fmt.Println(l1Signer.ChainID()) + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + + block, _ := conn.BlockByNumber(context.Background(), big.NewInt(5679002)) + fmt.Println(block.Number()) + tx1, _, _ := conn.TransactionByHash(context.Background(), common.HexToHash("0x3f343bbaa8dd0d76365fad90c87ef6df1fb66fa0342ace6f545aa3e2c8cf7c95")) + fmt.Println(tx1.Hash()) + from, err := l1Signer.Sender(tx1) + fmt.Println(from.Hex()) + blobIndex := 0 // index of each blob in the block's blob sidecar + var hashes []eth.IndexedBlobHash + for _, tx := range block.Transactions() { + if !isValidBatchTx(tx, l1Signer, common.HexToAddress(SepoliaBatcherInbox), common.HexToAddress(SepoliaBatcherSender)) { + blobIndex += len(tx.BlobHashes()) + continue + } + if tx.Type() != types.BlobTxType { + continue + } + for _, h := range tx.BlobHashes() { + idh := eth.IndexedBlobHash{ + Index: uint64(blobIndex), + Hash: h, + } + hashes = append(hashes, idh) + blobIndex += 1 + } + } + fmt.Println(hashes) +} + +func TestNodeVersion(t *testing.T) { + log.Info("test beacon node...") + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(URL)) + version, _ := l1Beacon.NodeVersion(context.Background()) + fmt.Println(version) +} + +func TestConfigSpec(t *testing.T) { + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(URL)) + config, _ := l1Beacon.ConfigSpec(context.Background()) + fmt.Println(config.Data.SecondsPerSlot) +} + +func TestGetGenesis(t *testing.T) { + //logger := testlog.Logger(t, 0).New("component", "beaconClient") + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(URL)) + config, _ := l1Beacon.BeaconGenesis(context.Background()) + fmt.Println(config.Data.GenesisTime) +} + +func TestBeaconBlobSidecars(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + block, _ := conn.BlockByNumber(context.Background(), big.NewInt(5679002)) + fmt.Println(block.Number()) + txs := block.Transactions() + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(URL)) + l1BlobFetcher := sources.NewL1BeaconClient(l1Beacon, sources.L1BeaconClientConfig{FetchAllSidecars: false}) + l1Signer := types.NewCancunSigner(big.NewInt(chainID)) + hashes := DataAndHashesFromTxs(txs, l1Signer, common.HexToAddress(SepoliaBatcherInbox), common.HexToAddress(SepoliaBatcherSender)) + l1Block := eth.L1BlockRef{ + Hash: block.Hash(), + Number: block.Number().Uint64(), + ParentHash: block.ParentHash(), + Time: block.Time(), + } + for _, bHash := range hashes { + fmt.Println(bHash) + } + blobs, err := l1BlobFetcher.GetBlobs(context.Background(), l1Block, hashes) + fmt.Println(blobs) +} + +func TestGetBlobByBlockNum(t *testing.T) { + conn, err := ethclient.Dial(URL) + require.NoError(t, err) + defer conn.Close() + l1Signer := types.NewCancunSigner(big.NewInt(chainID)) + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(URL)) + l1BlobFetcher := sources.NewL1BeaconClient(l1Beacon, sources.L1BeaconClientConfig{FetchAllSidecars: false}) + bds := NewBlobDataSource(l1Signer, common.HexToAddress(SepoliaBatcherInbox), common.HexToAddress(SepoliaBatcherSender), l1BlobFetcher, conn) + blockBlobInfo, err := bds.GetBlobByBlockNum(context.Background(), big.NewInt(5687502)) + fmt.Println(blockBlobInfo[0].Hash.Index) + fmt.Println(blockBlobInfo[0].Hash.Hash) + fmt.Println(blockBlobInfo[0].BlobSidecar.KZGCommitment) +} + +func TestGetBlobByBlockNumMainNet(t *testing.T) { + conn, err := ethclient.Dial("https://ethereum-rpc.publicnode.com") + require.NoError(t, err) + defer conn.Close() + l1Signer := types.NewCancunSigner(big.NewInt(1)) + l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient("https://ethereum-beacon-api.publicnode.com")) + l1BlobFetcher := sources.NewL1BeaconClient(l1Beacon, sources.L1BeaconClientConfig{FetchAllSidecars: false}) + bds := NewBlobDataSource(l1Signer, common.HexToAddress("0xFF00000000000000000000000000000000000010"), common.HexToAddress("0x6887246668a3b87F54DeB3b94Ba47a6f63F32985"), l1BlobFetcher, conn) + blockBlobInfo, err := bds.GetBlobByBlockNum(context.Background(), big.NewInt(19645654)) + require.NoError(t, err) + if len(blockBlobInfo) != 0 { + fmt.Println(blockBlobInfo[0].Hash.Index) + fmt.Println(blockBlobInfo[0].Hash.Hash) + fmt.Println(blockBlobInfo[0].BlobSidecar.KZGCommitment) + fmt.Println(blockBlobInfo[0].BlobSidecar.Index) + } +} diff --git a/pkg/client/http.go b/pkg/client/http.go new file mode 100644 index 0000000..d03ed9c --- /dev/null +++ b/pkg/client/http.go @@ -0,0 +1,88 @@ +package client + +import ( + "context" + "errors" + "fmt" + "net/http" + "net/url" + "time" +) + +const ( + DefaultTimeoutSeconds = 30 +) + +var _ HTTP = (*BasicHTTPClient)(nil) + +type HTTP interface { + Get(ctx context.Context, path string, query url.Values, headers http.Header) (*http.Response, error) +} + +type BasicHTTPClient struct { + endpoint string + header http.Header // optional header to use in every request + client *http.Client +} + +func NewBasicHTTPClient(endpoint string, opts ...BasicHTTPClientOption) *BasicHTTPClient { + c := &BasicHTTPClient{ + endpoint: endpoint, + client: &http.Client{Timeout: DefaultTimeoutSeconds * time.Second}, + } + + for _, opt := range opts { + opt.Apply(c) + } + + return c +} + +type BasicHTTPClientOption interface { + Apply(c *BasicHTTPClient) +} + +type BasicHTTPClientOptionFn func(*BasicHTTPClient) + +func (fn BasicHTTPClientOptionFn) Apply(c *BasicHTTPClient) { + fn(c) +} + +func WithHeader(h http.Header) BasicHTTPClientOption { + return BasicHTTPClientOptionFn(func(c *BasicHTTPClient) { + c.header = h + }) +} + +var ErrNoEndpoint = errors.New("no endpoint is configured") + +func (cl *BasicHTTPClient) Get(ctx context.Context, p string, query url.Values, headers http.Header) (*http.Response, error) { + if cl.endpoint == "" { + return nil, ErrNoEndpoint + } + target, err := url.Parse(cl.endpoint) + if err != nil { + return nil, fmt.Errorf("failed to parse endpoint URL: %w", err) + } + // If we include the raw query in the path-join, it gets url-encoded, + // and fails to parse as query, and ends up in the url.URL.Path part on the server side. + // We want to avoid that, and insert the query manually. Real footgun in the url package. + target = target.JoinPath(p) + target.RawQuery = query.Encode() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, target.String(), nil) + if err != nil { + return nil, fmt.Errorf("%w: failed to construct request", err) + } + addHTTPHeaders(req.Header, cl.header, headers) + return cl.client.Do(req) +} + +func addHTTPHeaders(header http.Header, hs ...http.Header) { + for _, h := range hs { + for key, values := range h { + for _, value := range values { + header.Add(key, value) + } + } + } +} diff --git a/pkg/errcode/code.go b/pkg/errcode/code.go new file mode 100644 index 0000000..cc0f8d4 --- /dev/null +++ b/pkg/errcode/code.go @@ -0,0 +1 @@ +package errcode diff --git a/pkg/errcode/err_test.go b/pkg/errcode/err_test.go new file mode 100644 index 0000000..2f51b2a --- /dev/null +++ b/pkg/errcode/err_test.go @@ -0,0 +1,14 @@ +package errcode + +import ( + "fmt" + "github.com/pkg/errors" + "testing" +) + +func TestErr(t *testing.T) { + // 测试 + err := ErrNoBlobFoundInBlock + fmt.Println(errors.Is(err, ErrNoBlobFoundInBlock)) + fmt.Println(errors.Is(err, ErrNoBlobFound)) +} diff --git a/pkg/errcode/error.go b/pkg/errcode/error.go new file mode 100644 index 0000000..5bd9e5b --- /dev/null +++ b/pkg/errcode/error.go @@ -0,0 +1,22 @@ +package errcode + +type ErrCode struct { + Code string // business error code + Message string // error message + Err error // real error +} + +func NewErrCodeWithMessage(code string, msg string) ErrCode { + err := ErrCode{ + Code: code, + Message: msg, + } + return err +} + +func (e ErrCode) Error() string { + if e.Err != nil { + return e.Err.Error() + } + return e.Message +} diff --git a/pkg/errcode/errors.go b/pkg/errcode/errors.go new file mode 100644 index 0000000..314ba7e --- /dev/null +++ b/pkg/errcode/errors.go @@ -0,0 +1,8 @@ +package errcode + +import "github.com/pkg/errors" + +var ( + ErrNoBlobFoundInBlock = errors.New("no blobs found in this block ") + ErrNoBlobFound = errors.New("no blobs found in this block ") +) diff --git a/pkg/event/op/l2OutputOracle.go b/pkg/event/op/l2OutputOracle.go new file mode 100644 index 0000000..2f0ebb6 --- /dev/null +++ b/pkg/event/op/l2OutputOracle.go @@ -0,0 +1,55 @@ +package op + +import ( + "encoding/json" + "math/big" + + "github.com/b2network/b2committer/pkg/event" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +var ( + OutputProposedName = "OutputProposed" + + OutputProposedHash = crypto.Keccak256([]byte("OutputProposed(bytes32,uint256,uint256,uint256)")) +) + +type OutputProposed struct { + OutputRoot string `json:"outputRoot"` + L2OutputIndex *big.Int `json:"l2OutputIndex"` + L2BlockNumber *big.Int `json:"l2BlockNumber"` + L1Timestamp *big.Int `json:"l1Timestamp"` +} + +func (*OutputProposed) Name() string { + return OutputProposedName +} + +func (*OutputProposed) EventHash() common.Hash { + return common.BytesToHash(OutputProposedHash) +} + +func (t *OutputProposed) ToObj(data string) error { + err := json.Unmarshal([]byte(data), &t) + if err != nil { + return err + } + return nil +} + +func (*OutputProposed) Data(log types.Log) (string, error) { + + transfer := &OutputProposed{ + OutputRoot: event.TopicToHash(log, 1).Hex(), + L2OutputIndex: big.NewInt(event.TopicToInt64(log, 2)), + L2BlockNumber: big.NewInt(event.TopicToInt64(log, 3)), + L1Timestamp: big.NewInt(event.DataToInt64(log, 0)), + } + data, err := event.ToJSON(transfer) + if err != nil { + return "", err + } + return data, nil +} From b4a8e5daf57f823d9ddee636cd123698e50cd4d3 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 16 Apr 2024 19:26:12 +0800 Subject: [PATCH 08/29] add construct txs proposal --- abi/OpCommitter.json | 1 + abi/OpProposalManager.json | 1 + abi/Proposer.json | 1 + docs/sql/listener.sql | 174 +- internal/handler/committer.go | 4 +- internal/handler/committer_test.go | 4 +- internal/handler/handler.go | 6 +- internal/handler/op_committer_blob.go | 179 ++ internal/schema/proposal.go | 8 - internal/schema/proposal_status.go | 9 + internal/schema/txs_proposal.go | 24 + internal/svc/svc.go | 17 + internal/types/config.go | 20 +- internal/types/txs_root_proposal.go | 43 + pkg/b2node/b2node.go | 21 +- pkg/b2node/b2node_test.go | 30 +- pkg/b2node/committer.go | 62 + pkg/b2node/committer_test.go | 65 + pkg/beacon/l1_beacon_client_test.go | 16 + pkg/contract/op/op_committer.go | 1671 ++++++++++++++++++ pkg/contract/op/op_proposal_manager.go | 2169 ++++++++++++++++++++++++ pkg/contract/op/proposer.go | 1206 +++++++++++++ pkg/contract/{ => zk}/committer.go | 2 +- pkg/contract/{ => zk}/sequence.go | 2 +- pkg/contract/{ => zk}/verify.go | 2 +- pkg/merkle/merklenode_test.go | 18 +- 26 files changed, 5627 insertions(+), 128 deletions(-) create mode 100644 abi/OpCommitter.json create mode 100644 abi/OpProposalManager.json create mode 100644 abi/Proposer.json create mode 100644 internal/handler/op_committer_blob.go create mode 100644 internal/schema/proposal_status.go create mode 100644 internal/schema/txs_proposal.go create mode 100644 internal/types/txs_root_proposal.go create mode 100644 pkg/b2node/committer.go create mode 100644 pkg/b2node/committer_test.go create mode 100644 pkg/contract/op/op_committer.go create mode 100644 pkg/contract/op/op_proposal_manager.go create mode 100644 pkg/contract/op/proposer.go rename pkg/contract/{ => zk}/committer.go (99%) rename pkg/contract/{ => zk}/sequence.go (99%) rename pkg/contract/{ => zk}/verify.go (99%) diff --git a/abi/OpCommitter.json b/abi/OpCommitter.json new file mode 100644 index 0000000..41c041b --- /dev/null +++ b/abi/OpCommitter.json @@ -0,0 +1 @@ +[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"uint64","name":"proposalID","type":"uint64"},{"indexed":false,"internalType":"string","name":"outputRoot","type":"string"},{"indexed":false,"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"outputEndIndex","type":"uint64"}],"name":"StateRootSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"uint64","name":"proposalID","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"indexed":false,"internalType":"string","name":"txsRoot","type":"string"}],"name":"TxsRootSubmitted","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"txHash","type":"string"}],"name":"bitcoinTxHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"proposalType","type":"uint64"},{"internalType":"uint64","name":"dsType","type":"uint64"},{"internalType":"string","name":"txHash","type":"string"}],"name":"dsTxHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_proposer","type":"address"},{"internalType":"address","name":"_proposalManager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposalManager","outputs":[{"internalType":"contract IOpProposalManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposer","outputs":[{"internalType":"contract IProposer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proposalManager","type":"address"}],"name":"setProposalManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proposer","type":"address"}],"name":"setProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setStateRootTimeoutPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setTxsRootTimeoutPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateRootTimeoutPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"}],"name":"submitStateRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint64[]","name":"blockList","type":"uint64[]"}],"name":"submitTxsRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"proposalType","type":"uint64"}],"name":"timeoutProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txsRootTimeoutPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] diff --git a/abi/OpProposalManager.json b/abi/OpProposalManager.json new file mode 100644 index 0000000..6ed4b8b --- /dev/null +++ b/abi/OpProposalManager.json @@ -0,0 +1 @@ +[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"allBitcoinTxVotes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"proposalType","type":"uint64"}],"name":"allDSTxVotes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"allProposalVotes","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"cleanVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastStateRootProposal","outputs":[{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"string","name":"bitcoinTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"internalType":"struct OpProposal.StateRootProposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTxsRootProposal","outputs":[{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint64[]","name":"blockList","type":"uint64[]"}],"internalType":"struct OpProposal.TxsRootProposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"getStateRootProposal","outputs":[{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"string","name":"bitcoinTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"internalType":"struct OpProposal.StateRootProposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"}],"name":"getTxsRootProposal","outputs":[{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint64[]","name":"blockList","type":"uint64[]"}],"internalType":"struct OpProposal.TxsRootProposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOnStateRootDSTxPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOnStateRootProposalPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOnSubmitBitcoinTxPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOnTxsRootProposalPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"address","name":"voter","type":"address"}],"name":"isVotedOntxsRootDSTxPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastStateRootProposal","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"string","name":"bitcoinTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTxsRootProposal","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opCommitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"committer","type":"address"}],"name":"setCommitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"string","name":"bitcoinTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"internalType":"struct OpProposal.StateRootProposal","name":"proposal","type":"tuple"}],"name":"setLastStateRootProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint64[]","name":"blockList","type":"uint64[]"}],"internalType":"struct OpProposal.TxsRootProposal","name":"proposal","type":"tuple"}],"name":"setLastTxsRootProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"string","name":"bitcoinTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"internalType":"struct OpProposal.StateRootProposal","name":"proposal","type":"tuple"}],"name":"setStateRootProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"components":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint64[]","name":"blockList","type":"uint64[]"}],"internalType":"struct OpProposal.TxsRootProposal","name":"proposal","type":"tuple"}],"name":"setTxsRootProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateBitcoinTxVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateDSTxVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRootProposalVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"stateRootProposals","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"string","name":"outputRoot","type":"string"},{"internalType":"uint64","name":"startL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"endL1Timestamp","type":"uint64"},{"internalType":"uint64","name":"startL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"endL2BlockNumber","type":"uint64"},{"internalType":"uint64","name":"outputStartIndex","type":"uint64"},{"internalType":"uint64","name":"outputEndIndex","type":"uint64"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"string","name":"bitcoinTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"txsDSTxVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"txsRootProposalVotes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"txsRootProposals","outputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"uint64","name":"startBlockNumber","type":"uint64"},{"internalType":"uint64","name":"endBlockNumber","type":"uint64"},{"internalType":"string","name":"txsRoot","type":"string"},{"internalType":"uint256","name":"timeout","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint8","name":"dsType","type":"uint8"},{"internalType":"string","name":"dsTxHash","type":"string"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"proposalID","type":"uint64"},{"internalType":"uint8","name":"proposalType","type":"uint8"},{"internalType":"address","name":"voter","type":"address"},{"internalType":"address[]","name":"proposers","type":"address[]"},{"internalType":"uint8","name":"phase","type":"uint8"},{"internalType":"uint8","name":"status","type":"uint8"}],"name":"voteAndUpdateStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}] diff --git a/abi/Proposer.json b/abi/Proposer.json new file mode 100644 index 0000000..24f3098 --- /dev/null +++ b/abi/Proposer.json @@ -0,0 +1 @@ +[{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proposer","type":"address"}],"name":"addProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allProposers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isProposer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposersList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proposer","type":"address"}],"name":"removeProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index f33de92..2ec9c00 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -9,86 +9,126 @@ SET FOREIGN_KEY_CHECKS = 0; -- Table structure for sync_blocks -- ---------------------------- DROP TABLE IF EXISTS `sync_blocks`; -CREATE TABLE `sync_blocks` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `blockchain` varchar(32) NOT NULL COMMENT ' chain name', - `miner` varchar(42) NOT NULL COMMENT ' miner', - `block_time` bigint NOT NULL COMMENT ' block_time', - `block_number` bigint NOT NULL COMMENT ' block_number', - `block_hash` varchar(66) NOT NULL COMMENT ' block hash', - `tx_count` bigint NOT NULL COMMENT ' tx count', - `event_count` bigint NOT NULL COMMENT ' event count', - `parent_hash` varchar(66) NOT NULL COMMENT ' parent hash', - `status` varchar(32) NOT NULL COMMENT ' status', - `check_count` bigint NOT NULL COMMENT ' check count', - PRIMARY KEY (`id`), - KEY `status_index` (`status`), - KEY `tx_count_index` (`tx_count`), - KEY `check_count_index` (`check_count`) -) ENGINE=InnoDB AUTO_INCREMENT=2923365 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_blocks` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `blockchain` varchar(32) NOT NULL COMMENT ' chain name', + `miner` varchar(42) NOT NULL COMMENT ' miner', + `block_time` bigint NOT NULL COMMENT ' block_time', + `block_number` bigint NOT NULL COMMENT ' block_number', + `block_hash` varchar(66) NOT NULL COMMENT ' block hash', + `tx_count` bigint NOT NULL COMMENT ' tx count', + `event_count` bigint NOT NULL COMMENT ' event count', + `parent_hash` varchar(66) NOT NULL COMMENT ' parent hash', + `status` varchar(32) NOT NULL COMMENT ' status', + `check_count` bigint NOT NULL COMMENT ' check count', + PRIMARY KEY (`id`), + KEY `status_index` (`status`), + KEY `tx_count_index` (`tx_count`), + KEY `check_count_index` (`check_count`) +) ENGINE = InnoDB + AUTO_INCREMENT = 2923365 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; -- ---------------------------- -- Table structure for sync_events -- ---------------------------- DROP TABLE IF EXISTS `sync_events`; -CREATE TABLE `sync_events` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `sync_block_id` bigint NOT NULL COMMENT ' sync_block_id', - `blockchain` varchar(32) NOT NULL COMMENT ' blockchain', - `block_time` bigint NOT NULL COMMENT ' block_time', - `block_number` bigint NOT NULL COMMENT ' block_number', - `block_hash` varchar(66) NOT NULL COMMENT ' block_hash', - `block_log_indexed` bigint NOT NULL COMMENT ' block_log_indexed', - `tx_index` bigint NOT NULL COMMENT ' tx_index', - `tx_hash` varchar(66) NOT NULL COMMENT ' tx_hash', - `event_name` varchar(32) NOT NULL COMMENT ' event_name', - `event_hash` varchar(66) NOT NULL COMMENT ' event_hash', - `contract_address` varchar(42) NOT NULL COMMENT ' contract_address', - `data` json NOT NULL COMMENT ' data', - `status` varchar(32) NOT NULL COMMENT ' status', - `retry_count` bigint DEFAULT '0' COMMENT 'retry_count', - PRIMARY KEY (`id`), - KEY `status_index` (`status`) -) ENGINE=InnoDB AUTO_INCREMENT=1011299 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE `sync_events` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `sync_block_id` bigint NOT NULL COMMENT ' sync_block_id', + `blockchain` varchar(32) NOT NULL COMMENT ' blockchain', + `block_time` bigint NOT NULL COMMENT ' block_time', + `block_number` bigint NOT NULL COMMENT ' block_number', + `block_hash` varchar(66) NOT NULL COMMENT ' block_hash', + `block_log_indexed` bigint NOT NULL COMMENT ' block_log_indexed', + `tx_index` bigint NOT NULL COMMENT ' tx_index', + `tx_hash` varchar(66) NOT NULL COMMENT ' tx_hash', + `event_name` varchar(32) NOT NULL COMMENT ' event_name', + `event_hash` varchar(66) NOT NULL COMMENT ' event_hash', + `contract_address` varchar(42) NOT NULL COMMENT ' contract_address', + `data` json NOT NULL COMMENT ' data', + `status` varchar(32) NOT NULL COMMENT ' status', + `retry_count` bigint DEFAULT '0' COMMENT 'retry_count', + PRIMARY KEY (`id`), + KEY `status_index` (`status`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1011299 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `proposal`; -CREATE TABLE `proposal` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `proposal_id` bigint NOT NULL, - `state_root_hash` varchar(128) NOT NULL, - `proof_root_hash` varchar(128) NOT NULL, - `start_batch_num` bigint NOT NULL, - `end_batch_num` bigint NOT NULL, - `btc_tx_hash` varchar(128) , - `winner` varchar(128), - `status` bigint NOT NULL DEFAULT 0, - `generate_details_file` tinyint default 0 comment '0:no generate details file 1:already generate details file for uploading', +CREATE TABLE `proposal` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `proposal_id` bigint NOT NULL, + `state_root_hash` varchar(128) NOT NULL, + `proof_root_hash` varchar(128) NOT NULL, + `start_batch_num` bigint NOT NULL, + `end_batch_num` bigint NOT NULL, + `btc_tx_hash` varchar(128), + `winner` varchar(128), + `status` bigint NOT NULL DEFAULT 0, + `generate_details_file` tinyint default 0 comment '0:no generate details file 1:already generate details file for uploading', `generate_details_file_time` datetime, - `ar_tx_hash` varchar(128), + `ar_tx_hash` varchar(128), PRIMARY KEY (`id`), KEY `proposal_id_index` (`proposal_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE = InnoDB + AUTO_INCREMENT = 1000000 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `blob_info`; -CREATE TABLE `blob_info` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `block_number` bigint NOT NULL, - `block_hash_hex` varchar(128) NOT NULL, - `block_time` bigint NOT NULL COMMENT ' block_time', - `blob_versioned_hash` varchar(128) NOT NULL, - `blob_hashes_index` bigint NOT NULL, - `blob_side_car_index` bigint NOT NULL, +CREATE TABLE `blob_info` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `block_number` bigint NOT NULL, + `block_hash_hex` varchar(128) NOT NULL, + `block_time` bigint NOT NULL COMMENT ' block_time', + `blob_versioned_hash` varchar(128) NOT NULL, + `blob_hashes_index` bigint NOT NULL, + `blob_side_car_index` bigint NOT NULL, `blob_side_car_commitment` varchar(128) NOT NULL, - `blob` MEDIUMTEXT NOT NULL, + `blob` MEDIUMTEXT NOT NULL, + PRIMARY KEY (`id`), + KEY `op_blob_index` (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 1000000 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; + +DROP TABLE IF EXISTS `txs_proposal`; +CREATE TABLE `txs_proposal` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `proposal_id` bigint NOT NULL COMMENT ' proposal_id', + `start_timestamp` bigint NOT NULL COMMENT ' start_timestamp', + `end_timestamp` bigint NOT NULL COMMENT ' end_timestamp', + `start_block_number` bigint NOT NULL COMMENT ' start_block_number', + `end_block_number` bigint NOT NULL COMMENT ' end_block_number', + `txs_root` varchar(128) NOT NULL COMMENT ' txs_root', + `status` tinyint(8) NOT NULL COMMENT ' status', + `ds_type` varchar(128) NOT NULL COMMENT ' ds_type', + `ds_tx_hash` varchar(128) NOT NULL COMMENT ' ds_tx_hash', + `winner` varchar(128) NOT NULL COMMENT ' winner', + `block_list` varchar(128) NOT NULL COMMENT ' block_list', PRIMARY KEY (`id`), KEY `op_blob_index` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE = InnoDB + AUTO_INCREMENT = 1000000 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; diff --git a/internal/handler/committer.go b/internal/handler/committer.go index 5887841..a33309a 100644 --- a/internal/handler/committer.go +++ b/internal/handler/committer.go @@ -4,7 +4,7 @@ import ( "context" "encoding/hex" "fmt" - "github.com/b2network/b2committer/pkg/contract" + "github.com/b2network/b2committer/pkg/contract/zk" "strings" "time" @@ -213,7 +213,7 @@ func DecodeTransactionInputData(contractABI abi.ABI, data []byte) (map[string]in } func GetVerifyBatchesParamsByTxHash(ctx *svc.ServiceContext, txHash common.Hash) (*VerifyBatchesTrustedAggregatorParams, error) { - abiObject, err := abi.JSON(strings.NewReader(contract.VerifyMetaData.ABI)) + abiObject, err := abi.JSON(strings.NewReader(zk.VerifyMetaData.ABI)) if err != nil { return nil, fmt.Errorf("[GetVerifyBatchesParamsByTxHash] parse abi error: %s", errors.WithStack(err)) } diff --git a/internal/handler/committer_test.go b/internal/handler/committer_test.go index 4d4e559..1163ef2 100644 --- a/internal/handler/committer_test.go +++ b/internal/handler/committer_test.go @@ -4,7 +4,7 @@ import ( "context" "encoding/hex" "fmt" - "github.com/b2network/b2committer/pkg/contract" + "github.com/b2network/b2committer/pkg/contract/zk" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" @@ -25,7 +25,7 @@ func TestGetVerifyBatchesParamsByTxHash(t *testing.T) { methodSigData := tx.Data()[:4] inputsSigData := tx.Data()[4:] - abiObject, err := abi.JSON(strings.NewReader(contract.VerifyMetaData.ABI)) + abiObject, err := abi.JSON(strings.NewReader(zk.VerifyMetaData.ABI)) require.NoError(t, err) method, err := abiObject.MethodById(methodSigData) require.NoError(t, err) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 748b44b..87d9331 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -9,9 +9,9 @@ func Run(ctx *svc.ServiceContext) { // query last block number go LatestBlackNumber(ctx) // sync blocks - //go SyncBlock(ctx) - //// sync events - //go SyncEvent(ctx) + go SyncBlock(ctx) + // sync events + go SyncEvent(ctx) // query blob and store in local go QueryBlobOnChainAndStoreInLocal(ctx) // execute committer diff --git a/internal/handler/op_committer_blob.go b/internal/handler/op_committer_blob.go new file mode 100644 index 0000000..40736f0 --- /dev/null +++ b/internal/handler/op_committer_blob.go @@ -0,0 +1,179 @@ +package handler + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/contract/op" + "github.com/b2network/b2committer/pkg/log" + "github.com/b2network/b2committer/pkg/merkle" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + mt "github.com/txaty/go-merkletree" + "time" +) + +func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { + // check address + res, err := ctx.OpCommitterClient.Proposer.IsProposer(&bind.CallOpts{}, common.HexToAddress(ctx.B2NodeConfig.Address)) + if err != nil || !res { + panic(ctx.B2NodeConfig.Address + " has no right to processing, please contact admin") + } + for { + lastProposal, err := ctx.OpCommitterClient.ProposalManager.GetLastTxsRootProposal(&bind.CallOpts{}) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get last proposal from contract: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + latestProposalID := lastProposal.ProposalID + if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { + log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) + latestProposalID = latestProposalID + 1 + // submit new proposal + newTxsRootProposal, err := constructNewProposal(ctx, lastProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + + _, err = ctx.OpCommitterClient.SubmitTxsRoot(newTxsRootProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) + } + } + + if lastProposal.Status == schema.ProposalVotingStatus { + voteAddress := ctx.B2NodeConfig.Address + // check address voted or not + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(ctx.B2NodeConfig.Address)) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to find address voted or not: %s", err) + time.Sleep(3 * time.Second) + continue + } + if phase { + log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted: %s", voteAddress) + continue + } + // vote proposal return + _, err = verifyAndVotingProposal(ctx, lastProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to find address voted or not: %s", err) + } + } + + if lastProposal.Status == schema.ProposalTimeoutStatus { + proposal, err := resubmitTimeoutProposal(ctx, lastProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + + _, err = ctx.OpCommitterClient.SubmitTxsRoot(proposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) + } + } + time.Sleep(30 * time.Second) + } + +} + +func constructNewProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (*types.TxsRootProposal, error) { + var blob schema.BlobInfo + var latestEndTimestamp uint64 + var latestStartTimestamp uint64 + if lastProposal.EndBlockNumber == 0 { + // contract has no one proposal + err := ctx.DB.Order("block_number").First(&blob).Error + if err != nil { + return nil, fmt.Errorf("find original blob block error: %s", errors.WithStack(err)) + } + latestEndTimestamp = blob.BlockTime + ctx.Config.BlobIntervalTime + latestStartTimestamp = blob.BlockTime + } else { + latestStartTimestamp = lastProposal.EndTimestamp + 1 // plus 1 to exclude the last proposal end blob block + latestEndTimestamp = lastProposal.EndTimestamp + ctx.Config.BlobIntervalTime + } + + err := ctx.DB.Where("block_time > ?", latestEndTimestamp).Order("block_number").First(&blob).Error + if err != nil { + return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) + } + var blobs []schema.BlobInfo + err = ctx.DB.Where("block_time between ? and ?", latestStartTimestamp, latestEndTimestamp).Order("block_number").Find(&blobs).Error + if err != nil { + return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + return types.NewTxsRootProposal(lastProposal.ProposalID+1, blobMerkleRoot, blobs), nil +} + +func verifyAndVotingProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (bool, error) { + var blob schema.BlobInfo + err := ctx.DB.Where("block_time >= ?", lastProposal.EndTimestamp).Order("block_number").First(&blob).Error + if err != nil { + return false, fmt.Errorf("[verifyAndVotingProposal]sync blob blocks is not completed: %s", errors.WithStack(err)) + } + var blobs []schema.BlobInfo + err = ctx.DB.Where("block_time between ? and ?", lastProposal.StartTimestamp, lastProposal.EndTimestamp).Order("block_number").Find(&blobs).Error + if err != nil { + return false, fmt.Errorf("[verifyAndVotingProposal]collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + if blobMerkleRoot != lastProposal.TxsRoot { + return false, fmt.Errorf("[verifyAndVotingProposal]blobMerkleRoot verify failed") + } + voteProposal := &types.TxsRootProposal{ + ProposalID: lastProposal.ProposalID, + StartBlockNumber: lastProposal.StartBlockNumber, + EndBlockNumber: lastProposal.EndBlockNumber, + StartTimestamp: lastProposal.StartTimestamp, + EndTimestamp: lastProposal.EndTimestamp, + TxsRoot: blobMerkleRoot, + BlockList: lastProposal.BlockList, + } + + _, err = ctx.OpCommitterClient.SubmitTxsRoot(voteProposal) + if err != nil { + return false, fmt.Errorf("[verifyAndVotingProposal]vote proposal error: %s", err.Error()) + } + return true, nil +} + +func resubmitTimeoutProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (*types.TxsRootProposal, error) { + beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) + if err != nil { + return nil, fmt.Errorf("[resubmitTimeoutProposal] Try to get last proposal from contract: %s", err.Error()) + } + proposal, err := constructNewProposal(ctx, beforeLastProposal) + if err != nil { + return nil, fmt.Errorf("[resubmitTimeoutProposal] construct new proposal err: %s", err.Error()) + } + return proposal, nil +} + +func GetBlobsMerkleRoot(blobs []schema.BlobInfo) (string, error) { + if len(blobs) == 0 { + return "", fmt.Errorf("no blob data") + } + if len(blobs) == 1 { + hash := sha256.Sum256([]byte(blobs[0].Blob)) + return hex.EncodeToString(hash[:]), nil + } + newBlobRoots := make([]string, 0) + for _, blob := range blobs { + blobHash := sha256.Sum256([]byte(blob.Blob)) + newBlobRoots = append(newBlobRoots, hex.EncodeToString(blobHash[:])) + } + blobBlocks := merkle.GenerateBlocks(newBlobRoots) + blobTree, _ := mt.New(nil, blobBlocks) + return hex.EncodeToString(blobTree.Root), nil +} diff --git a/internal/schema/proposal.go b/internal/schema/proposal.go index be2dc7e..163c412 100644 --- a/internal/schema/proposal.go +++ b/internal/schema/proposal.go @@ -1,13 +1,5 @@ package schema -const ( - ProposalVotingStatus = 0 - ProposalPendingStatus = 1 - ProposalCommitting = 2 - ProposalSucceedStatus = 3 - ProposalTimeoutStatus = 4 -) - type Proposal struct { Base ProposalID uint64 `json:"proposal_id"` diff --git a/internal/schema/proposal_status.go b/internal/schema/proposal_status.go new file mode 100644 index 0000000..1358d67 --- /dev/null +++ b/internal/schema/proposal_status.go @@ -0,0 +1,9 @@ +package schema + +const ( + ProposalVotingStatus = 0 // 0 Proposer can submit proof and vote for the proposal + ProposalPendingStatus = 1 // 1 Proposer can submit decentralized storage tx for the proposal + ProposalCommitting = 2 // 2 Proposer can submit bitcoin tx for the proposal + ProposalSucceedStatus = 3 // 3 Proposal is success + ProposalTimeoutStatus = 4 // 4 Proposal is timed out +) diff --git a/internal/schema/txs_proposal.go b/internal/schema/txs_proposal.go new file mode 100644 index 0000000..de31716 --- /dev/null +++ b/internal/schema/txs_proposal.go @@ -0,0 +1,24 @@ +package schema + +import ( + "github.com/ethereum/go-ethereum/common" +) + +type TxsProposal struct { + Base + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address + BlockList []uint64 +} + +func (TxsProposal) TableName() string { + return "txs_proposal" +} diff --git a/internal/svc/svc.go b/internal/svc/svc.go index 4de98f8..596d8c6 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -5,6 +5,7 @@ import ( "github.com/b2network/b2committer/pkg/b2node" "github.com/b2network/b2committer/pkg/beacon" "github.com/b2network/b2committer/pkg/client" + "github.com/b2network/b2committer/pkg/contract/op" "github.com/b2network/b2committer/pkg/log" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" @@ -33,6 +34,7 @@ type ServiceContext struct { BlobDataSource *beacon.BlobDataSource SyncedBlobBlockNumber int64 SyncedBlobBlockHash common.Hash + OpCommitterClient *b2node.OpCommitterClient } func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2nodeConfig *types.B2NODEConfig) *ServiceContext { @@ -74,6 +76,20 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 l1BlobFetcher := sources.NewL1BeaconClient(l1Beacon, sources.L1BeaconClientConfig{FetchAllSidecars: false}) bds := beacon.NewBlobDataSource(l1Signer, common.HexToAddress(cfg.BatcherInbox), common.HexToAddress(cfg.BatcherSender), l1BlobFetcher, rpc) + proposer, err := op.NewProposer(common.HexToAddress(b2nodeConfig.OpProposersAddress), b2rpc) + if err != nil { + log.Panicf("[svc] init proposer contract panic: %s\n", err) + } + proposalManager, err := op.NewOpProposalManager(common.HexToAddress(b2nodeConfig.OpProposalManagerAddress), b2rpc) + if err != nil { + log.Panicf("[svc] init proposal manager contract panic: %s\n", err) + } + committer, err := op.NewOpCommitter(common.HexToAddress(b2nodeConfig.OpCommitterAddress), b2rpc) + if err != nil { + log.Panicf("[svc] init committer contract panic: %s\n", err) + } + opCommitterClient := b2node.NewOpCommitterClient(b2nodeConfig.PrivateKey, b2nodeConfig.ChainID, proposer, committer, proposalManager) + svc = &ServiceContext{ BTCConfig: bitcoinCfg, DB: storage, @@ -83,6 +99,7 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 B2NodeConfig: b2nodeConfig, NodeClient: nodeClient, BlobDataSource: bds, + OpCommitterClient: opCommitterClient, } return svc } diff --git a/internal/types/config.go b/internal/types/config.go index bc1ecfb..08c4389 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -21,6 +21,7 @@ type Config struct { InitBlockHash string `env:"INIT_BLOCK_HASH" envDefault:"0x9612534dc810c9c51211c77def2db781d7cc7979b0cb076a47c9fc6fb6dc475c"` InitBlobBlockNumber int64 `env:"INIT_BLOB_BLOCK_NUMBER" envDefault:"5687501"` InitBlobBlockHash string `env:"INIT_BLOB_BLOCK_HASH" envDefault:"0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee"` + BlobIntervalTime uint64 `env:"BLOB_INTERVAL_TIME" envDefault:"1800"` PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xa6AAdA6845b2083ff6812bAc773038442e7f4dE6"` PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0xDdee8ddfA81F5E36373637240038DCCC14529BF7"` L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` //sepolia @@ -34,17 +35,20 @@ type Config struct { } type B2NODEConfig struct { - ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` - RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://1rpc.io/sepolia"` - CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` - Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` - PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` + ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` + RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://1rpc.io/sepolia"` + CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` + OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x0484fE0888684b39B2cce0a1644e44dDFCAA0054"` + OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0x6bA5d52CA1B931E89611995F53dde2E1f914b0a7"` + OpProposalManagerAddress string `env:"B2NODE_OP_PROPOSAL_MANAGER_ADDRESS" envDefault:"0x1A9Df4e0949a8699739B63F0155F41e0505df593"` + Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` + PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } type BitcoinRPCConfig struct { - NetworkName string `env:"BITCOIN_NETWORK_NAME" envDefault:"signet"` - PrivateKey string `env:"BITCOIN_PRIVATE_KEY" envDefault:"c545a409ff7f2e66b4bc863a59dcccf0f4387668a92152a058446bcb58a57027"` - DestinationAddress string `env:"COMMITTER_DESTINATION_ADDRESS" envDefault:"tb1pvhr4e58yatk9uve22rr5umxs0jh9g0j0gtcj0ry2wf23lddhjptsf6c360"` + NetworkName string `env:"BITCOIN_NETWORK_NAME" envDefault:"testnet3"` + PrivateKey string `env:"BITCOIN_PRIVATE_KEY" envDefault:"55968c09fb90a496096bafdeaac0f791f527b17324d1d0e63d3550e68a7b0cc5"` + DestinationAddress string `env:"COMMITTER_DESTINATION_ADDRESS" envDefault:"tb1q6t5py7fqml8patll2jzfc26q7987xqthslyvj4"` } var ( diff --git a/internal/types/txs_root_proposal.go b/internal/types/txs_root_proposal.go new file mode 100644 index 0000000..6b529c4 --- /dev/null +++ b/internal/types/txs_root_proposal.go @@ -0,0 +1,43 @@ +package types + +import "github.com/b2network/b2committer/internal/schema" + +type TxsRootProposal struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + BlockList []uint64 +} + +func NewTxsRootProposal(proposalID uint64, txsRoot string, blobs []schema.BlobInfo) *TxsRootProposal { + proposal := &TxsRootProposal{ + ProposalID: proposalID, + TxsRoot: txsRoot, + } + fillBlockListAndBlockInfo(blobs, proposal) + return proposal +} + +func fillBlockListAndBlockInfo(blobs []schema.BlobInfo, proposal *TxsRootProposal) { + blockList := make([]uint64, 0) + + for _, blob := range blobs { + if proposal.StartBlockNumber > uint64(blob.BlockNumber) { + proposal.StartBlockNumber = uint64(blob.BlockNumber) + } + if proposal.EndBlockNumber < uint64(blob.BlockNumber) { + proposal.EndBlockNumber = uint64(blob.BlockNumber) + } + if proposal.StartTimestamp > blob.BlockTime { + proposal.StartTimestamp = blob.BlockTime + } + if proposal.EndTimestamp < blob.BlockTime { + proposal.EndTimestamp = blob.BlockTime + } + blockList = append(blockList, uint64(blob.BlockNumber)) + } + proposal.BlockList = blockList +} diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go index 0842116..07643a0 100644 --- a/pkg/b2node/b2node.go +++ b/pkg/b2node/b2node.go @@ -4,7 +4,7 @@ import ( "crypto/ecdsa" "fmt" "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/pkg/contract" + "github.com/b2network/b2committer/pkg/contract/zk" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -15,13 +15,12 @@ import ( ) type NodeClient struct { - PrivateKey *ecdsa.PrivateKey - ContractAddress string - Address string - ChainID int64 - Conn *ethclient.Client - Committer *contract.Committer - Auth *bind.TransactOpts + PrivateKey *ecdsa.PrivateKey + Address string + ChainID int64 + Conn *ethclient.Client + Committer *zk.Committer + Auth *bind.TransactOpts } func NewNodeClient(privateKeyStr string, chainID int64, address string, contractAddress string, conn *ethclient.Client) *NodeClient { @@ -30,7 +29,7 @@ func NewNodeClient(privateKeyStr string, chainID int64, address string, contract panic(err) } auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) return &NodeClient{ PrivateKey: privateKey, Address: address, @@ -71,7 +70,7 @@ func (n NodeClient) RemoveProposers(address common.Address) (*types.Transaction, return tx, nil } -func (n NodeClient) QueryLastProposal() (*contract.CommitterProposal, error) { +func (n NodeClient) QueryLastProposal() (*zk.CommitterProposal, error) { proposal, err := n.Committer.GetLastProposal(&bind.CallOpts{ From: common.HexToAddress(n.Address), }, uint64(n.ChainID)) @@ -81,7 +80,7 @@ func (n NodeClient) QueryLastProposal() (*contract.CommitterProposal, error) { return &proposal, nil } -func (n NodeClient) QueryProposalByID(id uint64) (*contract.CommitterProposal, error) { +func (n NodeClient) QueryProposalByID(id uint64) (*zk.CommitterProposal, error) { proposal, err := n.Committer.Proposal(&bind.CallOpts{ From: common.HexToAddress(n.Address), }, uint64(n.ChainID), id) diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go index 0d68874..77c5a15 100644 --- a/pkg/b2node/b2node_test.go +++ b/pkg/b2node/b2node_test.go @@ -2,7 +2,7 @@ package b2node import ( "fmt" - "github.com/b2network/b2committer/pkg/contract" + "github.com/b2network/b2committer/pkg/contract/zk" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" @@ -28,7 +28,7 @@ func TestQueryTimeoutPeriod(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) time, _ := committer.TimeoutPeriod(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), @@ -41,7 +41,7 @@ func TestSetTimeoutPeriod(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) @@ -59,7 +59,7 @@ func TestAddChain(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) @@ -77,7 +77,7 @@ func TestQueryAllChain(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) res, err := committer.AllChains(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), }) @@ -91,7 +91,7 @@ func TestAddCommitter(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) @@ -110,7 +110,7 @@ func TestQueryAllCommitter(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) res, err := committer.AllProposers(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), }) @@ -124,7 +124,7 @@ func TestRemoveCommitter(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) @@ -142,7 +142,7 @@ func TestQueryLastProposalID(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) proposal, err := committer.GetLastProposal(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), @@ -156,7 +156,7 @@ func TestQueryProposalByID(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) proposal, err := committer.Proposal(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), @@ -170,7 +170,7 @@ func TestSubmitProof(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) @@ -188,7 +188,7 @@ func TestBitcoinTxHash(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) @@ -206,7 +206,7 @@ func TestAr(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) @@ -224,7 +224,7 @@ func TestIsProposalTimeout(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) res, err := committer.IsProposalTimeout(&bind.CallOpts{ From: common.HexToAddress(creatorAddress), @@ -237,7 +237,7 @@ func TestTimeoutProposal(t *testing.T) { require.NoError(t, err) defer conn.Close() - committer, err := contract.NewCommitter(common.HexToAddress(contractAddress), conn) + committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) require.NoError(t, err) privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) diff --git a/pkg/b2node/committer.go b/pkg/b2node/committer.go new file mode 100644 index 0000000..f88c8d1 --- /dev/null +++ b/pkg/b2node/committer.go @@ -0,0 +1,62 @@ +package b2node + +import ( + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/contract/op" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "math/big" +) + +type OpCommitterClient struct { + Proposer *op.Proposer + Committer *op.OpCommitter + ProposalManager *op.OpProposalManager + Auth *bind.TransactOpts +} + +func NewOpCommitterClient(privateKeyStr string, chainID int64, proposer *op.Proposer, committer *op.OpCommitter, proposalManager *op.OpProposalManager) *OpCommitterClient { + privateKey, err := crypto.HexToECDSA(privateKeyStr) + if nil != err { + panic(err) + } + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + return &OpCommitterClient{ + Proposer: proposer, + Committer: committer, + ProposalManager: proposalManager, + Auth: auth, + } +} + +func (client *OpCommitterClient) QueryAllProposers() ([]common.Address, error) { + res, err := client.Proposer.AllProposers(&bind.CallOpts{}) + if err != nil { + return nil, err + } + return res, nil +} + +func (client *OpCommitterClient) AddProposer(address common.Address) (*ethTypes.Transaction, error) { + tx, err := client.Proposer.AddProposer(&bind.TransactOpts{ + From: client.Auth.From, + Signer: client.Auth.Signer, + }, address) + if err != nil { + return nil, err + } + return tx, nil +} + +func (client *OpCommitterClient) SubmitTxsRoot(proposal *types.TxsRootProposal) (*ethTypes.Transaction, error) { + tx, err := client.Committer.SubmitTxsRoot(&bind.TransactOpts{ + From: client.Auth.From, + Signer: client.Auth.Signer, + }, proposal.ProposalID, proposal.StartTimestamp, proposal.EndTimestamp, proposal.StartBlockNumber, proposal.EndBlockNumber, proposal.TxsRoot, proposal.BlockList) + if err != nil { + return nil, err + } + return tx, nil +} diff --git a/pkg/b2node/committer_test.go b/pkg/b2node/committer_test.go new file mode 100644 index 0000000..b7e90b6 --- /dev/null +++ b/pkg/b2node/committer_test.go @@ -0,0 +1,65 @@ +package b2node + +import ( + "fmt" + "github.com/b2network/b2committer/pkg/contract/op" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" + "testing" +) + +const ( + WalletAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" + WalletPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" + Sepolia_URL = "https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30/" + Sepolia_chainID = 11155111 + proposerContractAddress = "0x6bA5d52CA1B931E89611995F53dde2E1f914b0a7" + proposalManagerContract = "0x1A9Df4e0949a8699739B63F0155F41e0505df593" + committerContractAddress = "0x0484fE0888684b39B2cce0a1644e44dDFCAA0054" +) + +var opCommitterClient *OpCommitterClient + +func setup(t *testing.T) { + conn, err := ethclient.Dial(Sepolia_URL) + require.NoError(t, err) + defer conn.Close() + + proposer, err := op.NewProposer(common.HexToAddress(proposerContractAddress), conn) + require.NoError(t, err) + proposalManager, err := op.NewOpProposalManager(common.HexToAddress(proposalManagerContract), conn) + require.NoError(t, err) + committer, err := op.NewOpCommitter(common.HexToAddress(committerContractAddress), conn) + require.NoError(t, err) + opCommitterClient = NewOpCommitterClient(WalletPrivateKey, Sepolia_chainID, proposer, committer, proposalManager) +} + +func TestQueryAllProposals(t *testing.T) { + setup(t) + res, err := opCommitterClient.QueryAllProposers() + require.NoError(t, err) + fmt.Println(res) +} + +func TestAddProposer(t *testing.T) { + setup(t) + tx, err := opCommitterClient.AddProposer(common.HexToAddress(WalletAddress)) + require.NoError(t, err) + fmt.Println(tx) +} + +func TestIsProposer(t *testing.T) { + setup(t) + res, err := opCommitterClient.Proposer.IsProposer(&bind.CallOpts{}, common.HexToAddress(WalletAddress)) + require.NoError(t, err) + fmt.Println(res) +} + +func TestGetLastTxsRootProposal(t *testing.T) { + setup(t) + proposal, err := opCommitterClient.ProposalManager.GetLastTxsRootProposal(&bind.CallOpts{}) + require.NoError(t, err) + fmt.Println(proposal) +} diff --git a/pkg/beacon/l1_beacon_client_test.go b/pkg/beacon/l1_beacon_client_test.go index cef93dc..f98b5f9 100644 --- a/pkg/beacon/l1_beacon_client_test.go +++ b/pkg/beacon/l1_beacon_client_test.go @@ -2,15 +2,19 @@ package beacon import ( "context" + "crypto/sha256" + "encoding/hex" "fmt" "github.com/b2network/b2committer/pkg/client" "github.com/b2network/b2committer/pkg/log" + "github.com/b2network/b2committer/pkg/merkle" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" + mt "github.com/txaty/go-merkletree" "math/big" "testing" ) @@ -113,6 +117,18 @@ func TestGetBlobByBlockNum(t *testing.T) { fmt.Println(blockBlobInfo[0].Hash.Index) fmt.Println(blockBlobInfo[0].Hash.Hash) fmt.Println(blockBlobInfo[0].BlobSidecar.KZGCommitment) + //fmt.Println(blockBlobInfo[0].BlobSidecar.Blob.String()) + + hash := sha256.Sum256([]byte(blockBlobInfo[0].BlobSidecar.Blob.String())) + fmt.Println(hex.EncodeToString(hash[:])) + + newStateRoots := make([]string, 0) + newStateRoots = append(newStateRoots, hex.EncodeToString(hash[:])) + newStateRoots = append(newStateRoots, hex.EncodeToString(hash[:])) + stateBlocks := merkle.GenerateBlocks(newStateRoots) + stateTree, _ := mt.New(nil, stateBlocks) + stateRootHash := stateTree.Root + println("stateRootHash: ", hex.EncodeToString(stateRootHash)) } func TestGetBlobByBlockNumMainNet(t *testing.T) { diff --git a/pkg/contract/op/op_committer.go b/pkg/contract/op/op_committer.go new file mode 100644 index 0000000..04144dc --- /dev/null +++ b/pkg/contract/op/op_committer.go @@ -0,0 +1,1671 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package op + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// OpCommitterMetaData contains all meta data concerning the OpCommitter contract. +var OpCommitterMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"}],\"name\":\"StateRootSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"}],\"name\":\"TxsRootSubmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"bitcoinTxHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalType\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"dsType\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txHash\",\"type\":\"string\"}],\"name\":\"dsTxHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_proposalManager\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalManager\",\"outputs\":[{\"internalType\":\"contractIOpProposalManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposer\",\"outputs\":[{\"internalType\":\"contractIProposer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proposalManager\",\"type\":\"address\"}],\"name\":\"setProposalManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"}],\"name\":\"setProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setStateRootTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"name\":\"setTxsRootTimeoutPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stateRootTimeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"}],\"name\":\"submitStateRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint64[]\",\"name\":\"blockList\",\"type\":\"uint64[]\"}],\"name\":\"submitTxsRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalType\",\"type\":\"uint64\"}],\"name\":\"timeoutProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"txsRootTimeoutPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// OpCommitterABI is the input ABI used to generate the binding from. +// Deprecated: Use OpCommitterMetaData.ABI instead. +var OpCommitterABI = OpCommitterMetaData.ABI + +// OpCommitter is an auto generated Go binding around an Ethereum contract. +type OpCommitter struct { + OpCommitterCaller // Read-only binding to the contract + OpCommitterTransactor // Write-only binding to the contract + OpCommitterFilterer // Log filterer for contract events +} + +// OpCommitterCaller is an auto generated read-only Go binding around an Ethereum contract. +type OpCommitterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OpCommitterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type OpCommitterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OpCommitterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type OpCommitterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OpCommitterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type OpCommitterSession struct { + Contract *OpCommitter // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// OpCommitterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type OpCommitterCallerSession struct { + Contract *OpCommitterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// OpCommitterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type OpCommitterTransactorSession struct { + Contract *OpCommitterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// OpCommitterRaw is an auto generated low-level Go binding around an Ethereum contract. +type OpCommitterRaw struct { + Contract *OpCommitter // Generic contract binding to access the raw methods on +} + +// OpCommitterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type OpCommitterCallerRaw struct { + Contract *OpCommitterCaller // Generic read-only contract binding to access the raw methods on +} + +// OpCommitterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type OpCommitterTransactorRaw struct { + Contract *OpCommitterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewOpCommitter creates a new instance of OpCommitter, bound to a specific deployed contract. +func NewOpCommitter(address common.Address, backend bind.ContractBackend) (*OpCommitter, error) { + contract, err := bindOpCommitter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &OpCommitter{OpCommitterCaller: OpCommitterCaller{contract: contract}, OpCommitterTransactor: OpCommitterTransactor{contract: contract}, OpCommitterFilterer: OpCommitterFilterer{contract: contract}}, nil +} + +// NewOpCommitterCaller creates a new read-only instance of OpCommitter, bound to a specific deployed contract. +func NewOpCommitterCaller(address common.Address, caller bind.ContractCaller) (*OpCommitterCaller, error) { + contract, err := bindOpCommitter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &OpCommitterCaller{contract: contract}, nil +} + +// NewOpCommitterTransactor creates a new write-only instance of OpCommitter, bound to a specific deployed contract. +func NewOpCommitterTransactor(address common.Address, transactor bind.ContractTransactor) (*OpCommitterTransactor, error) { + contract, err := bindOpCommitter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &OpCommitterTransactor{contract: contract}, nil +} + +// NewOpCommitterFilterer creates a new log filterer instance of OpCommitter, bound to a specific deployed contract. +func NewOpCommitterFilterer(address common.Address, filterer bind.ContractFilterer) (*OpCommitterFilterer, error) { + contract, err := bindOpCommitter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &OpCommitterFilterer{contract: contract}, nil +} + +// bindOpCommitter binds a generic wrapper to an already deployed contract. +func bindOpCommitter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := OpCommitterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_OpCommitter *OpCommitterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OpCommitter.Contract.OpCommitterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_OpCommitter *OpCommitterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OpCommitter.Contract.OpCommitterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_OpCommitter *OpCommitterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OpCommitter.Contract.OpCommitterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_OpCommitter *OpCommitterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OpCommitter.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_OpCommitter *OpCommitterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OpCommitter.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_OpCommitter *OpCommitterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OpCommitter.Contract.contract.Transact(opts, method, params...) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_OpCommitter *OpCommitterCaller) ADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_OpCommitter *OpCommitterSession) ADMINROLE() ([32]byte, error) { + return _OpCommitter.Contract.ADMINROLE(&_OpCommitter.CallOpts) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_OpCommitter *OpCommitterCallerSession) ADMINROLE() ([32]byte, error) { + return _OpCommitter.Contract.ADMINROLE(&_OpCommitter.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_OpCommitter *OpCommitterCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "DEFAULT_ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_OpCommitter *OpCommitterSession) DEFAULTADMINROLE() ([32]byte, error) { + return _OpCommitter.Contract.DEFAULTADMINROLE(&_OpCommitter.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_OpCommitter *OpCommitterCallerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _OpCommitter.Contract.DEFAULTADMINROLE(&_OpCommitter.CallOpts) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_OpCommitter *OpCommitterCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "getRoleAdmin", role) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_OpCommitter *OpCommitterSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _OpCommitter.Contract.GetRoleAdmin(&_OpCommitter.CallOpts, role) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_OpCommitter *OpCommitterCallerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _OpCommitter.Contract.GetRoleAdmin(&_OpCommitter.CallOpts, role) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_OpCommitter *OpCommitterCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "hasRole", role, account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_OpCommitter *OpCommitterSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _OpCommitter.Contract.HasRole(&_OpCommitter.CallOpts, role, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_OpCommitter *OpCommitterCallerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _OpCommitter.Contract.HasRole(&_OpCommitter.CallOpts, role, account) +} + +// ProposalManager is a free data retrieval call binding the contract method 0x02f89be2. +// +// Solidity: function proposalManager() view returns(address) +func (_OpCommitter *OpCommitterCaller) ProposalManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "proposalManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ProposalManager is a free data retrieval call binding the contract method 0x02f89be2. +// +// Solidity: function proposalManager() view returns(address) +func (_OpCommitter *OpCommitterSession) ProposalManager() (common.Address, error) { + return _OpCommitter.Contract.ProposalManager(&_OpCommitter.CallOpts) +} + +// ProposalManager is a free data retrieval call binding the contract method 0x02f89be2. +// +// Solidity: function proposalManager() view returns(address) +func (_OpCommitter *OpCommitterCallerSession) ProposalManager() (common.Address, error) { + return _OpCommitter.Contract.ProposalManager(&_OpCommitter.CallOpts) +} + +// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90. +// +// Solidity: function proposer() view returns(address) +func (_OpCommitter *OpCommitterCaller) Proposer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "proposer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90. +// +// Solidity: function proposer() view returns(address) +func (_OpCommitter *OpCommitterSession) Proposer() (common.Address, error) { + return _OpCommitter.Contract.Proposer(&_OpCommitter.CallOpts) +} + +// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90. +// +// Solidity: function proposer() view returns(address) +func (_OpCommitter *OpCommitterCallerSession) Proposer() (common.Address, error) { + return _OpCommitter.Contract.Proposer(&_OpCommitter.CallOpts) +} + +// StateRootTimeoutPeriod is a free data retrieval call binding the contract method 0x77361d85. +// +// Solidity: function stateRootTimeoutPeriod() view returns(uint256) +func (_OpCommitter *OpCommitterCaller) StateRootTimeoutPeriod(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "stateRootTimeoutPeriod") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// StateRootTimeoutPeriod is a free data retrieval call binding the contract method 0x77361d85. +// +// Solidity: function stateRootTimeoutPeriod() view returns(uint256) +func (_OpCommitter *OpCommitterSession) StateRootTimeoutPeriod() (*big.Int, error) { + return _OpCommitter.Contract.StateRootTimeoutPeriod(&_OpCommitter.CallOpts) +} + +// StateRootTimeoutPeriod is a free data retrieval call binding the contract method 0x77361d85. +// +// Solidity: function stateRootTimeoutPeriod() view returns(uint256) +func (_OpCommitter *OpCommitterCallerSession) StateRootTimeoutPeriod() (*big.Int, error) { + return _OpCommitter.Contract.StateRootTimeoutPeriod(&_OpCommitter.CallOpts) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_OpCommitter *OpCommitterCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_OpCommitter *OpCommitterSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _OpCommitter.Contract.SupportsInterface(&_OpCommitter.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_OpCommitter *OpCommitterCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _OpCommitter.Contract.SupportsInterface(&_OpCommitter.CallOpts, interfaceId) +} + +// TxsRootTimeoutPeriod is a free data retrieval call binding the contract method 0x15c4441f. +// +// Solidity: function txsRootTimeoutPeriod() view returns(uint256) +func (_OpCommitter *OpCommitterCaller) TxsRootTimeoutPeriod(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _OpCommitter.contract.Call(opts, &out, "txsRootTimeoutPeriod") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TxsRootTimeoutPeriod is a free data retrieval call binding the contract method 0x15c4441f. +// +// Solidity: function txsRootTimeoutPeriod() view returns(uint256) +func (_OpCommitter *OpCommitterSession) TxsRootTimeoutPeriod() (*big.Int, error) { + return _OpCommitter.Contract.TxsRootTimeoutPeriod(&_OpCommitter.CallOpts) +} + +// TxsRootTimeoutPeriod is a free data retrieval call binding the contract method 0x15c4441f. +// +// Solidity: function txsRootTimeoutPeriod() view returns(uint256) +func (_OpCommitter *OpCommitterCallerSession) TxsRootTimeoutPeriod() (*big.Int, error) { + return _OpCommitter.Contract.TxsRootTimeoutPeriod(&_OpCommitter.CallOpts) +} + +// BitcoinTxHash is a paid mutator transaction binding the contract method 0xa5772e5e. +// +// Solidity: function bitcoinTxHash(uint64 proposalID, string txHash) returns() +func (_OpCommitter *OpCommitterTransactor) BitcoinTxHash(opts *bind.TransactOpts, proposalID uint64, txHash string) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "bitcoinTxHash", proposalID, txHash) +} + +// BitcoinTxHash is a paid mutator transaction binding the contract method 0xa5772e5e. +// +// Solidity: function bitcoinTxHash(uint64 proposalID, string txHash) returns() +func (_OpCommitter *OpCommitterSession) BitcoinTxHash(proposalID uint64, txHash string) (*types.Transaction, error) { + return _OpCommitter.Contract.BitcoinTxHash(&_OpCommitter.TransactOpts, proposalID, txHash) +} + +// BitcoinTxHash is a paid mutator transaction binding the contract method 0xa5772e5e. +// +// Solidity: function bitcoinTxHash(uint64 proposalID, string txHash) returns() +func (_OpCommitter *OpCommitterTransactorSession) BitcoinTxHash(proposalID uint64, txHash string) (*types.Transaction, error) { + return _OpCommitter.Contract.BitcoinTxHash(&_OpCommitter.TransactOpts, proposalID, txHash) +} + +// DsTxHash is a paid mutator transaction binding the contract method 0xe61bd62f. +// +// Solidity: function dsTxHash(uint64 proposalID, uint64 proposalType, uint64 dsType, string txHash) returns() +func (_OpCommitter *OpCommitterTransactor) DsTxHash(opts *bind.TransactOpts, proposalID uint64, proposalType uint64, dsType uint64, txHash string) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "dsTxHash", proposalID, proposalType, dsType, txHash) +} + +// DsTxHash is a paid mutator transaction binding the contract method 0xe61bd62f. +// +// Solidity: function dsTxHash(uint64 proposalID, uint64 proposalType, uint64 dsType, string txHash) returns() +func (_OpCommitter *OpCommitterSession) DsTxHash(proposalID uint64, proposalType uint64, dsType uint64, txHash string) (*types.Transaction, error) { + return _OpCommitter.Contract.DsTxHash(&_OpCommitter.TransactOpts, proposalID, proposalType, dsType, txHash) +} + +// DsTxHash is a paid mutator transaction binding the contract method 0xe61bd62f. +// +// Solidity: function dsTxHash(uint64 proposalID, uint64 proposalType, uint64 dsType, string txHash) returns() +func (_OpCommitter *OpCommitterTransactorSession) DsTxHash(proposalID uint64, proposalType uint64, dsType uint64, txHash string) (*types.Transaction, error) { + return _OpCommitter.Contract.DsTxHash(&_OpCommitter.TransactOpts, proposalID, proposalType, dsType, txHash) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_OpCommitter *OpCommitterTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "grantRole", role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_OpCommitter *OpCommitterSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.GrantRole(&_OpCommitter.TransactOpts, role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_OpCommitter *OpCommitterTransactorSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.GrantRole(&_OpCommitter.TransactOpts, role, account) +} + +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// +// Solidity: function initialize(address _proposer, address _proposalManager) returns() +func (_OpCommitter *OpCommitterTransactor) Initialize(opts *bind.TransactOpts, _proposer common.Address, _proposalManager common.Address) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "initialize", _proposer, _proposalManager) +} + +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// +// Solidity: function initialize(address _proposer, address _proposalManager) returns() +func (_OpCommitter *OpCommitterSession) Initialize(_proposer common.Address, _proposalManager common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.Initialize(&_OpCommitter.TransactOpts, _proposer, _proposalManager) +} + +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// +// Solidity: function initialize(address _proposer, address _proposalManager) returns() +func (_OpCommitter *OpCommitterTransactorSession) Initialize(_proposer common.Address, _proposalManager common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.Initialize(&_OpCommitter.TransactOpts, _proposer, _proposalManager) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_OpCommitter *OpCommitterTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "renounceRole", role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_OpCommitter *OpCommitterSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.RenounceRole(&_OpCommitter.TransactOpts, role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_OpCommitter *OpCommitterTransactorSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.RenounceRole(&_OpCommitter.TransactOpts, role, callerConfirmation) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_OpCommitter *OpCommitterTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "revokeRole", role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_OpCommitter *OpCommitterSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.RevokeRole(&_OpCommitter.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_OpCommitter *OpCommitterTransactorSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.RevokeRole(&_OpCommitter.TransactOpts, role, account) +} + +// SetProposalManager is a paid mutator transaction binding the contract method 0x25023f0b. +// +// Solidity: function setProposalManager(address _proposalManager) returns() +func (_OpCommitter *OpCommitterTransactor) SetProposalManager(opts *bind.TransactOpts, _proposalManager common.Address) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "setProposalManager", _proposalManager) +} + +// SetProposalManager is a paid mutator transaction binding the contract method 0x25023f0b. +// +// Solidity: function setProposalManager(address _proposalManager) returns() +func (_OpCommitter *OpCommitterSession) SetProposalManager(_proposalManager common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.SetProposalManager(&_OpCommitter.TransactOpts, _proposalManager) +} + +// SetProposalManager is a paid mutator transaction binding the contract method 0x25023f0b. +// +// Solidity: function setProposalManager(address _proposalManager) returns() +func (_OpCommitter *OpCommitterTransactorSession) SetProposalManager(_proposalManager common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.SetProposalManager(&_OpCommitter.TransactOpts, _proposalManager) +} + +// SetProposer is a paid mutator transaction binding the contract method 0x1fb4a228. +// +// Solidity: function setProposer(address _proposer) returns() +func (_OpCommitter *OpCommitterTransactor) SetProposer(opts *bind.TransactOpts, _proposer common.Address) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "setProposer", _proposer) +} + +// SetProposer is a paid mutator transaction binding the contract method 0x1fb4a228. +// +// Solidity: function setProposer(address _proposer) returns() +func (_OpCommitter *OpCommitterSession) SetProposer(_proposer common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.SetProposer(&_OpCommitter.TransactOpts, _proposer) +} + +// SetProposer is a paid mutator transaction binding the contract method 0x1fb4a228. +// +// Solidity: function setProposer(address _proposer) returns() +func (_OpCommitter *OpCommitterTransactorSession) SetProposer(_proposer common.Address) (*types.Transaction, error) { + return _OpCommitter.Contract.SetProposer(&_OpCommitter.TransactOpts, _proposer) +} + +// SetStateRootTimeoutPeriod is a paid mutator transaction binding the contract method 0x6ed9808a. +// +// Solidity: function setStateRootTimeoutPeriod(uint256 period) returns() +func (_OpCommitter *OpCommitterTransactor) SetStateRootTimeoutPeriod(opts *bind.TransactOpts, period *big.Int) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "setStateRootTimeoutPeriod", period) +} + +// SetStateRootTimeoutPeriod is a paid mutator transaction binding the contract method 0x6ed9808a. +// +// Solidity: function setStateRootTimeoutPeriod(uint256 period) returns() +func (_OpCommitter *OpCommitterSession) SetStateRootTimeoutPeriod(period *big.Int) (*types.Transaction, error) { + return _OpCommitter.Contract.SetStateRootTimeoutPeriod(&_OpCommitter.TransactOpts, period) +} + +// SetStateRootTimeoutPeriod is a paid mutator transaction binding the contract method 0x6ed9808a. +// +// Solidity: function setStateRootTimeoutPeriod(uint256 period) returns() +func (_OpCommitter *OpCommitterTransactorSession) SetStateRootTimeoutPeriod(period *big.Int) (*types.Transaction, error) { + return _OpCommitter.Contract.SetStateRootTimeoutPeriod(&_OpCommitter.TransactOpts, period) +} + +// SetTxsRootTimeoutPeriod is a paid mutator transaction binding the contract method 0x23f7743d. +// +// Solidity: function setTxsRootTimeoutPeriod(uint256 period) returns() +func (_OpCommitter *OpCommitterTransactor) SetTxsRootTimeoutPeriod(opts *bind.TransactOpts, period *big.Int) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "setTxsRootTimeoutPeriod", period) +} + +// SetTxsRootTimeoutPeriod is a paid mutator transaction binding the contract method 0x23f7743d. +// +// Solidity: function setTxsRootTimeoutPeriod(uint256 period) returns() +func (_OpCommitter *OpCommitterSession) SetTxsRootTimeoutPeriod(period *big.Int) (*types.Transaction, error) { + return _OpCommitter.Contract.SetTxsRootTimeoutPeriod(&_OpCommitter.TransactOpts, period) +} + +// SetTxsRootTimeoutPeriod is a paid mutator transaction binding the contract method 0x23f7743d. +// +// Solidity: function setTxsRootTimeoutPeriod(uint256 period) returns() +func (_OpCommitter *OpCommitterTransactorSession) SetTxsRootTimeoutPeriod(period *big.Int) (*types.Transaction, error) { + return _OpCommitter.Contract.SetTxsRootTimeoutPeriod(&_OpCommitter.TransactOpts, period) +} + +// SubmitStateRoot is a paid mutator transaction binding the contract method 0xc7b41985. +// +// Solidity: function submitStateRoot(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex) returns() +func (_OpCommitter *OpCommitterTransactor) SubmitStateRoot(opts *bind.TransactOpts, proposalID uint64, outputRoot string, startL1Timestamp uint64, endL1Timestamp uint64, startL2BlockNumber uint64, endL2BlockNumber uint64, outputStartIndex uint64, outputEndIndex uint64) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "submitStateRoot", proposalID, outputRoot, startL1Timestamp, endL1Timestamp, startL2BlockNumber, endL2BlockNumber, outputStartIndex, outputEndIndex) +} + +// SubmitStateRoot is a paid mutator transaction binding the contract method 0xc7b41985. +// +// Solidity: function submitStateRoot(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex) returns() +func (_OpCommitter *OpCommitterSession) SubmitStateRoot(proposalID uint64, outputRoot string, startL1Timestamp uint64, endL1Timestamp uint64, startL2BlockNumber uint64, endL2BlockNumber uint64, outputStartIndex uint64, outputEndIndex uint64) (*types.Transaction, error) { + return _OpCommitter.Contract.SubmitStateRoot(&_OpCommitter.TransactOpts, proposalID, outputRoot, startL1Timestamp, endL1Timestamp, startL2BlockNumber, endL2BlockNumber, outputStartIndex, outputEndIndex) +} + +// SubmitStateRoot is a paid mutator transaction binding the contract method 0xc7b41985. +// +// Solidity: function submitStateRoot(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex) returns() +func (_OpCommitter *OpCommitterTransactorSession) SubmitStateRoot(proposalID uint64, outputRoot string, startL1Timestamp uint64, endL1Timestamp uint64, startL2BlockNumber uint64, endL2BlockNumber uint64, outputStartIndex uint64, outputEndIndex uint64) (*types.Transaction, error) { + return _OpCommitter.Contract.SubmitStateRoot(&_OpCommitter.TransactOpts, proposalID, outputRoot, startL1Timestamp, endL1Timestamp, startL2BlockNumber, endL2BlockNumber, outputStartIndex, outputEndIndex) +} + +// SubmitTxsRoot is a paid mutator transaction binding the contract method 0xc4bd5e19. +// +// Solidity: function submitTxsRoot(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint64[] blockList) returns() +func (_OpCommitter *OpCommitterTransactor) SubmitTxsRoot(opts *bind.TransactOpts, proposalID uint64, startTimestamp uint64, endTimestamp uint64, startBlockNumber uint64, endBlockNumber uint64, txsRoot string, blockList []uint64) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "submitTxsRoot", proposalID, startTimestamp, endTimestamp, startBlockNumber, endBlockNumber, txsRoot, blockList) +} + +// SubmitTxsRoot is a paid mutator transaction binding the contract method 0xc4bd5e19. +// +// Solidity: function submitTxsRoot(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint64[] blockList) returns() +func (_OpCommitter *OpCommitterSession) SubmitTxsRoot(proposalID uint64, startTimestamp uint64, endTimestamp uint64, startBlockNumber uint64, endBlockNumber uint64, txsRoot string, blockList []uint64) (*types.Transaction, error) { + return _OpCommitter.Contract.SubmitTxsRoot(&_OpCommitter.TransactOpts, proposalID, startTimestamp, endTimestamp, startBlockNumber, endBlockNumber, txsRoot, blockList) +} + +// SubmitTxsRoot is a paid mutator transaction binding the contract method 0xc4bd5e19. +// +// Solidity: function submitTxsRoot(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint64[] blockList) returns() +func (_OpCommitter *OpCommitterTransactorSession) SubmitTxsRoot(proposalID uint64, startTimestamp uint64, endTimestamp uint64, startBlockNumber uint64, endBlockNumber uint64, txsRoot string, blockList []uint64) (*types.Transaction, error) { + return _OpCommitter.Contract.SubmitTxsRoot(&_OpCommitter.TransactOpts, proposalID, startTimestamp, endTimestamp, startBlockNumber, endBlockNumber, txsRoot, blockList) +} + +// TimeoutProposal is a paid mutator transaction binding the contract method 0x04956a75. +// +// Solidity: function timeoutProposal(uint64 proposalID, uint64 proposalType) returns() +func (_OpCommitter *OpCommitterTransactor) TimeoutProposal(opts *bind.TransactOpts, proposalID uint64, proposalType uint64) (*types.Transaction, error) { + return _OpCommitter.contract.Transact(opts, "timeoutProposal", proposalID, proposalType) +} + +// TimeoutProposal is a paid mutator transaction binding the contract method 0x04956a75. +// +// Solidity: function timeoutProposal(uint64 proposalID, uint64 proposalType) returns() +func (_OpCommitter *OpCommitterSession) TimeoutProposal(proposalID uint64, proposalType uint64) (*types.Transaction, error) { + return _OpCommitter.Contract.TimeoutProposal(&_OpCommitter.TransactOpts, proposalID, proposalType) +} + +// TimeoutProposal is a paid mutator transaction binding the contract method 0x04956a75. +// +// Solidity: function timeoutProposal(uint64 proposalID, uint64 proposalType) returns() +func (_OpCommitter *OpCommitterTransactorSession) TimeoutProposal(proposalID uint64, proposalType uint64) (*types.Transaction, error) { + return _OpCommitter.Contract.TimeoutProposal(&_OpCommitter.TransactOpts, proposalID, proposalType) +} + +// OpCommitterInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OpCommitter contract. +type OpCommitterInitializedIterator struct { + Event *OpCommitterInitialized // 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 *OpCommitterInitializedIterator) 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(OpCommitterInitialized) + 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(OpCommitterInitialized) + 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 *OpCommitterInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpCommitterInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpCommitterInitialized represents a Initialized event raised by the OpCommitter contract. +type OpCommitterInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_OpCommitter *OpCommitterFilterer) FilterInitialized(opts *bind.FilterOpts) (*OpCommitterInitializedIterator, error) { + + logs, sub, err := _OpCommitter.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &OpCommitterInitializedIterator{contract: _OpCommitter.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_OpCommitter *OpCommitterFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OpCommitterInitialized) (event.Subscription, error) { + + logs, sub, err := _OpCommitter.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OpCommitterInitialized) + if err := _OpCommitter.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_OpCommitter *OpCommitterFilterer) ParseInitialized(log types.Log) (*OpCommitterInitialized, error) { + event := new(OpCommitterInitialized) + if err := _OpCommitter.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpCommitterRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the OpCommitter contract. +type OpCommitterRoleAdminChangedIterator struct { + Event *OpCommitterRoleAdminChanged // 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 *OpCommitterRoleAdminChangedIterator) 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(OpCommitterRoleAdminChanged) + 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(OpCommitterRoleAdminChanged) + 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 *OpCommitterRoleAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpCommitterRoleAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpCommitterRoleAdminChanged represents a RoleAdminChanged event raised by the OpCommitter contract. +type OpCommitterRoleAdminChanged struct { + Role [32]byte + PreviousAdminRole [32]byte + NewAdminRole [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_OpCommitter *OpCommitterFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*OpCommitterRoleAdminChangedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _OpCommitter.contract.FilterLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return &OpCommitterRoleAdminChangedIterator{contract: _OpCommitter.contract, event: "RoleAdminChanged", logs: logs, sub: sub}, nil +} + +// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_OpCommitter *OpCommitterFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *OpCommitterRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _OpCommitter.contract.WatchLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + 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(OpCommitterRoleAdminChanged) + if err := _OpCommitter.contract.UnpackLog(event, "RoleAdminChanged", 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 +} + +// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_OpCommitter *OpCommitterFilterer) ParseRoleAdminChanged(log types.Log) (*OpCommitterRoleAdminChanged, error) { + event := new(OpCommitterRoleAdminChanged) + if err := _OpCommitter.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpCommitterRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the OpCommitter contract. +type OpCommitterRoleGrantedIterator struct { + Event *OpCommitterRoleGranted // 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 *OpCommitterRoleGrantedIterator) 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(OpCommitterRoleGranted) + 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(OpCommitterRoleGranted) + 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 *OpCommitterRoleGrantedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpCommitterRoleGrantedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpCommitterRoleGranted represents a RoleGranted event raised by the OpCommitter contract. +type OpCommitterRoleGranted struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpCommitter *OpCommitterFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*OpCommitterRoleGrantedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpCommitter.contract.FilterLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &OpCommitterRoleGrantedIterator{contract: _OpCommitter.contract, event: "RoleGranted", logs: logs, sub: sub}, nil +} + +// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpCommitter *OpCommitterFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *OpCommitterRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpCommitter.contract.WatchLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OpCommitterRoleGranted) + if err := _OpCommitter.contract.UnpackLog(event, "RoleGranted", 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 +} + +// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpCommitter *OpCommitterFilterer) ParseRoleGranted(log types.Log) (*OpCommitterRoleGranted, error) { + event := new(OpCommitterRoleGranted) + if err := _OpCommitter.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpCommitterRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the OpCommitter contract. +type OpCommitterRoleRevokedIterator struct { + Event *OpCommitterRoleRevoked // 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 *OpCommitterRoleRevokedIterator) 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(OpCommitterRoleRevoked) + 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(OpCommitterRoleRevoked) + 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 *OpCommitterRoleRevokedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpCommitterRoleRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpCommitterRoleRevoked represents a RoleRevoked event raised by the OpCommitter contract. +type OpCommitterRoleRevoked struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpCommitter *OpCommitterFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*OpCommitterRoleRevokedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpCommitter.contract.FilterLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &OpCommitterRoleRevokedIterator{contract: _OpCommitter.contract, event: "RoleRevoked", logs: logs, sub: sub}, nil +} + +// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpCommitter *OpCommitterFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *OpCommitterRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpCommitter.contract.WatchLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OpCommitterRoleRevoked) + if err := _OpCommitter.contract.UnpackLog(event, "RoleRevoked", 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 +} + +// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpCommitter *OpCommitterFilterer) ParseRoleRevoked(log types.Log) (*OpCommitterRoleRevoked, error) { + event := new(OpCommitterRoleRevoked) + if err := _OpCommitter.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpCommitterStateRootSubmittedIterator is returned from FilterStateRootSubmitted and is used to iterate over the raw logs and unpacked data for StateRootSubmitted events raised by the OpCommitter contract. +type OpCommitterStateRootSubmittedIterator struct { + Event *OpCommitterStateRootSubmitted // 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 *OpCommitterStateRootSubmittedIterator) 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(OpCommitterStateRootSubmitted) + 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(OpCommitterStateRootSubmitted) + 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 *OpCommitterStateRootSubmittedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpCommitterStateRootSubmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpCommitterStateRootSubmitted represents a StateRootSubmitted event raised by the OpCommitter contract. +type OpCommitterStateRootSubmitted struct { + Proposer common.Address + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStateRootSubmitted is a free log retrieval operation binding the contract event 0x1c0e748730db48af63aa72cf24a6070a26522decb8e17f58bd44ed079be45804. +// +// Solidity: event StateRootSubmitted(address indexed proposer, uint64 indexed proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex) +func (_OpCommitter *OpCommitterFilterer) FilterStateRootSubmitted(opts *bind.FilterOpts, proposer []common.Address, proposalID []uint64) (*OpCommitterStateRootSubmittedIterator, error) { + + var proposerRule []interface{} + for _, proposerItem := range proposer { + proposerRule = append(proposerRule, proposerItem) + } + var proposalIDRule []interface{} + for _, proposalIDItem := range proposalID { + proposalIDRule = append(proposalIDRule, proposalIDItem) + } + + logs, sub, err := _OpCommitter.contract.FilterLogs(opts, "StateRootSubmitted", proposerRule, proposalIDRule) + if err != nil { + return nil, err + } + return &OpCommitterStateRootSubmittedIterator{contract: _OpCommitter.contract, event: "StateRootSubmitted", logs: logs, sub: sub}, nil +} + +// WatchStateRootSubmitted is a free log subscription operation binding the contract event 0x1c0e748730db48af63aa72cf24a6070a26522decb8e17f58bd44ed079be45804. +// +// Solidity: event StateRootSubmitted(address indexed proposer, uint64 indexed proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex) +func (_OpCommitter *OpCommitterFilterer) WatchStateRootSubmitted(opts *bind.WatchOpts, sink chan<- *OpCommitterStateRootSubmitted, proposer []common.Address, proposalID []uint64) (event.Subscription, error) { + + var proposerRule []interface{} + for _, proposerItem := range proposer { + proposerRule = append(proposerRule, proposerItem) + } + var proposalIDRule []interface{} + for _, proposalIDItem := range proposalID { + proposalIDRule = append(proposalIDRule, proposalIDItem) + } + + logs, sub, err := _OpCommitter.contract.WatchLogs(opts, "StateRootSubmitted", proposerRule, proposalIDRule) + 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(OpCommitterStateRootSubmitted) + if err := _OpCommitter.contract.UnpackLog(event, "StateRootSubmitted", 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 +} + +// ParseStateRootSubmitted is a log parse operation binding the contract event 0x1c0e748730db48af63aa72cf24a6070a26522decb8e17f58bd44ed079be45804. +// +// Solidity: event StateRootSubmitted(address indexed proposer, uint64 indexed proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex) +func (_OpCommitter *OpCommitterFilterer) ParseStateRootSubmitted(log types.Log) (*OpCommitterStateRootSubmitted, error) { + event := new(OpCommitterStateRootSubmitted) + if err := _OpCommitter.contract.UnpackLog(event, "StateRootSubmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpCommitterTxsRootSubmittedIterator is returned from FilterTxsRootSubmitted and is used to iterate over the raw logs and unpacked data for TxsRootSubmitted events raised by the OpCommitter contract. +type OpCommitterTxsRootSubmittedIterator struct { + Event *OpCommitterTxsRootSubmitted // 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 *OpCommitterTxsRootSubmittedIterator) 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(OpCommitterTxsRootSubmitted) + 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(OpCommitterTxsRootSubmitted) + 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 *OpCommitterTxsRootSubmittedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpCommitterTxsRootSubmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpCommitterTxsRootSubmitted represents a TxsRootSubmitted event raised by the OpCommitter contract. +type OpCommitterTxsRootSubmitted struct { + Proposer common.Address + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTxsRootSubmitted is a free log retrieval operation binding the contract event 0x3ef8030bfab26ec3eaa1bb9e561677860e6794684c43e6b8a5bb50729281abad. +// +// Solidity: event TxsRootSubmitted(address indexed proposer, uint64 indexed proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot) +func (_OpCommitter *OpCommitterFilterer) FilterTxsRootSubmitted(opts *bind.FilterOpts, proposer []common.Address, proposalID []uint64) (*OpCommitterTxsRootSubmittedIterator, error) { + + var proposerRule []interface{} + for _, proposerItem := range proposer { + proposerRule = append(proposerRule, proposerItem) + } + var proposalIDRule []interface{} + for _, proposalIDItem := range proposalID { + proposalIDRule = append(proposalIDRule, proposalIDItem) + } + + logs, sub, err := _OpCommitter.contract.FilterLogs(opts, "TxsRootSubmitted", proposerRule, proposalIDRule) + if err != nil { + return nil, err + } + return &OpCommitterTxsRootSubmittedIterator{contract: _OpCommitter.contract, event: "TxsRootSubmitted", logs: logs, sub: sub}, nil +} + +// WatchTxsRootSubmitted is a free log subscription operation binding the contract event 0x3ef8030bfab26ec3eaa1bb9e561677860e6794684c43e6b8a5bb50729281abad. +// +// Solidity: event TxsRootSubmitted(address indexed proposer, uint64 indexed proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot) +func (_OpCommitter *OpCommitterFilterer) WatchTxsRootSubmitted(opts *bind.WatchOpts, sink chan<- *OpCommitterTxsRootSubmitted, proposer []common.Address, proposalID []uint64) (event.Subscription, error) { + + var proposerRule []interface{} + for _, proposerItem := range proposer { + proposerRule = append(proposerRule, proposerItem) + } + var proposalIDRule []interface{} + for _, proposalIDItem := range proposalID { + proposalIDRule = append(proposalIDRule, proposalIDItem) + } + + logs, sub, err := _OpCommitter.contract.WatchLogs(opts, "TxsRootSubmitted", proposerRule, proposalIDRule) + 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(OpCommitterTxsRootSubmitted) + if err := _OpCommitter.contract.UnpackLog(event, "TxsRootSubmitted", 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 +} + +// ParseTxsRootSubmitted is a log parse operation binding the contract event 0x3ef8030bfab26ec3eaa1bb9e561677860e6794684c43e6b8a5bb50729281abad. +// +// Solidity: event TxsRootSubmitted(address indexed proposer, uint64 indexed proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot) +func (_OpCommitter *OpCommitterFilterer) ParseTxsRootSubmitted(log types.Log) (*OpCommitterTxsRootSubmitted, error) { + event := new(OpCommitterTxsRootSubmitted) + if err := _OpCommitter.contract.UnpackLog(event, "TxsRootSubmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/contract/op/op_proposal_manager.go b/pkg/contract/op/op_proposal_manager.go new file mode 100644 index 0000000..3c760ef --- /dev/null +++ b/pkg/contract/op/op_proposal_manager.go @@ -0,0 +1,2169 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package op + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// OpProposalStateRootProposal is an auto generated low-level Go binding around an user-defined struct. +type OpProposalStateRootProposal struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +} + +// OpProposalTxsRootProposal is an auto generated low-level Go binding around an user-defined struct. +type OpProposalTxsRootProposal struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address + BlockList []uint64 +} + +// OpProposalManagerMetaData contains all meta data concerning the OpProposalManager contract. +var OpProposalManagerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"allBitcoinTxVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposalType\",\"type\":\"uint64\"}],\"name\":\"allDSTxVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"proposalType\",\"type\":\"uint8\"}],\"name\":\"allProposalVotes\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"proposalType\",\"type\":\"uint8\"}],\"name\":\"cleanVotes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastStateRootProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"bitcoinTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"internalType\":\"structOpProposal.StateRootProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTxsRootProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"uint64[]\",\"name\":\"blockList\",\"type\":\"uint64[]\"}],\"internalType\":\"structOpProposal.TxsRootProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"getStateRootProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"bitcoinTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"internalType\":\"structOpProposal.StateRootProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"}],\"name\":\"getTxsRootProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"uint64[]\",\"name\":\"blockList\",\"type\":\"uint64[]\"}],\"internalType\":\"structOpProposal.TxsRootProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnStateRootDSTxPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnStateRootProposalPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnSubmitBitcoinTxPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOnTxsRootProposalPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVotedOntxsRootDSTxPhase\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastStateRootProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"bitcoinTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTxsRootProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"opCommitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"committer\",\"type\":\"address\"}],\"name\":\"setCommitter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"bitcoinTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"internalType\":\"structOpProposal.StateRootProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"setLastStateRootProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"uint64[]\",\"name\":\"blockList\",\"type\":\"uint64[]\"}],\"internalType\":\"structOpProposal.TxsRootProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"setLastTxsRootProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"bitcoinTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"internalType\":\"structOpProposal.StateRootProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"setStateRootProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"internalType\":\"uint64[]\",\"name\":\"blockList\",\"type\":\"uint64[]\"}],\"internalType\":\"structOpProposal.TxsRootProposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"setTxsRootProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stateBitcoinTxVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stateDSTxVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stateRootProposalVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"stateRootProposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"outputRoot\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"startL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL1Timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endL2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputStartIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"outputEndIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"bitcoinTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"txsDSTxVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"txsRootProposalVotes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"txsRootProposals\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"txsRoot\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"dsType\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"dsTxHash\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalID\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"proposalType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"phase\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"voteAndUpdateStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// OpProposalManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use OpProposalManagerMetaData.ABI instead. +var OpProposalManagerABI = OpProposalManagerMetaData.ABI + +// OpProposalManager is an auto generated Go binding around an Ethereum contract. +type OpProposalManager struct { + OpProposalManagerCaller // Read-only binding to the contract + OpProposalManagerTransactor // Write-only binding to the contract + OpProposalManagerFilterer // Log filterer for contract events +} + +// OpProposalManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type OpProposalManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OpProposalManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type OpProposalManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OpProposalManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type OpProposalManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// OpProposalManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type OpProposalManagerSession struct { + Contract *OpProposalManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// OpProposalManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type OpProposalManagerCallerSession struct { + Contract *OpProposalManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// OpProposalManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type OpProposalManagerTransactorSession struct { + Contract *OpProposalManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// OpProposalManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type OpProposalManagerRaw struct { + Contract *OpProposalManager // Generic contract binding to access the raw methods on +} + +// OpProposalManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type OpProposalManagerCallerRaw struct { + Contract *OpProposalManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// OpProposalManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type OpProposalManagerTransactorRaw struct { + Contract *OpProposalManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewOpProposalManager creates a new instance of OpProposalManager, bound to a specific deployed contract. +func NewOpProposalManager(address common.Address, backend bind.ContractBackend) (*OpProposalManager, error) { + contract, err := bindOpProposalManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &OpProposalManager{OpProposalManagerCaller: OpProposalManagerCaller{contract: contract}, OpProposalManagerTransactor: OpProposalManagerTransactor{contract: contract}, OpProposalManagerFilterer: OpProposalManagerFilterer{contract: contract}}, nil +} + +// NewOpProposalManagerCaller creates a new read-only instance of OpProposalManager, bound to a specific deployed contract. +func NewOpProposalManagerCaller(address common.Address, caller bind.ContractCaller) (*OpProposalManagerCaller, error) { + contract, err := bindOpProposalManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &OpProposalManagerCaller{contract: contract}, nil +} + +// NewOpProposalManagerTransactor creates a new write-only instance of OpProposalManager, bound to a specific deployed contract. +func NewOpProposalManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*OpProposalManagerTransactor, error) { + contract, err := bindOpProposalManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &OpProposalManagerTransactor{contract: contract}, nil +} + +// NewOpProposalManagerFilterer creates a new log filterer instance of OpProposalManager, bound to a specific deployed contract. +func NewOpProposalManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*OpProposalManagerFilterer, error) { + contract, err := bindOpProposalManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &OpProposalManagerFilterer{contract: contract}, nil +} + +// bindOpProposalManager binds a generic wrapper to an already deployed contract. +func bindOpProposalManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := OpProposalManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_OpProposalManager *OpProposalManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OpProposalManager.Contract.OpProposalManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_OpProposalManager *OpProposalManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OpProposalManager.Contract.OpProposalManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_OpProposalManager *OpProposalManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OpProposalManager.Contract.OpProposalManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_OpProposalManager *OpProposalManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OpProposalManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_OpProposalManager *OpProposalManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OpProposalManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_OpProposalManager *OpProposalManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OpProposalManager.Contract.contract.Transact(opts, method, params...) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_OpProposalManager *OpProposalManagerCaller) ADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_OpProposalManager *OpProposalManagerSession) ADMINROLE() ([32]byte, error) { + return _OpProposalManager.Contract.ADMINROLE(&_OpProposalManager.CallOpts) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_OpProposalManager *OpProposalManagerCallerSession) ADMINROLE() ([32]byte, error) { + return _OpProposalManager.Contract.ADMINROLE(&_OpProposalManager.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_OpProposalManager *OpProposalManagerCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "DEFAULT_ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_OpProposalManager *OpProposalManagerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _OpProposalManager.Contract.DEFAULTADMINROLE(&_OpProposalManager.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_OpProposalManager *OpProposalManagerCallerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _OpProposalManager.Contract.DEFAULTADMINROLE(&_OpProposalManager.CallOpts) +} + +// AllBitcoinTxVotes is a free data retrieval call binding the contract method 0x4f8bcb3d. +// +// Solidity: function allBitcoinTxVotes(uint64 proposalID) view returns(address[]) +func (_OpProposalManager *OpProposalManagerCaller) AllBitcoinTxVotes(opts *bind.CallOpts, proposalID uint64) ([]common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "allBitcoinTxVotes", proposalID) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllBitcoinTxVotes is a free data retrieval call binding the contract method 0x4f8bcb3d. +// +// Solidity: function allBitcoinTxVotes(uint64 proposalID) view returns(address[]) +func (_OpProposalManager *OpProposalManagerSession) AllBitcoinTxVotes(proposalID uint64) ([]common.Address, error) { + return _OpProposalManager.Contract.AllBitcoinTxVotes(&_OpProposalManager.CallOpts, proposalID) +} + +// AllBitcoinTxVotes is a free data retrieval call binding the contract method 0x4f8bcb3d. +// +// Solidity: function allBitcoinTxVotes(uint64 proposalID) view returns(address[]) +func (_OpProposalManager *OpProposalManagerCallerSession) AllBitcoinTxVotes(proposalID uint64) ([]common.Address, error) { + return _OpProposalManager.Contract.AllBitcoinTxVotes(&_OpProposalManager.CallOpts, proposalID) +} + +// AllDSTxVotes is a free data retrieval call binding the contract method 0x44d2e4e0. +// +// Solidity: function allDSTxVotes(uint64 proposalID, uint64 proposalType) view returns(address[]) +func (_OpProposalManager *OpProposalManagerCaller) AllDSTxVotes(opts *bind.CallOpts, proposalID uint64, proposalType uint64) ([]common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "allDSTxVotes", proposalID, proposalType) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllDSTxVotes is a free data retrieval call binding the contract method 0x44d2e4e0. +// +// Solidity: function allDSTxVotes(uint64 proposalID, uint64 proposalType) view returns(address[]) +func (_OpProposalManager *OpProposalManagerSession) AllDSTxVotes(proposalID uint64, proposalType uint64) ([]common.Address, error) { + return _OpProposalManager.Contract.AllDSTxVotes(&_OpProposalManager.CallOpts, proposalID, proposalType) +} + +// AllDSTxVotes is a free data retrieval call binding the contract method 0x44d2e4e0. +// +// Solidity: function allDSTxVotes(uint64 proposalID, uint64 proposalType) view returns(address[]) +func (_OpProposalManager *OpProposalManagerCallerSession) AllDSTxVotes(proposalID uint64, proposalType uint64) ([]common.Address, error) { + return _OpProposalManager.Contract.AllDSTxVotes(&_OpProposalManager.CallOpts, proposalID, proposalType) +} + +// AllProposalVotes is a free data retrieval call binding the contract method 0x49b97431. +// +// Solidity: function allProposalVotes(uint64 proposalID, uint8 proposalType) view returns(address[]) +func (_OpProposalManager *OpProposalManagerCaller) AllProposalVotes(opts *bind.CallOpts, proposalID uint64, proposalType uint8) ([]common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "allProposalVotes", proposalID, proposalType) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllProposalVotes is a free data retrieval call binding the contract method 0x49b97431. +// +// Solidity: function allProposalVotes(uint64 proposalID, uint8 proposalType) view returns(address[]) +func (_OpProposalManager *OpProposalManagerSession) AllProposalVotes(proposalID uint64, proposalType uint8) ([]common.Address, error) { + return _OpProposalManager.Contract.AllProposalVotes(&_OpProposalManager.CallOpts, proposalID, proposalType) +} + +// AllProposalVotes is a free data retrieval call binding the contract method 0x49b97431. +// +// Solidity: function allProposalVotes(uint64 proposalID, uint8 proposalType) view returns(address[]) +func (_OpProposalManager *OpProposalManagerCallerSession) AllProposalVotes(proposalID uint64, proposalType uint8) ([]common.Address, error) { + return _OpProposalManager.Contract.AllProposalVotes(&_OpProposalManager.CallOpts, proposalID, proposalType) +} + +// GetLastStateRootProposal is a free data retrieval call binding the contract method 0x418f1657. +// +// Solidity: function getLastStateRootProposal() view returns((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address)) +func (_OpProposalManager *OpProposalManagerCaller) GetLastStateRootProposal(opts *bind.CallOpts) (OpProposalStateRootProposal, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "getLastStateRootProposal") + + if err != nil { + return *new(OpProposalStateRootProposal), err + } + + out0 := *abi.ConvertType(out[0], new(OpProposalStateRootProposal)).(*OpProposalStateRootProposal) + + return out0, err + +} + +// GetLastStateRootProposal is a free data retrieval call binding the contract method 0x418f1657. +// +// Solidity: function getLastStateRootProposal() view returns((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address)) +func (_OpProposalManager *OpProposalManagerSession) GetLastStateRootProposal() (OpProposalStateRootProposal, error) { + return _OpProposalManager.Contract.GetLastStateRootProposal(&_OpProposalManager.CallOpts) +} + +// GetLastStateRootProposal is a free data retrieval call binding the contract method 0x418f1657. +// +// Solidity: function getLastStateRootProposal() view returns((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address)) +func (_OpProposalManager *OpProposalManagerCallerSession) GetLastStateRootProposal() (OpProposalStateRootProposal, error) { + return _OpProposalManager.Contract.GetLastStateRootProposal(&_OpProposalManager.CallOpts) +} + +// GetLastTxsRootProposal is a free data retrieval call binding the contract method 0x182a2cdb. +// +// Solidity: function getLastTxsRootProposal() view returns((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[])) +func (_OpProposalManager *OpProposalManagerCaller) GetLastTxsRootProposal(opts *bind.CallOpts) (OpProposalTxsRootProposal, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "getLastTxsRootProposal") + + if err != nil { + return *new(OpProposalTxsRootProposal), err + } + + out0 := *abi.ConvertType(out[0], new(OpProposalTxsRootProposal)).(*OpProposalTxsRootProposal) + + return out0, err + +} + +// GetLastTxsRootProposal is a free data retrieval call binding the contract method 0x182a2cdb. +// +// Solidity: function getLastTxsRootProposal() view returns((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[])) +func (_OpProposalManager *OpProposalManagerSession) GetLastTxsRootProposal() (OpProposalTxsRootProposal, error) { + return _OpProposalManager.Contract.GetLastTxsRootProposal(&_OpProposalManager.CallOpts) +} + +// GetLastTxsRootProposal is a free data retrieval call binding the contract method 0x182a2cdb. +// +// Solidity: function getLastTxsRootProposal() view returns((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[])) +func (_OpProposalManager *OpProposalManagerCallerSession) GetLastTxsRootProposal() (OpProposalTxsRootProposal, error) { + return _OpProposalManager.Contract.GetLastTxsRootProposal(&_OpProposalManager.CallOpts) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_OpProposalManager *OpProposalManagerCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "getRoleAdmin", role) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_OpProposalManager *OpProposalManagerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _OpProposalManager.Contract.GetRoleAdmin(&_OpProposalManager.CallOpts, role) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_OpProposalManager *OpProposalManagerCallerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _OpProposalManager.Contract.GetRoleAdmin(&_OpProposalManager.CallOpts, role) +} + +// GetStateRootProposal is a free data retrieval call binding the contract method 0xacb340b8. +// +// Solidity: function getStateRootProposal(uint64 proposalID) view returns((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address)) +func (_OpProposalManager *OpProposalManagerCaller) GetStateRootProposal(opts *bind.CallOpts, proposalID uint64) (OpProposalStateRootProposal, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "getStateRootProposal", proposalID) + + if err != nil { + return *new(OpProposalStateRootProposal), err + } + + out0 := *abi.ConvertType(out[0], new(OpProposalStateRootProposal)).(*OpProposalStateRootProposal) + + return out0, err + +} + +// GetStateRootProposal is a free data retrieval call binding the contract method 0xacb340b8. +// +// Solidity: function getStateRootProposal(uint64 proposalID) view returns((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address)) +func (_OpProposalManager *OpProposalManagerSession) GetStateRootProposal(proposalID uint64) (OpProposalStateRootProposal, error) { + return _OpProposalManager.Contract.GetStateRootProposal(&_OpProposalManager.CallOpts, proposalID) +} + +// GetStateRootProposal is a free data retrieval call binding the contract method 0xacb340b8. +// +// Solidity: function getStateRootProposal(uint64 proposalID) view returns((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address)) +func (_OpProposalManager *OpProposalManagerCallerSession) GetStateRootProposal(proposalID uint64) (OpProposalStateRootProposal, error) { + return _OpProposalManager.Contract.GetStateRootProposal(&_OpProposalManager.CallOpts, proposalID) +} + +// GetTxsRootProposal is a free data retrieval call binding the contract method 0xac536038. +// +// Solidity: function getTxsRootProposal(uint64 proposalID) view returns((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[])) +func (_OpProposalManager *OpProposalManagerCaller) GetTxsRootProposal(opts *bind.CallOpts, proposalID uint64) (OpProposalTxsRootProposal, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "getTxsRootProposal", proposalID) + + if err != nil { + return *new(OpProposalTxsRootProposal), err + } + + out0 := *abi.ConvertType(out[0], new(OpProposalTxsRootProposal)).(*OpProposalTxsRootProposal) + + return out0, err + +} + +// GetTxsRootProposal is a free data retrieval call binding the contract method 0xac536038. +// +// Solidity: function getTxsRootProposal(uint64 proposalID) view returns((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[])) +func (_OpProposalManager *OpProposalManagerSession) GetTxsRootProposal(proposalID uint64) (OpProposalTxsRootProposal, error) { + return _OpProposalManager.Contract.GetTxsRootProposal(&_OpProposalManager.CallOpts, proposalID) +} + +// GetTxsRootProposal is a free data retrieval call binding the contract method 0xac536038. +// +// Solidity: function getTxsRootProposal(uint64 proposalID) view returns((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[])) +func (_OpProposalManager *OpProposalManagerCallerSession) GetTxsRootProposal(proposalID uint64) (OpProposalTxsRootProposal, error) { + return _OpProposalManager.Contract.GetTxsRootProposal(&_OpProposalManager.CallOpts, proposalID) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "hasRole", role, account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _OpProposalManager.Contract.HasRole(&_OpProposalManager.CallOpts, role, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _OpProposalManager.Contract.HasRole(&_OpProposalManager.CallOpts, role, account) +} + +// IsVotedOnStateRootDSTxPhase is a free data retrieval call binding the contract method 0xb48ec5f1. +// +// Solidity: function isVotedOnStateRootDSTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) IsVotedOnStateRootDSTxPhase(opts *bind.CallOpts, proposalID uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "isVotedOnStateRootDSTxPhase", proposalID, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOnStateRootDSTxPhase is a free data retrieval call binding the contract method 0xb48ec5f1. +// +// Solidity: function isVotedOnStateRootDSTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) IsVotedOnStateRootDSTxPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnStateRootDSTxPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnStateRootDSTxPhase is a free data retrieval call binding the contract method 0xb48ec5f1. +// +// Solidity: function isVotedOnStateRootDSTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) IsVotedOnStateRootDSTxPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnStateRootDSTxPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnStateRootProposalPhase is a free data retrieval call binding the contract method 0x641d1f67. +// +// Solidity: function isVotedOnStateRootProposalPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) IsVotedOnStateRootProposalPhase(opts *bind.CallOpts, proposalID uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "isVotedOnStateRootProposalPhase", proposalID, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOnStateRootProposalPhase is a free data retrieval call binding the contract method 0x641d1f67. +// +// Solidity: function isVotedOnStateRootProposalPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) IsVotedOnStateRootProposalPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnStateRootProposalPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnStateRootProposalPhase is a free data retrieval call binding the contract method 0x641d1f67. +// +// Solidity: function isVotedOnStateRootProposalPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) IsVotedOnStateRootProposalPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnStateRootProposalPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnSubmitBitcoinTxPhase is a free data retrieval call binding the contract method 0xfab0c232. +// +// Solidity: function isVotedOnSubmitBitcoinTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) IsVotedOnSubmitBitcoinTxPhase(opts *bind.CallOpts, proposalID uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "isVotedOnSubmitBitcoinTxPhase", proposalID, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOnSubmitBitcoinTxPhase is a free data retrieval call binding the contract method 0xfab0c232. +// +// Solidity: function isVotedOnSubmitBitcoinTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) IsVotedOnSubmitBitcoinTxPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnSubmitBitcoinTxPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnSubmitBitcoinTxPhase is a free data retrieval call binding the contract method 0xfab0c232. +// +// Solidity: function isVotedOnSubmitBitcoinTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) IsVotedOnSubmitBitcoinTxPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnSubmitBitcoinTxPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnTxsRootProposalPhase is a free data retrieval call binding the contract method 0xb698fcea. +// +// Solidity: function isVotedOnTxsRootProposalPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) IsVotedOnTxsRootProposalPhase(opts *bind.CallOpts, proposalID uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "isVotedOnTxsRootProposalPhase", proposalID, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOnTxsRootProposalPhase is a free data retrieval call binding the contract method 0xb698fcea. +// +// Solidity: function isVotedOnTxsRootProposalPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) IsVotedOnTxsRootProposalPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnTxsRootProposalPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOnTxsRootProposalPhase is a free data retrieval call binding the contract method 0xb698fcea. +// +// Solidity: function isVotedOnTxsRootProposalPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) IsVotedOnTxsRootProposalPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOnTxsRootProposalPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOntxsRootDSTxPhase is a free data retrieval call binding the contract method 0x34c8f27e. +// +// Solidity: function isVotedOntxsRootDSTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) IsVotedOntxsRootDSTxPhase(opts *bind.CallOpts, proposalID uint64, voter common.Address) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "isVotedOntxsRootDSTxPhase", proposalID, voter) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVotedOntxsRootDSTxPhase is a free data retrieval call binding the contract method 0x34c8f27e. +// +// Solidity: function isVotedOntxsRootDSTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) IsVotedOntxsRootDSTxPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOntxsRootDSTxPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// IsVotedOntxsRootDSTxPhase is a free data retrieval call binding the contract method 0x34c8f27e. +// +// Solidity: function isVotedOntxsRootDSTxPhase(uint64 proposalID, address voter) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) IsVotedOntxsRootDSTxPhase(proposalID uint64, voter common.Address) (bool, error) { + return _OpProposalManager.Contract.IsVotedOntxsRootDSTxPhase(&_OpProposalManager.CallOpts, proposalID, voter) +} + +// LastStateRootProposal is a free data retrieval call binding the contract method 0x50613301. +// +// Solidity: function lastStateRootProposal() view returns(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, string bitcoinTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCaller) LastStateRootProposal(opts *bind.CallOpts) (struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +}, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "lastStateRootProposal") + + outstruct := new(struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProposalID = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.OutputRoot = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.StartL1Timestamp = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.EndL1Timestamp = *abi.ConvertType(out[3], new(uint64)).(*uint64) + outstruct.StartL2BlockNumber = *abi.ConvertType(out[4], new(uint64)).(*uint64) + outstruct.EndL2BlockNumber = *abi.ConvertType(out[5], new(uint64)).(*uint64) + outstruct.OutputStartIndex = *abi.ConvertType(out[6], new(uint64)).(*uint64) + outstruct.OutputEndIndex = *abi.ConvertType(out[7], new(uint64)).(*uint64) + outstruct.Timeout = *abi.ConvertType(out[8], new(*big.Int)).(**big.Int) + outstruct.Status = *abi.ConvertType(out[9], new(uint8)).(*uint8) + outstruct.DsType = *abi.ConvertType(out[10], new(uint8)).(*uint8) + outstruct.DsTxHash = *abi.ConvertType(out[11], new(string)).(*string) + outstruct.BitcoinTxHash = *abi.ConvertType(out[12], new(string)).(*string) + outstruct.Winner = *abi.ConvertType(out[13], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// LastStateRootProposal is a free data retrieval call binding the contract method 0x50613301. +// +// Solidity: function lastStateRootProposal() view returns(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, string bitcoinTxHash, address winner) +func (_OpProposalManager *OpProposalManagerSession) LastStateRootProposal() (struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.LastStateRootProposal(&_OpProposalManager.CallOpts) +} + +// LastStateRootProposal is a free data retrieval call binding the contract method 0x50613301. +// +// Solidity: function lastStateRootProposal() view returns(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, string bitcoinTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCallerSession) LastStateRootProposal() (struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.LastStateRootProposal(&_OpProposalManager.CallOpts) +} + +// LastTxsRootProposal is a free data retrieval call binding the contract method 0xdba274ab. +// +// Solidity: function lastTxsRootProposal() view returns(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCaller) LastTxsRootProposal(opts *bind.CallOpts) (struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address +}, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "lastTxsRootProposal") + + outstruct := new(struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProposalID = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.StartTimestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.EndTimestamp = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.StartBlockNumber = *abi.ConvertType(out[3], new(uint64)).(*uint64) + outstruct.EndBlockNumber = *abi.ConvertType(out[4], new(uint64)).(*uint64) + outstruct.TxsRoot = *abi.ConvertType(out[5], new(string)).(*string) + outstruct.Timeout = *abi.ConvertType(out[6], new(*big.Int)).(**big.Int) + outstruct.Status = *abi.ConvertType(out[7], new(uint8)).(*uint8) + outstruct.DsType = *abi.ConvertType(out[8], new(uint8)).(*uint8) + outstruct.DsTxHash = *abi.ConvertType(out[9], new(string)).(*string) + outstruct.Winner = *abi.ConvertType(out[10], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// LastTxsRootProposal is a free data retrieval call binding the contract method 0xdba274ab. +// +// Solidity: function lastTxsRootProposal() view returns(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, address winner) +func (_OpProposalManager *OpProposalManagerSession) LastTxsRootProposal() (struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.LastTxsRootProposal(&_OpProposalManager.CallOpts) +} + +// LastTxsRootProposal is a free data retrieval call binding the contract method 0xdba274ab. +// +// Solidity: function lastTxsRootProposal() view returns(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCallerSession) LastTxsRootProposal() (struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.LastTxsRootProposal(&_OpProposalManager.CallOpts) +} + +// OpCommitter is a free data retrieval call binding the contract method 0x960a5fce. +// +// Solidity: function opCommitter() view returns(address) +func (_OpProposalManager *OpProposalManagerCaller) OpCommitter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "opCommitter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// OpCommitter is a free data retrieval call binding the contract method 0x960a5fce. +// +// Solidity: function opCommitter() view returns(address) +func (_OpProposalManager *OpProposalManagerSession) OpCommitter() (common.Address, error) { + return _OpProposalManager.Contract.OpCommitter(&_OpProposalManager.CallOpts) +} + +// OpCommitter is a free data retrieval call binding the contract method 0x960a5fce. +// +// Solidity: function opCommitter() view returns(address) +func (_OpProposalManager *OpProposalManagerCallerSession) OpCommitter() (common.Address, error) { + return _OpProposalManager.Contract.OpCommitter(&_OpProposalManager.CallOpts) +} + +// StateBitcoinTxVotes is a free data retrieval call binding the contract method 0xf8ebaea9. +// +// Solidity: function stateBitcoinTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCaller) StateBitcoinTxVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "stateBitcoinTxVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// StateBitcoinTxVotes is a free data retrieval call binding the contract method 0xf8ebaea9. +// +// Solidity: function stateBitcoinTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerSession) StateBitcoinTxVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.StateBitcoinTxVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// StateBitcoinTxVotes is a free data retrieval call binding the contract method 0xf8ebaea9. +// +// Solidity: function stateBitcoinTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCallerSession) StateBitcoinTxVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.StateBitcoinTxVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// StateDSTxVotes is a free data retrieval call binding the contract method 0x5914f79b. +// +// Solidity: function stateDSTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCaller) StateDSTxVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "stateDSTxVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// StateDSTxVotes is a free data retrieval call binding the contract method 0x5914f79b. +// +// Solidity: function stateDSTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerSession) StateDSTxVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.StateDSTxVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// StateDSTxVotes is a free data retrieval call binding the contract method 0x5914f79b. +// +// Solidity: function stateDSTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCallerSession) StateDSTxVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.StateDSTxVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// StateRootProposalVotes is a free data retrieval call binding the contract method 0x2820260d. +// +// Solidity: function stateRootProposalVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCaller) StateRootProposalVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "stateRootProposalVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// StateRootProposalVotes is a free data retrieval call binding the contract method 0x2820260d. +// +// Solidity: function stateRootProposalVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerSession) StateRootProposalVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.StateRootProposalVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// StateRootProposalVotes is a free data retrieval call binding the contract method 0x2820260d. +// +// Solidity: function stateRootProposalVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCallerSession) StateRootProposalVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.StateRootProposalVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// StateRootProposals is a free data retrieval call binding the contract method 0x09a99a33. +// +// Solidity: function stateRootProposals(uint64 ) view returns(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, string bitcoinTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCaller) StateRootProposals(opts *bind.CallOpts, arg0 uint64) (struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +}, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "stateRootProposals", arg0) + + outstruct := new(struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProposalID = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.OutputRoot = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.StartL1Timestamp = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.EndL1Timestamp = *abi.ConvertType(out[3], new(uint64)).(*uint64) + outstruct.StartL2BlockNumber = *abi.ConvertType(out[4], new(uint64)).(*uint64) + outstruct.EndL2BlockNumber = *abi.ConvertType(out[5], new(uint64)).(*uint64) + outstruct.OutputStartIndex = *abi.ConvertType(out[6], new(uint64)).(*uint64) + outstruct.OutputEndIndex = *abi.ConvertType(out[7], new(uint64)).(*uint64) + outstruct.Timeout = *abi.ConvertType(out[8], new(*big.Int)).(**big.Int) + outstruct.Status = *abi.ConvertType(out[9], new(uint8)).(*uint8) + outstruct.DsType = *abi.ConvertType(out[10], new(uint8)).(*uint8) + outstruct.DsTxHash = *abi.ConvertType(out[11], new(string)).(*string) + outstruct.BitcoinTxHash = *abi.ConvertType(out[12], new(string)).(*string) + outstruct.Winner = *abi.ConvertType(out[13], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// StateRootProposals is a free data retrieval call binding the contract method 0x09a99a33. +// +// Solidity: function stateRootProposals(uint64 ) view returns(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, string bitcoinTxHash, address winner) +func (_OpProposalManager *OpProposalManagerSession) StateRootProposals(arg0 uint64) (struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.StateRootProposals(&_OpProposalManager.CallOpts, arg0) +} + +// StateRootProposals is a free data retrieval call binding the contract method 0x09a99a33. +// +// Solidity: function stateRootProposals(uint64 ) view returns(uint64 proposalID, string outputRoot, uint64 startL1Timestamp, uint64 endL1Timestamp, uint64 startL2BlockNumber, uint64 endL2BlockNumber, uint64 outputStartIndex, uint64 outputEndIndex, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, string bitcoinTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCallerSession) StateRootProposals(arg0 uint64) (struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + BitcoinTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.StateRootProposals(&_OpProposalManager.CallOpts, arg0) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_OpProposalManager *OpProposalManagerCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_OpProposalManager *OpProposalManagerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _OpProposalManager.Contract.SupportsInterface(&_OpProposalManager.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_OpProposalManager *OpProposalManagerCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _OpProposalManager.Contract.SupportsInterface(&_OpProposalManager.CallOpts, interfaceId) +} + +// TxsDSTxVotes is a free data retrieval call binding the contract method 0x7aef9daa. +// +// Solidity: function txsDSTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCaller) TxsDSTxVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "txsDSTxVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TxsDSTxVotes is a free data retrieval call binding the contract method 0x7aef9daa. +// +// Solidity: function txsDSTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerSession) TxsDSTxVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.TxsDSTxVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// TxsDSTxVotes is a free data retrieval call binding the contract method 0x7aef9daa. +// +// Solidity: function txsDSTxVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCallerSession) TxsDSTxVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.TxsDSTxVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// TxsRootProposalVotes is a free data retrieval call binding the contract method 0x79d4f0bc. +// +// Solidity: function txsRootProposalVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCaller) TxsRootProposalVotes(opts *bind.CallOpts, arg0 uint64, arg1 *big.Int) (common.Address, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "txsRootProposalVotes", arg0, arg1) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TxsRootProposalVotes is a free data retrieval call binding the contract method 0x79d4f0bc. +// +// Solidity: function txsRootProposalVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerSession) TxsRootProposalVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.TxsRootProposalVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// TxsRootProposalVotes is a free data retrieval call binding the contract method 0x79d4f0bc. +// +// Solidity: function txsRootProposalVotes(uint64 , uint256 ) view returns(address) +func (_OpProposalManager *OpProposalManagerCallerSession) TxsRootProposalVotes(arg0 uint64, arg1 *big.Int) (common.Address, error) { + return _OpProposalManager.Contract.TxsRootProposalVotes(&_OpProposalManager.CallOpts, arg0, arg1) +} + +// TxsRootProposals is a free data retrieval call binding the contract method 0x4a568b6a. +// +// Solidity: function txsRootProposals(uint64 ) view returns(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCaller) TxsRootProposals(opts *bind.CallOpts, arg0 uint64) (struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address +}, error) { + var out []interface{} + err := _OpProposalManager.contract.Call(opts, &out, "txsRootProposals", arg0) + + outstruct := new(struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.ProposalID = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.StartTimestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.EndTimestamp = *abi.ConvertType(out[2], new(uint64)).(*uint64) + outstruct.StartBlockNumber = *abi.ConvertType(out[3], new(uint64)).(*uint64) + outstruct.EndBlockNumber = *abi.ConvertType(out[4], new(uint64)).(*uint64) + outstruct.TxsRoot = *abi.ConvertType(out[5], new(string)).(*string) + outstruct.Timeout = *abi.ConvertType(out[6], new(*big.Int)).(**big.Int) + outstruct.Status = *abi.ConvertType(out[7], new(uint8)).(*uint8) + outstruct.DsType = *abi.ConvertType(out[8], new(uint8)).(*uint8) + outstruct.DsTxHash = *abi.ConvertType(out[9], new(string)).(*string) + outstruct.Winner = *abi.ConvertType(out[10], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// TxsRootProposals is a free data retrieval call binding the contract method 0x4a568b6a. +// +// Solidity: function txsRootProposals(uint64 ) view returns(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, address winner) +func (_OpProposalManager *OpProposalManagerSession) TxsRootProposals(arg0 uint64) (struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.TxsRootProposals(&_OpProposalManager.CallOpts, arg0) +} + +// TxsRootProposals is a free data retrieval call binding the contract method 0x4a568b6a. +// +// Solidity: function txsRootProposals(uint64 ) view returns(uint64 proposalID, uint64 startTimestamp, uint64 endTimestamp, uint64 startBlockNumber, uint64 endBlockNumber, string txsRoot, uint256 timeout, uint8 status, uint8 dsType, string dsTxHash, address winner) +func (_OpProposalManager *OpProposalManagerCallerSession) TxsRootProposals(arg0 uint64) (struct { + ProposalID uint64 + StartTimestamp uint64 + EndTimestamp uint64 + StartBlockNumber uint64 + EndBlockNumber uint64 + TxsRoot string + Timeout *big.Int + Status uint8 + DsType uint8 + DsTxHash string + Winner common.Address +}, error) { + return _OpProposalManager.Contract.TxsRootProposals(&_OpProposalManager.CallOpts, arg0) +} + +// CleanVotes is a paid mutator transaction binding the contract method 0x09fa1b23. +// +// Solidity: function cleanVotes(uint64 proposalID, uint8 proposalType) returns() +func (_OpProposalManager *OpProposalManagerTransactor) CleanVotes(opts *bind.TransactOpts, proposalID uint64, proposalType uint8) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "cleanVotes", proposalID, proposalType) +} + +// CleanVotes is a paid mutator transaction binding the contract method 0x09fa1b23. +// +// Solidity: function cleanVotes(uint64 proposalID, uint8 proposalType) returns() +func (_OpProposalManager *OpProposalManagerSession) CleanVotes(proposalID uint64, proposalType uint8) (*types.Transaction, error) { + return _OpProposalManager.Contract.CleanVotes(&_OpProposalManager.TransactOpts, proposalID, proposalType) +} + +// CleanVotes is a paid mutator transaction binding the contract method 0x09fa1b23. +// +// Solidity: function cleanVotes(uint64 proposalID, uint8 proposalType) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) CleanVotes(proposalID uint64, proposalType uint8) (*types.Transaction, error) { + return _OpProposalManager.Contract.CleanVotes(&_OpProposalManager.TransactOpts, proposalID, proposalType) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_OpProposalManager *OpProposalManagerTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "grantRole", role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_OpProposalManager *OpProposalManagerSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.GrantRole(&_OpProposalManager.TransactOpts, role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.GrantRole(&_OpProposalManager.TransactOpts, role, account) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_OpProposalManager *OpProposalManagerTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_OpProposalManager *OpProposalManagerSession) Initialize() (*types.Transaction, error) { + return _OpProposalManager.Contract.Initialize(&_OpProposalManager.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) Initialize() (*types.Transaction, error) { + return _OpProposalManager.Contract.Initialize(&_OpProposalManager.TransactOpts) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_OpProposalManager *OpProposalManagerTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "renounceRole", role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_OpProposalManager *OpProposalManagerSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.RenounceRole(&_OpProposalManager.TransactOpts, role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.RenounceRole(&_OpProposalManager.TransactOpts, role, callerConfirmation) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_OpProposalManager *OpProposalManagerTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "revokeRole", role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_OpProposalManager *OpProposalManagerSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.RevokeRole(&_OpProposalManager.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.RevokeRole(&_OpProposalManager.TransactOpts, role, account) +} + +// SetCommitter is a paid mutator transaction binding the contract method 0xdd51ce22. +// +// Solidity: function setCommitter(address committer) returns() +func (_OpProposalManager *OpProposalManagerTransactor) SetCommitter(opts *bind.TransactOpts, committer common.Address) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "setCommitter", committer) +} + +// SetCommitter is a paid mutator transaction binding the contract method 0xdd51ce22. +// +// Solidity: function setCommitter(address committer) returns() +func (_OpProposalManager *OpProposalManagerSession) SetCommitter(committer common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetCommitter(&_OpProposalManager.TransactOpts, committer) +} + +// SetCommitter is a paid mutator transaction binding the contract method 0xdd51ce22. +// +// Solidity: function setCommitter(address committer) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) SetCommitter(committer common.Address) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetCommitter(&_OpProposalManager.TransactOpts, committer) +} + +// SetLastStateRootProposal is a paid mutator transaction binding the contract method 0x9cb06586. +// +// Solidity: function setLastStateRootProposal((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactor) SetLastStateRootProposal(opts *bind.TransactOpts, proposal OpProposalStateRootProposal) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "setLastStateRootProposal", proposal) +} + +// SetLastStateRootProposal is a paid mutator transaction binding the contract method 0x9cb06586. +// +// Solidity: function setLastStateRootProposal((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address) proposal) returns() +func (_OpProposalManager *OpProposalManagerSession) SetLastStateRootProposal(proposal OpProposalStateRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetLastStateRootProposal(&_OpProposalManager.TransactOpts, proposal) +} + +// SetLastStateRootProposal is a paid mutator transaction binding the contract method 0x9cb06586. +// +// Solidity: function setLastStateRootProposal((uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) SetLastStateRootProposal(proposal OpProposalStateRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetLastStateRootProposal(&_OpProposalManager.TransactOpts, proposal) +} + +// SetLastTxsRootProposal is a paid mutator transaction binding the contract method 0x4d377509. +// +// Solidity: function setLastTxsRootProposal((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[]) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactor) SetLastTxsRootProposal(opts *bind.TransactOpts, proposal OpProposalTxsRootProposal) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "setLastTxsRootProposal", proposal) +} + +// SetLastTxsRootProposal is a paid mutator transaction binding the contract method 0x4d377509. +// +// Solidity: function setLastTxsRootProposal((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[]) proposal) returns() +func (_OpProposalManager *OpProposalManagerSession) SetLastTxsRootProposal(proposal OpProposalTxsRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetLastTxsRootProposal(&_OpProposalManager.TransactOpts, proposal) +} + +// SetLastTxsRootProposal is a paid mutator transaction binding the contract method 0x4d377509. +// +// Solidity: function setLastTxsRootProposal((uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[]) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) SetLastTxsRootProposal(proposal OpProposalTxsRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetLastTxsRootProposal(&_OpProposalManager.TransactOpts, proposal) +} + +// SetStateRootProposal is a paid mutator transaction binding the contract method 0x7aec53cb. +// +// Solidity: function setStateRootProposal(uint64 proposalID, (uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactor) SetStateRootProposal(opts *bind.TransactOpts, proposalID uint64, proposal OpProposalStateRootProposal) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "setStateRootProposal", proposalID, proposal) +} + +// SetStateRootProposal is a paid mutator transaction binding the contract method 0x7aec53cb. +// +// Solidity: function setStateRootProposal(uint64 proposalID, (uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address) proposal) returns() +func (_OpProposalManager *OpProposalManagerSession) SetStateRootProposal(proposalID uint64, proposal OpProposalStateRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetStateRootProposal(&_OpProposalManager.TransactOpts, proposalID, proposal) +} + +// SetStateRootProposal is a paid mutator transaction binding the contract method 0x7aec53cb. +// +// Solidity: function setStateRootProposal(uint64 proposalID, (uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint256,uint8,uint8,string,string,address) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) SetStateRootProposal(proposalID uint64, proposal OpProposalStateRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetStateRootProposal(&_OpProposalManager.TransactOpts, proposalID, proposal) +} + +// SetTxsRootProposal is a paid mutator transaction binding the contract method 0xf5a40448. +// +// Solidity: function setTxsRootProposal(uint64 proposalID, (uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[]) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactor) SetTxsRootProposal(opts *bind.TransactOpts, proposalID uint64, proposal OpProposalTxsRootProposal) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "setTxsRootProposal", proposalID, proposal) +} + +// SetTxsRootProposal is a paid mutator transaction binding the contract method 0xf5a40448. +// +// Solidity: function setTxsRootProposal(uint64 proposalID, (uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[]) proposal) returns() +func (_OpProposalManager *OpProposalManagerSession) SetTxsRootProposal(proposalID uint64, proposal OpProposalTxsRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetTxsRootProposal(&_OpProposalManager.TransactOpts, proposalID, proposal) +} + +// SetTxsRootProposal is a paid mutator transaction binding the contract method 0xf5a40448. +// +// Solidity: function setTxsRootProposal(uint64 proposalID, (uint64,uint64,uint64,uint64,uint64,string,uint256,uint8,uint8,string,address,uint64[]) proposal) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) SetTxsRootProposal(proposalID uint64, proposal OpProposalTxsRootProposal) (*types.Transaction, error) { + return _OpProposalManager.Contract.SetTxsRootProposal(&_OpProposalManager.TransactOpts, proposalID, proposal) +} + +// VoteAndUpdateStatus is a paid mutator transaction binding the contract method 0xe4f5c160. +// +// Solidity: function voteAndUpdateStatus(uint64 proposalID, uint8 proposalType, address voter, address[] proposers, uint8 phase, uint8 status) returns() +func (_OpProposalManager *OpProposalManagerTransactor) VoteAndUpdateStatus(opts *bind.TransactOpts, proposalID uint64, proposalType uint8, voter common.Address, proposers []common.Address, phase uint8, status uint8) (*types.Transaction, error) { + return _OpProposalManager.contract.Transact(opts, "voteAndUpdateStatus", proposalID, proposalType, voter, proposers, phase, status) +} + +// VoteAndUpdateStatus is a paid mutator transaction binding the contract method 0xe4f5c160. +// +// Solidity: function voteAndUpdateStatus(uint64 proposalID, uint8 proposalType, address voter, address[] proposers, uint8 phase, uint8 status) returns() +func (_OpProposalManager *OpProposalManagerSession) VoteAndUpdateStatus(proposalID uint64, proposalType uint8, voter common.Address, proposers []common.Address, phase uint8, status uint8) (*types.Transaction, error) { + return _OpProposalManager.Contract.VoteAndUpdateStatus(&_OpProposalManager.TransactOpts, proposalID, proposalType, voter, proposers, phase, status) +} + +// VoteAndUpdateStatus is a paid mutator transaction binding the contract method 0xe4f5c160. +// +// Solidity: function voteAndUpdateStatus(uint64 proposalID, uint8 proposalType, address voter, address[] proposers, uint8 phase, uint8 status) returns() +func (_OpProposalManager *OpProposalManagerTransactorSession) VoteAndUpdateStatus(proposalID uint64, proposalType uint8, voter common.Address, proposers []common.Address, phase uint8, status uint8) (*types.Transaction, error) { + return _OpProposalManager.Contract.VoteAndUpdateStatus(&_OpProposalManager.TransactOpts, proposalID, proposalType, voter, proposers, phase, status) +} + +// OpProposalManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OpProposalManager contract. +type OpProposalManagerInitializedIterator struct { + Event *OpProposalManagerInitialized // 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 *OpProposalManagerInitializedIterator) 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(OpProposalManagerInitialized) + 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(OpProposalManagerInitialized) + 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 *OpProposalManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpProposalManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpProposalManagerInitialized represents a Initialized event raised by the OpProposalManager contract. +type OpProposalManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_OpProposalManager *OpProposalManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*OpProposalManagerInitializedIterator, error) { + + logs, sub, err := _OpProposalManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &OpProposalManagerInitializedIterator{contract: _OpProposalManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_OpProposalManager *OpProposalManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OpProposalManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _OpProposalManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OpProposalManagerInitialized) + if err := _OpProposalManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_OpProposalManager *OpProposalManagerFilterer) ParseInitialized(log types.Log) (*OpProposalManagerInitialized, error) { + event := new(OpProposalManagerInitialized) + if err := _OpProposalManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpProposalManagerRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the OpProposalManager contract. +type OpProposalManagerRoleAdminChangedIterator struct { + Event *OpProposalManagerRoleAdminChanged // 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 *OpProposalManagerRoleAdminChangedIterator) 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(OpProposalManagerRoleAdminChanged) + 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(OpProposalManagerRoleAdminChanged) + 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 *OpProposalManagerRoleAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpProposalManagerRoleAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpProposalManagerRoleAdminChanged represents a RoleAdminChanged event raised by the OpProposalManager contract. +type OpProposalManagerRoleAdminChanged struct { + Role [32]byte + PreviousAdminRole [32]byte + NewAdminRole [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_OpProposalManager *OpProposalManagerFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*OpProposalManagerRoleAdminChangedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _OpProposalManager.contract.FilterLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return &OpProposalManagerRoleAdminChangedIterator{contract: _OpProposalManager.contract, event: "RoleAdminChanged", logs: logs, sub: sub}, nil +} + +// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_OpProposalManager *OpProposalManagerFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *OpProposalManagerRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _OpProposalManager.contract.WatchLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + 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(OpProposalManagerRoleAdminChanged) + if err := _OpProposalManager.contract.UnpackLog(event, "RoleAdminChanged", 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 +} + +// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_OpProposalManager *OpProposalManagerFilterer) ParseRoleAdminChanged(log types.Log) (*OpProposalManagerRoleAdminChanged, error) { + event := new(OpProposalManagerRoleAdminChanged) + if err := _OpProposalManager.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpProposalManagerRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the OpProposalManager contract. +type OpProposalManagerRoleGrantedIterator struct { + Event *OpProposalManagerRoleGranted // 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 *OpProposalManagerRoleGrantedIterator) 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(OpProposalManagerRoleGranted) + 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(OpProposalManagerRoleGranted) + 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 *OpProposalManagerRoleGrantedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpProposalManagerRoleGrantedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpProposalManagerRoleGranted represents a RoleGranted event raised by the OpProposalManager contract. +type OpProposalManagerRoleGranted struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpProposalManager *OpProposalManagerFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*OpProposalManagerRoleGrantedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpProposalManager.contract.FilterLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &OpProposalManagerRoleGrantedIterator{contract: _OpProposalManager.contract, event: "RoleGranted", logs: logs, sub: sub}, nil +} + +// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpProposalManager *OpProposalManagerFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *OpProposalManagerRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpProposalManager.contract.WatchLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OpProposalManagerRoleGranted) + if err := _OpProposalManager.contract.UnpackLog(event, "RoleGranted", 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 +} + +// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpProposalManager *OpProposalManagerFilterer) ParseRoleGranted(log types.Log) (*OpProposalManagerRoleGranted, error) { + event := new(OpProposalManagerRoleGranted) + if err := _OpProposalManager.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// OpProposalManagerRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the OpProposalManager contract. +type OpProposalManagerRoleRevokedIterator struct { + Event *OpProposalManagerRoleRevoked // 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 *OpProposalManagerRoleRevokedIterator) 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(OpProposalManagerRoleRevoked) + 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(OpProposalManagerRoleRevoked) + 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 *OpProposalManagerRoleRevokedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *OpProposalManagerRoleRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// OpProposalManagerRoleRevoked represents a RoleRevoked event raised by the OpProposalManager contract. +type OpProposalManagerRoleRevoked struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpProposalManager *OpProposalManagerFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*OpProposalManagerRoleRevokedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpProposalManager.contract.FilterLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &OpProposalManagerRoleRevokedIterator{contract: _OpProposalManager.contract, event: "RoleRevoked", logs: logs, sub: sub}, nil +} + +// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpProposalManager *OpProposalManagerFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *OpProposalManagerRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _OpProposalManager.contract.WatchLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(OpProposalManagerRoleRevoked) + if err := _OpProposalManager.contract.UnpackLog(event, "RoleRevoked", 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 +} + +// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_OpProposalManager *OpProposalManagerFilterer) ParseRoleRevoked(log types.Log) (*OpProposalManagerRoleRevoked, error) { + event := new(OpProposalManagerRoleRevoked) + if err := _OpProposalManager.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/contract/op/proposer.go b/pkg/contract/op/proposer.go new file mode 100644 index 0000000..72f76d6 --- /dev/null +++ b/pkg/contract/op/proposer.go @@ -0,0 +1,1206 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package op + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ProposerMetaData contains all meta data concerning the Proposer contract. +var ProposerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"addProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allProposers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"isProposer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proposers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"proposersList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"name\":\"removeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", +} + +// ProposerABI is the input ABI used to generate the binding from. +// Deprecated: Use ProposerMetaData.ABI instead. +var ProposerABI = ProposerMetaData.ABI + +// Proposer is an auto generated Go binding around an Ethereum contract. +type Proposer struct { + ProposerCaller // Read-only binding to the contract + ProposerTransactor // Write-only binding to the contract + ProposerFilterer // Log filterer for contract events +} + +// ProposerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ProposerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProposerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ProposerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProposerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ProposerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProposerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ProposerSession struct { + Contract *Proposer // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProposerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ProposerCallerSession struct { + Contract *ProposerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ProposerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ProposerTransactorSession struct { + Contract *ProposerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProposerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ProposerRaw struct { + Contract *Proposer // Generic contract binding to access the raw methods on +} + +// ProposerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ProposerCallerRaw struct { + Contract *ProposerCaller // Generic read-only contract binding to access the raw methods on +} + +// ProposerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ProposerTransactorRaw struct { + Contract *ProposerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewProposer creates a new instance of Proposer, bound to a specific deployed contract. +func NewProposer(address common.Address, backend bind.ContractBackend) (*Proposer, error) { + contract, err := bindProposer(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Proposer{ProposerCaller: ProposerCaller{contract: contract}, ProposerTransactor: ProposerTransactor{contract: contract}, ProposerFilterer: ProposerFilterer{contract: contract}}, nil +} + +// NewProposerCaller creates a new read-only instance of Proposer, bound to a specific deployed contract. +func NewProposerCaller(address common.Address, caller bind.ContractCaller) (*ProposerCaller, error) { + contract, err := bindProposer(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ProposerCaller{contract: contract}, nil +} + +// NewProposerTransactor creates a new write-only instance of Proposer, bound to a specific deployed contract. +func NewProposerTransactor(address common.Address, transactor bind.ContractTransactor) (*ProposerTransactor, error) { + contract, err := bindProposer(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ProposerTransactor{contract: contract}, nil +} + +// NewProposerFilterer creates a new log filterer instance of Proposer, bound to a specific deployed contract. +func NewProposerFilterer(address common.Address, filterer bind.ContractFilterer) (*ProposerFilterer, error) { + contract, err := bindProposer(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ProposerFilterer{contract: contract}, nil +} + +// bindProposer binds a generic wrapper to an already deployed contract. +func bindProposer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ProposerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Proposer *ProposerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Proposer.Contract.ProposerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Proposer *ProposerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proposer.Contract.ProposerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Proposer *ProposerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Proposer.Contract.ProposerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Proposer *ProposerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Proposer.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Proposer *ProposerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proposer.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Proposer *ProposerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Proposer.Contract.contract.Transact(opts, method, params...) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_Proposer *ProposerCaller) ADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_Proposer *ProposerSession) ADMINROLE() ([32]byte, error) { + return _Proposer.Contract.ADMINROLE(&_Proposer.CallOpts) +} + +// ADMINROLE is a free data retrieval call binding the contract method 0x75b238fc. +// +// Solidity: function ADMIN_ROLE() view returns(bytes32) +func (_Proposer *ProposerCallerSession) ADMINROLE() ([32]byte, error) { + return _Proposer.Contract.ADMINROLE(&_Proposer.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Proposer *ProposerCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "DEFAULT_ADMIN_ROLE") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Proposer *ProposerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Proposer.Contract.DEFAULTADMINROLE(&_Proposer.CallOpts) +} + +// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf. +// +// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32) +func (_Proposer *ProposerCallerSession) DEFAULTADMINROLE() ([32]byte, error) { + return _Proposer.Contract.DEFAULTADMINROLE(&_Proposer.CallOpts) +} + +// AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. +// +// Solidity: function allProposers() view returns(address[]) +func (_Proposer *ProposerCaller) AllProposers(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "allProposers") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. +// +// Solidity: function allProposers() view returns(address[]) +func (_Proposer *ProposerSession) AllProposers() ([]common.Address, error) { + return _Proposer.Contract.AllProposers(&_Proposer.CallOpts) +} + +// AllProposers is a free data retrieval call binding the contract method 0x239e1e3d. +// +// Solidity: function allProposers() view returns(address[]) +func (_Proposer *ProposerCallerSession) AllProposers() ([]common.Address, error) { + return _Proposer.Contract.AllProposers(&_Proposer.CallOpts) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Proposer *ProposerCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "getRoleAdmin", role) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Proposer *ProposerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Proposer.Contract.GetRoleAdmin(&_Proposer.CallOpts, role) +} + +// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3. +// +// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32) +func (_Proposer *ProposerCallerSession) GetRoleAdmin(role [32]byte) ([32]byte, error) { + return _Proposer.Contract.GetRoleAdmin(&_Proposer.CallOpts, role) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Proposer *ProposerCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "hasRole", role, account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Proposer *ProposerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Proposer.Contract.HasRole(&_Proposer.CallOpts, role, account) +} + +// HasRole is a free data retrieval call binding the contract method 0x91d14854. +// +// Solidity: function hasRole(bytes32 role, address account) view returns(bool) +func (_Proposer *ProposerCallerSession) HasRole(role [32]byte, account common.Address) (bool, error) { + return _Proposer.Contract.HasRole(&_Proposer.CallOpts, role, account) +} + +// IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. +// +// Solidity: function isProposer(address sender) view returns(bool) +func (_Proposer *ProposerCaller) IsProposer(opts *bind.CallOpts, sender common.Address) (bool, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "isProposer", sender) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. +// +// Solidity: function isProposer(address sender) view returns(bool) +func (_Proposer *ProposerSession) IsProposer(sender common.Address) (bool, error) { + return _Proposer.Contract.IsProposer(&_Proposer.CallOpts, sender) +} + +// IsProposer is a free data retrieval call binding the contract method 0x74ec29a0. +// +// Solidity: function isProposer(address sender) view returns(bool) +func (_Proposer *ProposerCallerSession) IsProposer(sender common.Address) (bool, error) { + return _Proposer.Contract.IsProposer(&_Proposer.CallOpts, sender) +} + +// Proposers is a free data retrieval call binding the contract method 0x18177497. +// +// Solidity: function proposers(address ) view returns(bool) +func (_Proposer *ProposerCaller) Proposers(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "proposers", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Proposers is a free data retrieval call binding the contract method 0x18177497. +// +// Solidity: function proposers(address ) view returns(bool) +func (_Proposer *ProposerSession) Proposers(arg0 common.Address) (bool, error) { + return _Proposer.Contract.Proposers(&_Proposer.CallOpts, arg0) +} + +// Proposers is a free data retrieval call binding the contract method 0x18177497. +// +// Solidity: function proposers(address ) view returns(bool) +func (_Proposer *ProposerCallerSession) Proposers(arg0 common.Address) (bool, error) { + return _Proposer.Contract.Proposers(&_Proposer.CallOpts, arg0) +} + +// ProposersList is a free data retrieval call binding the contract method 0x5ad97dd8. +// +// Solidity: function proposersList(uint256 ) view returns(address) +func (_Proposer *ProposerCaller) ProposersList(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "proposersList", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ProposersList is a free data retrieval call binding the contract method 0x5ad97dd8. +// +// Solidity: function proposersList(uint256 ) view returns(address) +func (_Proposer *ProposerSession) ProposersList(arg0 *big.Int) (common.Address, error) { + return _Proposer.Contract.ProposersList(&_Proposer.CallOpts, arg0) +} + +// ProposersList is a free data retrieval call binding the contract method 0x5ad97dd8. +// +// Solidity: function proposersList(uint256 ) view returns(address) +func (_Proposer *ProposerCallerSession) ProposersList(arg0 *big.Int) (common.Address, error) { + return _Proposer.Contract.ProposersList(&_Proposer.CallOpts, arg0) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Proposer *ProposerCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _Proposer.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Proposer *ProposerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Proposer.Contract.SupportsInterface(&_Proposer.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_Proposer *ProposerCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _Proposer.Contract.SupportsInterface(&_Proposer.CallOpts, interfaceId) +} + +// AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. +// +// Solidity: function addProposer(address proposer) returns() +func (_Proposer *ProposerTransactor) AddProposer(opts *bind.TransactOpts, proposer common.Address) (*types.Transaction, error) { + return _Proposer.contract.Transact(opts, "addProposer", proposer) +} + +// AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. +// +// Solidity: function addProposer(address proposer) returns() +func (_Proposer *ProposerSession) AddProposer(proposer common.Address) (*types.Transaction, error) { + return _Proposer.Contract.AddProposer(&_Proposer.TransactOpts, proposer) +} + +// AddProposer is a paid mutator transaction binding the contract method 0xb03cd418. +// +// Solidity: function addProposer(address proposer) returns() +func (_Proposer *ProposerTransactorSession) AddProposer(proposer common.Address) (*types.Transaction, error) { + return _Proposer.Contract.AddProposer(&_Proposer.TransactOpts, proposer) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Proposer *ProposerTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Proposer.contract.Transact(opts, "grantRole", role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Proposer *ProposerSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Proposer.Contract.GrantRole(&_Proposer.TransactOpts, role, account) +} + +// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d. +// +// Solidity: function grantRole(bytes32 role, address account) returns() +func (_Proposer *ProposerTransactorSession) GrantRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Proposer.Contract.GrantRole(&_Proposer.TransactOpts, role, account) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Proposer *ProposerTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proposer.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Proposer *ProposerSession) Initialize() (*types.Transaction, error) { + return _Proposer.Contract.Initialize(&_Proposer.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_Proposer *ProposerTransactorSession) Initialize() (*types.Transaction, error) { + return _Proposer.Contract.Initialize(&_Proposer.TransactOpts) +} + +// RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. +// +// Solidity: function removeProposer(address proposer) returns() +func (_Proposer *ProposerTransactor) RemoveProposer(opts *bind.TransactOpts, proposer common.Address) (*types.Transaction, error) { + return _Proposer.contract.Transact(opts, "removeProposer", proposer) +} + +// RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. +// +// Solidity: function removeProposer(address proposer) returns() +func (_Proposer *ProposerSession) RemoveProposer(proposer common.Address) (*types.Transaction, error) { + return _Proposer.Contract.RemoveProposer(&_Proposer.TransactOpts, proposer) +} + +// RemoveProposer is a paid mutator transaction binding the contract method 0x09d632d3. +// +// Solidity: function removeProposer(address proposer) returns() +func (_Proposer *ProposerTransactorSession) RemoveProposer(proposer common.Address) (*types.Transaction, error) { + return _Proposer.Contract.RemoveProposer(&_Proposer.TransactOpts, proposer) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Proposer *ProposerTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Proposer.contract.Transact(opts, "renounceRole", role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Proposer *ProposerSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Proposer.Contract.RenounceRole(&_Proposer.TransactOpts, role, callerConfirmation) +} + +// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe. +// +// Solidity: function renounceRole(bytes32 role, address callerConfirmation) returns() +func (_Proposer *ProposerTransactorSession) RenounceRole(role [32]byte, callerConfirmation common.Address) (*types.Transaction, error) { + return _Proposer.Contract.RenounceRole(&_Proposer.TransactOpts, role, callerConfirmation) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Proposer *ProposerTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error) { + return _Proposer.contract.Transact(opts, "revokeRole", role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Proposer *ProposerSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Proposer.Contract.RevokeRole(&_Proposer.TransactOpts, role, account) +} + +// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f. +// +// Solidity: function revokeRole(bytes32 role, address account) returns() +func (_Proposer *ProposerTransactorSession) RevokeRole(role [32]byte, account common.Address) (*types.Transaction, error) { + return _Proposer.Contract.RevokeRole(&_Proposer.TransactOpts, role, account) +} + +// ProposerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Proposer contract. +type ProposerInitializedIterator struct { + Event *ProposerInitialized // 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 *ProposerInitializedIterator) 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(ProposerInitialized) + 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(ProposerInitialized) + 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 *ProposerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProposerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProposerInitialized represents a Initialized event raised by the Proposer contract. +type ProposerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Proposer *ProposerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ProposerInitializedIterator, error) { + + logs, sub, err := _Proposer.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ProposerInitializedIterator{contract: _Proposer.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Proposer *ProposerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ProposerInitialized) (event.Subscription, error) { + + logs, sub, err := _Proposer.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProposerInitialized) + if err := _Proposer.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Proposer *ProposerFilterer) ParseInitialized(log types.Log) (*ProposerInitialized, error) { + event := new(ProposerInitialized) + if err := _Proposer.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ProposerRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the Proposer contract. +type ProposerRoleAdminChangedIterator struct { + Event *ProposerRoleAdminChanged // 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 *ProposerRoleAdminChangedIterator) 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(ProposerRoleAdminChanged) + 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(ProposerRoleAdminChanged) + 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 *ProposerRoleAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProposerRoleAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProposerRoleAdminChanged represents a RoleAdminChanged event raised by the Proposer contract. +type ProposerRoleAdminChanged struct { + Role [32]byte + PreviousAdminRole [32]byte + NewAdminRole [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Proposer *ProposerFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*ProposerRoleAdminChangedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Proposer.contract.FilterLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + if err != nil { + return nil, err + } + return &ProposerRoleAdminChangedIterator{contract: _Proposer.contract, event: "RoleAdminChanged", logs: logs, sub: sub}, nil +} + +// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Proposer *ProposerFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *ProposerRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var previousAdminRoleRule []interface{} + for _, previousAdminRoleItem := range previousAdminRole { + previousAdminRoleRule = append(previousAdminRoleRule, previousAdminRoleItem) + } + var newAdminRoleRule []interface{} + for _, newAdminRoleItem := range newAdminRole { + newAdminRoleRule = append(newAdminRoleRule, newAdminRoleItem) + } + + logs, sub, err := _Proposer.contract.WatchLogs(opts, "RoleAdminChanged", roleRule, previousAdminRoleRule, newAdminRoleRule) + 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(ProposerRoleAdminChanged) + if err := _Proposer.contract.UnpackLog(event, "RoleAdminChanged", 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 +} + +// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff. +// +// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole) +func (_Proposer *ProposerFilterer) ParseRoleAdminChanged(log types.Log) (*ProposerRoleAdminChanged, error) { + event := new(ProposerRoleAdminChanged) + if err := _Proposer.contract.UnpackLog(event, "RoleAdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ProposerRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the Proposer contract. +type ProposerRoleGrantedIterator struct { + Event *ProposerRoleGranted // 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 *ProposerRoleGrantedIterator) 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(ProposerRoleGranted) + 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(ProposerRoleGranted) + 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 *ProposerRoleGrantedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProposerRoleGrantedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProposerRoleGranted represents a RoleGranted event raised by the Proposer contract. +type ProposerRoleGranted struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Proposer *ProposerFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*ProposerRoleGrantedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Proposer.contract.FilterLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &ProposerRoleGrantedIterator{contract: _Proposer.contract, event: "RoleGranted", logs: logs, sub: sub}, nil +} + +// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Proposer *ProposerFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *ProposerRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Proposer.contract.WatchLogs(opts, "RoleGranted", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProposerRoleGranted) + if err := _Proposer.contract.UnpackLog(event, "RoleGranted", 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 +} + +// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d. +// +// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender) +func (_Proposer *ProposerFilterer) ParseRoleGranted(log types.Log) (*ProposerRoleGranted, error) { + event := new(ProposerRoleGranted) + if err := _Proposer.contract.UnpackLog(event, "RoleGranted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ProposerRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the Proposer contract. +type ProposerRoleRevokedIterator struct { + Event *ProposerRoleRevoked // 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 *ProposerRoleRevokedIterator) 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(ProposerRoleRevoked) + 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(ProposerRoleRevoked) + 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 *ProposerRoleRevokedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProposerRoleRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProposerRoleRevoked represents a RoleRevoked event raised by the Proposer contract. +type ProposerRoleRevoked struct { + Role [32]byte + Account common.Address + Sender common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Proposer *ProposerFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*ProposerRoleRevokedIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Proposer.contract.FilterLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &ProposerRoleRevokedIterator{contract: _Proposer.contract, event: "RoleRevoked", logs: logs, sub: sub}, nil +} + +// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Proposer *ProposerFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *ProposerRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _Proposer.contract.WatchLogs(opts, "RoleRevoked", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProposerRoleRevoked) + if err := _Proposer.contract.UnpackLog(event, "RoleRevoked", 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 +} + +// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b. +// +// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender) +func (_Proposer *ProposerFilterer) ParseRoleRevoked(log types.Log) (*ProposerRoleRevoked, error) { + event := new(ProposerRoleRevoked) + if err := _Proposer.contract.UnpackLog(event, "RoleRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/contract/committer.go b/pkg/contract/zk/committer.go similarity index 99% rename from pkg/contract/committer.go rename to pkg/contract/zk/committer.go index 200784c..572c468 100644 --- a/pkg/contract/committer.go +++ b/pkg/contract/zk/committer.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package contract +package zk import ( "errors" diff --git a/pkg/contract/sequence.go b/pkg/contract/zk/sequence.go similarity index 99% rename from pkg/contract/sequence.go rename to pkg/contract/zk/sequence.go index 67b5fdb..48030c2 100644 --- a/pkg/contract/sequence.go +++ b/pkg/contract/zk/sequence.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package contract +package zk import ( "errors" diff --git a/pkg/contract/verify.go b/pkg/contract/zk/verify.go similarity index 99% rename from pkg/contract/verify.go rename to pkg/contract/zk/verify.go index b00d541..80aa08d 100644 --- a/pkg/contract/verify.go +++ b/pkg/contract/zk/verify.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package contract +package zk import ( "errors" diff --git a/pkg/merkle/merklenode_test.go b/pkg/merkle/merklenode_test.go index 408c8d7..f739294 100644 --- a/pkg/merkle/merklenode_test.go +++ b/pkg/merkle/merklenode_test.go @@ -34,15 +34,15 @@ func TestMerkleNode(t *testing.T) { newStateRoots := make([]string, 0) newStateRoots = append(newStateRoots, "e5f3471831c881c8f34ea32ab485124a09a0f35f010528eb59c51f82e3805df3") newStateRoots = append(newStateRoots, "34f02ed77cd04345bf84d0f4c8257f0d10701a1f3a8f8c0affc1af9a6301a896") - newStateRoots = append(newStateRoots, "34f02ed77cd04345bf84d0f4c8257f0d10701a1f3a8f8c0affc1af9a6301a896") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") - newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "34f02ed77cd04345bf84d0f4c8257f0d10701a1f3a8f8c0affc1af9a6301a896") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") + //newStateRoots = append(newStateRoots, "dd813c06390aa63c284c240ad3746e96db28f9ef5e4c4ea76409a10f839ba55e") stateBlocks := GenerateBlocks(newStateRoots) stateTree, _ := mt.New(nil, stateBlocks) From fae6c86a33c1b9a57d42b2f703514b91976b44fa Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 16 Apr 2024 20:39:32 +0800 Subject: [PATCH 09/29] fix blob comitter --- internal/handler/op_committer_blob.go | 92 ++++++++------------------- 1 file changed, 25 insertions(+), 67 deletions(-) diff --git a/internal/handler/op_committer_blob.go b/internal/handler/op_committer_blob.go index 40736f0..8b51db2 100644 --- a/internal/handler/op_committer_blob.go +++ b/internal/handler/op_committer_blob.go @@ -33,7 +33,6 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { latestProposalID := lastProposal.ProposalID if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) - latestProposalID = latestProposalID + 1 // submit new proposal newTxsRootProposal, err := constructNewProposal(ctx, lastProposal) if err != nil { @@ -46,9 +45,10 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) } + continue } - if lastProposal.Status == schema.ProposalVotingStatus { + if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { voteAddress := ctx.B2NodeConfig.Address // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(ctx.B2NodeConfig.Address)) @@ -61,29 +61,38 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted: %s", voteAddress) continue } - // vote proposal return - _, err = verifyAndVotingProposal(ctx, lastProposal) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to find address voted or not: %s", err) - } - } - if lastProposal.Status == schema.ProposalTimeoutStatus { - proposal, err := resubmitTimeoutProposal(ctx, lastProposal) + tsp, err := constructTxsRootProposal(ctx, lastProposal.ProposalID, lastProposal.StartTimestamp, lastProposal.EndTimestamp) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal: %s", err.Error()) + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal to vote: %s", err.Error()) time.Sleep(3 * time.Second) continue } - _, err = ctx.OpCommitterClient.SubmitTxsRoot(proposal) + _, err = ctx.OpCommitterClient.SubmitTxsRoot(tsp) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal to vote: %s", err.Error()) } + continue } + time.Sleep(30 * time.Second) } +} +func constructTxsRootProposal(ctx *svc.ServiceContext, proposalID uint64, startTimestamp uint64, endTimestamp uint64) (*types.TxsRootProposal, error) { + var blob schema.BlobInfo + err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&blob).Error + if err != nil { + return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) + } + var blobs []schema.BlobInfo + err = ctx.DB.Where("block_time between ? and ?", startTimestamp, endTimestamp).Order("block_number").Find(&blobs).Error + if err != nil { + return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + return types.NewTxsRootProposal(proposalID, blobMerkleRoot, blobs), nil } func constructNewProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (*types.TxsRootProposal, error) { @@ -102,62 +111,11 @@ func constructNewProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxs latestStartTimestamp = lastProposal.EndTimestamp + 1 // plus 1 to exclude the last proposal end blob block latestEndTimestamp = lastProposal.EndTimestamp + ctx.Config.BlobIntervalTime } - - err := ctx.DB.Where("block_time > ?", latestEndTimestamp).Order("block_number").First(&blob).Error - if err != nil { - return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) - } - var blobs []schema.BlobInfo - err = ctx.DB.Where("block_time between ? and ?", latestStartTimestamp, latestEndTimestamp).Order("block_number").Find(&blobs).Error - if err != nil { - return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) - } - blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) - return types.NewTxsRootProposal(lastProposal.ProposalID+1, blobMerkleRoot, blobs), nil -} - -func verifyAndVotingProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (bool, error) { - var blob schema.BlobInfo - err := ctx.DB.Where("block_time >= ?", lastProposal.EndTimestamp).Order("block_number").First(&blob).Error - if err != nil { - return false, fmt.Errorf("[verifyAndVotingProposal]sync blob blocks is not completed: %s", errors.WithStack(err)) - } - var blobs []schema.BlobInfo - err = ctx.DB.Where("block_time between ? and ?", lastProposal.StartTimestamp, lastProposal.EndTimestamp).Order("block_number").Find(&blobs).Error - if err != nil { - return false, fmt.Errorf("[verifyAndVotingProposal]collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) - } - blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) - if blobMerkleRoot != lastProposal.TxsRoot { - return false, fmt.Errorf("[verifyAndVotingProposal]blobMerkleRoot verify failed") - } - voteProposal := &types.TxsRootProposal{ - ProposalID: lastProposal.ProposalID, - StartBlockNumber: lastProposal.StartBlockNumber, - EndBlockNumber: lastProposal.EndBlockNumber, - StartTimestamp: lastProposal.StartTimestamp, - EndTimestamp: lastProposal.EndTimestamp, - TxsRoot: blobMerkleRoot, - BlockList: lastProposal.BlockList, - } - - _, err = ctx.OpCommitterClient.SubmitTxsRoot(voteProposal) - if err != nil { - return false, fmt.Errorf("[verifyAndVotingProposal]vote proposal error: %s", err.Error()) - } - return true, nil -} - -func resubmitTimeoutProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (*types.TxsRootProposal, error) { - beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) - if err != nil { - return nil, fmt.Errorf("[resubmitTimeoutProposal] Try to get last proposal from contract: %s", err.Error()) - } - proposal, err := constructNewProposal(ctx, beforeLastProposal) + tsp, err := constructTxsRootProposal(ctx, lastProposal.ProposalID+1, latestStartTimestamp, latestEndTimestamp) if err != nil { - return nil, fmt.Errorf("[resubmitTimeoutProposal] construct new proposal err: %s", err.Error()) + return nil, fmt.Errorf("construct txs root proposal failed, err: %s", errors.WithStack(err)) } - return proposal, nil + return tsp, nil } func GetBlobsMerkleRoot(blobs []schema.BlobInfo) (string, error) { From 6a4583ec183a8d43f31c5aac35aef568c825130e Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 16 Apr 2024 20:40:46 +0800 Subject: [PATCH 10/29] fix err --- internal/handler/op_committer_blob.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/handler/op_committer_blob.go b/internal/handler/op_committer_blob.go index 8b51db2..476c7a4 100644 --- a/internal/handler/op_committer_blob.go +++ b/internal/handler/op_committer_blob.go @@ -21,7 +21,7 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { // check address res, err := ctx.OpCommitterClient.Proposer.IsProposer(&bind.CallOpts{}, common.HexToAddress(ctx.B2NodeConfig.Address)) if err != nil || !res { - panic(ctx.B2NodeConfig.Address + " has no right to processing, please contact admin") + panic(err) } for { lastProposal, err := ctx.OpCommitterClient.ProposalManager.GetLastTxsRootProposal(&bind.CallOpts{}) From 2f292eb0c5810d697ddad7b100bf8be4ebe94f39 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 17 Apr 2024 16:08:30 +0800 Subject: [PATCH 11/29] add commit and vote dshash --- internal/handler/op_committer_blob.go | 114 ++++++++++++++++++++++++-- internal/schema/proposal_status.go | 4 + internal/svc/svc.go | 18 ++++ internal/types/config.go | 1 + internal/types/ds.go | 57 +++++++++++++ pkg/b2node/committer.go | 11 +++ pkg/ds/ds.go | 54 ++++++++++++ pkg/ds/ds_test.go | 13 +++ 8 files changed, 264 insertions(+), 8 deletions(-) create mode 100644 internal/types/ds.go create mode 100644 pkg/ds/ds.go create mode 100644 pkg/ds/ds_test.go diff --git a/internal/handler/op_committer_blob.go b/internal/handler/op_committer_blob.go index 476c7a4..8772997 100644 --- a/internal/handler/op_committer_blob.go +++ b/internal/handler/op_committer_blob.go @@ -3,6 +3,7 @@ package handler import ( "crypto/sha256" "encoding/hex" + "encoding/json" "fmt" "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" @@ -31,10 +32,11 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { continue } latestProposalID := lastProposal.ProposalID + voteAddress := ctx.B2NodeConfig.Address if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) // submit new proposal - newTxsRootProposal, err := constructNewProposal(ctx, lastProposal) + newTxsRootProposal, err := constructNextProposal(ctx, lastProposal) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal: %s", err.Error()) time.Sleep(3 * time.Second) @@ -49,26 +51,39 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { } if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { - voteAddress := ctx.B2NodeConfig.Address // check address voted or not - phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(ctx.B2NodeConfig.Address)) + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to find address voted or not: %s", err) time.Sleep(3 * time.Second) continue } if phase { - log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted: %s", voteAddress) + log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted in voting status: %s", voteAddress) continue } + var voteProposalStartTimestamp uint64 + var voteProposalEndTimestamp uint64 + if lastProposal.ProposalID == 1 { + voteProposalStartTimestamp = lastProposal.StartTimestamp + voteProposalEndTimestamp = voteProposalStartTimestamp + ctx.Config.BlobIntervalTime + } else { + beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get before last proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + voteProposalStartTimestamp = beforeLastProposal.EndTimestamp + 1 + voteProposalEndTimestamp = voteProposalStartTimestamp + ctx.Config.BlobIntervalTime + } - tsp, err := constructTxsRootProposal(ctx, lastProposal.ProposalID, lastProposal.StartTimestamp, lastProposal.EndTimestamp) + tsp, err := constructTxsRootProposal(ctx, lastProposal.ProposalID, voteProposalStartTimestamp, voteProposalEndTimestamp) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal to vote: %s", err.Error()) time.Sleep(3 * time.Second) continue } - _, err = ctx.OpCommitterClient.SubmitTxsRoot(tsp) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal to vote: %s", err.Error()) @@ -76,10 +91,90 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { continue } + if lastProposal.Status == schema.ProposalPendingStatus { + + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal][IsVotedOntxsRootDSTxPhase] is failed : %s", err) + time.Sleep(3 * time.Second) + continue + } + if phase { + log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted in pending status: %s", voteAddress) + continue + } + if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { + blobs, err := GetBlobsByBlockListFromDB(ctx, lastProposal.BlockList) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from db: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + dsProposal := types.NewDsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) + dsJson, err := dsProposal.MarshalJson() + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to marshal ds proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + dsTxID, err := ctx.DecentralizedStore.StoreTxsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to store ds proposal: %s", err.Error()) + } + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, dsTxID) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) + continue + } + } + if lastProposal.Winner != common.HexToAddress(ctx.B2NodeConfig.Address) { + blobs, err := ctx.DecentralizedStore.QueryTxsByTxID(lastProposal.DsTxHash) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from ds: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + var dsProposal types.DsProposal + err = json.Unmarshal(blobs, &dsProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to unmarshal ds proposal: %s", err.Error()) + continue + } + dbBlobs, err := dsProposal.GetDBBlobInfos() + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from ds: %s", err.Error()) + continue + } + verifyTxsRootHash, err := GetBlobsMerkleRoot(dbBlobs) + + if verifyTxsRootHash != lastProposal.TxsRoot { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to verify blobs from ds: %s", err.Error()) + continue + } + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) + continue + } + } + } time.Sleep(30 * time.Second) } } +func GetBlobsByBlockListFromDB(ctx *svc.ServiceContext, blockList []uint64) ([]schema.BlobInfo, error) { + where := map[string]interface{}{} + where["block_number"] = blockList + + var blobs []schema.BlobInfo + err := ctx.DB.Where(where).Find(&blobs).Error + if err != nil { + return nil, fmt.Errorf("[GetBlobsByBlockListFromDB] Try to get blobs from db: %s", err.Error()) + } + return blobs, nil +} + func constructTxsRootProposal(ctx *svc.ServiceContext, proposalID uint64, startTimestamp uint64, endTimestamp uint64) (*types.TxsRootProposal, error) { var blob schema.BlobInfo err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&blob).Error @@ -92,10 +187,13 @@ func constructTxsRootProposal(ctx *svc.ServiceContext, proposalID uint64, startT return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) } blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + if err != nil { + return nil, fmt.Errorf("getting the blob merkle root is failed. err : %s", errors.WithStack(err)) + } return types.NewTxsRootProposal(proposalID, blobMerkleRoot, blobs), nil } -func constructNewProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (*types.TxsRootProposal, error) { +func constructNextProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) (*types.TxsRootProposal, error) { var blob schema.BlobInfo var latestEndTimestamp uint64 var latestStartTimestamp uint64 @@ -105,8 +203,8 @@ func constructNewProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxs if err != nil { return nil, fmt.Errorf("find original blob block error: %s", errors.WithStack(err)) } - latestEndTimestamp = blob.BlockTime + ctx.Config.BlobIntervalTime latestStartTimestamp = blob.BlockTime + latestEndTimestamp = blob.BlockTime + ctx.Config.BlobIntervalTime } else { latestStartTimestamp = lastProposal.EndTimestamp + 1 // plus 1 to exclude the last proposal end blob block latestEndTimestamp = lastProposal.EndTimestamp + ctx.Config.BlobIntervalTime diff --git a/internal/schema/proposal_status.go b/internal/schema/proposal_status.go index 1358d67..928534a 100644 --- a/internal/schema/proposal_status.go +++ b/internal/schema/proposal_status.go @@ -6,4 +6,8 @@ const ( ProposalCommitting = 2 // 2 Proposer can submit bitcoin tx for the proposal ProposalSucceedStatus = 3 // 3 Proposal is success ProposalTimeoutStatus = 4 // 4 Proposal is timed out + + ProposalTypeStateRoot = 0 + ProposalTypeTxsRoot = 1 + DsTypeArWeave = 0 ) diff --git a/internal/svc/svc.go b/internal/svc/svc.go index 596d8c6..84fccc1 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -6,11 +6,13 @@ import ( "github.com/b2network/b2committer/pkg/beacon" "github.com/b2network/b2committer/pkg/client" "github.com/b2network/b2committer/pkg/contract/op" + "github.com/b2network/b2committer/pkg/ds" "github.com/b2network/b2committer/pkg/log" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/everFinance/goar" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -35,6 +37,7 @@ type ServiceContext struct { SyncedBlobBlockNumber int64 SyncedBlobBlockHash common.Hash OpCommitterClient *b2node.OpCommitterClient + DecentralizedStore ds.DecentralizedStore } func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2nodeConfig *types.B2NODEConfig) *ServiceContext { @@ -101,5 +104,20 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 BlobDataSource: bds, OpCommitterClient: opCommitterClient, } + + dsType := cfg.DSType + if dsType == "" { + panic("Invalid dsType") + } + if dsType == "arweave" { + if cfg.ArweaveRPC == "" { + panic("Invalid arweave rpc") + } + if cfg.ArweaveWallet == "" { + panic("Invalid arweaveWallet path") + } + arClient := goar.NewClient(cfg.ArweaveRPC) + svc.DecentralizedStore = ds.NewArWeave(cfg.ArweaveWallet, cfg.ArweaveRPC, arClient) + } return svc } diff --git a/internal/types/config.go b/internal/types/config.go index 08c4389..8c9373e 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -30,6 +30,7 @@ type Config struct { LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` BatchPath string `env:"BATCH_PATH" envDefault:"batchFile"` + DSType string `env:"DSTYPE" envDefault:"arweave"` ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"./wallet/account.json"` ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` } diff --git a/internal/types/ds.go b/internal/types/ds.go new file mode 100644 index 0000000..04b90e9 --- /dev/null +++ b/internal/types/ds.go @@ -0,0 +1,57 @@ +package types + +import ( + "encoding/json" + "github.com/b2network/b2committer/internal/schema" +) + +type DsProposal struct { + ChainID int64 + ProposalID uint64 + TxsRoot string + Blobs *[]DsBlob +} + +type DsBlob struct { + BlockID int64 + Blob string +} + +func NewDsProposal(chainID int64, proposalID uint64, txsRoot string, blobs []schema.BlobInfo) *DsProposal { + return &DsProposal{ + ChainID: chainID, + ProposalID: proposalID, + TxsRoot: txsRoot, + Blobs: convertBlobToDsBlob(blobs), + } +} + +func convertBlobToDsBlob(blobs []schema.BlobInfo) *[]DsBlob { + var dsBlobs []DsBlob + for _, blob := range blobs { + dsBlobs = append(dsBlobs, DsBlob{ + BlockID: blob.BlockNumber, + Blob: blob.Blob, + }) + } + return &dsBlobs +} + +func (b *DsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { + var dbBlobs []schema.BlobInfo + for _, blob := range *b.Blobs { + dbBlobs = append(dbBlobs, schema.BlobInfo{ + BlockNumber: blob.BlockID, + Blob: blob.Blob, + }) + } + return dbBlobs, nil +} + +func (b *DsProposal) MarshalJson() ([]byte, error) { + marshal, err := json.Marshal(b) + if err != nil { + return nil, err + } + return marshal, nil +} diff --git a/pkg/b2node/committer.go b/pkg/b2node/committer.go index f88c8d1..71f594a 100644 --- a/pkg/b2node/committer.go +++ b/pkg/b2node/committer.go @@ -60,3 +60,14 @@ func (client *OpCommitterClient) SubmitTxsRoot(proposal *types.TxsRootProposal) } return tx, nil } + +func (client *OpCommitterClient) DsHash(proposalID uint64, proposalType uint64, dsType uint64, txsHash string) (*ethTypes.Transaction, error) { + tx, err := client.Committer.DsTxHash(&bind.TransactOpts{ + From: client.Auth.From, + Signer: client.Auth.Signer, + }, proposalID, proposalType, dsType, txsHash) + if err != nil { + return nil, err + } + return tx, nil +} diff --git a/pkg/ds/ds.go b/pkg/ds/ds.go new file mode 100644 index 0000000..8e8020b --- /dev/null +++ b/pkg/ds/ds.go @@ -0,0 +1,54 @@ +package ds + +import ( + "github.com/everFinance/goar" + "github.com/everFinance/goar/types" + "strconv" +) + +type DecentralizedStore interface { + StoreTxsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) + + QueryTxsByTxID(txID string) ([]byte, error) +} +type ArWeave struct { + URL string //rpc url + WalletPath string + Client *goar.Client +} + +func NewArWeave(url, walletPath string, client *goar.Client) *ArWeave { + return &ArWeave{ + URL: url, + WalletPath: walletPath, + Client: client, + } +} + +func (ar *ArWeave) StoreTxsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) { + tags := []types.Tag{ + {Name: "Content-Type", Value: "application/json"}, + {Name: "title", Value: "b2-batch"}, + {Name: "chainID", Value: strconv.FormatInt(chainID, 10)}, + {Name: "ProposalID", Value: strconv.FormatUint(proposalID, 10)}, + } + w, err := goar.NewWalletFromPath(ar.WalletPath, ar.URL) + if err != nil { + return "", err + } + arTx, err := w.SendData(txs, tags) + if err != nil { + return "", err + } + return arTx.ID, nil +} + +func (ar *ArWeave) QueryTxsByTxID(txID string) ([]byte, error) { + txs, err := ar.Client.GetTransactionData(txID, "json") + if err != nil { + return nil, err + } + return txs, nil +} + +var _ DecentralizedStore = (*ArWeave)(nil) diff --git a/pkg/ds/ds_test.go b/pkg/ds/ds_test.go new file mode 100644 index 0000000..6775c6e --- /dev/null +++ b/pkg/ds/ds_test.go @@ -0,0 +1,13 @@ +package ds + +import ( + "fmt" + "github.com/everFinance/goar" + "testing" +) + +func TestQueryTxsByTxID(t *testing.T) { + arClient := goar.NewClient("https://arweave.net") + txs, _ := arClient.GetTransactionData("5m16jdjzJpWAOrCd83CM9izkn8md1IYKcsOK2SMESDU", "json") + fmt.Println(string(txs)) +} From fc2cf5b3ad97241a674432a0e31d53b75d1e85d2 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:21:07 +0800 Subject: [PATCH 12/29] fix sync blob to local --- internal/handler/handler.go | 23 ++++++++--------------- internal/handler/op.go | 27 +++++++++++++++------------ internal/types/config.go | 4 ++-- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 87d9331..7db3f4f 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -7,21 +7,14 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - go LatestBlackNumber(ctx) - // sync blocks - go SyncBlock(ctx) - // sync events - go SyncEvent(ctx) + //go LatestBlackNumber(ctx) + //// sync blocks + //go SyncBlock(ctx) + //// sync events + //go SyncEvent(ctx) // query blob and store in local go QueryBlobOnChainAndStoreInLocal(ctx) - // execute committer - //go Committer(ctx) - //// check and inscribe - //go Inscribe(ctx) - //// check status - //go CheckStatusByContract(ctx) - //// sync proposal - //go SyncProposal(ctx) - //// sequence batches - //go SequenceBatches(ctx) + // commit and vote txs proposal + //go GetBlobsAndCommitProposal(ctx) + } diff --git a/internal/handler/op.go b/internal/handler/op.go index e10fe01..f825efa 100644 --- a/internal/handler/op.go +++ b/internal/handler/op.go @@ -15,7 +15,6 @@ import ( func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { time.Sleep(10 * time.Second) - blobNum := ctx.Config.InitBlobBlockNumber var dbBlob schema.BlobInfo var count int64 err := ctx.DB.Order("block_number desc").First(&dbBlob).Error @@ -39,10 +38,10 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { syncingBlobBlockNumber := ctx.SyncedBlobBlockNumber + 1 log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal] Try to sync block number: %d\n", syncingBlobBlockNumber) - if syncingBlobBlockNumber > ctx.LatestBlockNumber { - time.Sleep(3 * time.Second) - continue - } + //if syncingBlobBlockNumber > ctx.LatestBlockNumber { + // time.Sleep(3 * time.Second) + // continue + //} blockOnChain, err := ctx.RPC.BlockByNumber(context.Background(), big.NewInt(syncingBlobBlockNumber)) if err != nil { @@ -57,8 +56,8 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { blobInfos, err1 := ctx.BlobDataSource.GetBlobByBlockNum(context.Background(), blockOnChain.Number()) if errors.Is(err1, errcode.ErrNoBlobFoundInBlock) { - log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal]", err1.Error()) - ctx.SyncedBlobBlockNumber = syncingBlobBlockNumber + log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] %s", blockOnChain.Number(), err1.Error()) + ctx.SyncedBlobBlockNumber = blockOnChain.Number().Int64() ctx.SyncedBlobBlockHash = blockOnChain.Hash() continue } @@ -82,11 +81,11 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { time.Sleep(3 * time.Second) continue } - ctx.SyncedBlobBlockNumber = syncingBlobBlockNumber - ctx.SyncedBlobBlockHash = common.HexToHash(dbBlob.BlockHashHex) + ctx.SyncedBlobBlockNumber = blockOnChain.Number().Int64() + ctx.SyncedBlobBlockHash = blockOnChain.Hash() continue } else { - err := ctx.DB.Delete(&dbBlob, "block_number=?", blobNum).Error + err := ctx.DB.Delete(&dbBlob, "block_number=?", syncingBlobBlockNumber).Error if err != nil { log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] DB Delete error: %s", err.Error()) time.Sleep(3 * time.Second) @@ -96,7 +95,7 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { } for _, bif := range blobInfos { - err := ctx.DB.Create(&schema.BlobInfo{ + blob := &schema.BlobInfo{ BlockNumber: blockOnChain.Number().Int64(), BlockHashHex: blockOnChain.Hash().String(), BlockTime: blockOnChain.Time(), @@ -105,12 +104,16 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { BlobSideCarIndex: uint64(bif.BlobSidecar.Index), BlobSideCarCommitment: bif.BlobSidecar.KZGCommitment.String(), Blob: bif.BlobSidecar.Blob.String(), - }).Error + } + + err := ctx.DB.Save(blob).Error if err != nil { log.Errorf("[Handler.SyncBlock] DB Create SyncBlock error: %s\n", errors.WithStack(err)) time.Sleep(1 * time.Second) continue } } + ctx.SyncedBlobBlockNumber = blockOnChain.Number().Int64() + ctx.SyncedBlobBlockHash = blockOnChain.Hash() } } diff --git a/internal/types/config.go b/internal/types/config.go index 8c9373e..d5cef0f 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -14,7 +14,7 @@ type Config struct { MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` - RPCUrl string `env:"RPC_URL" envDefault:"https://1rpc.io/sepolia"` + RPCUrl string `env:"RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` BeaconChainRPCUrl string `env:"BEACON_CHAIN_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"4102885"` @@ -37,7 +37,7 @@ type Config struct { type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` - RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://1rpc.io/sepolia"` + RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x0484fE0888684b39B2cce0a1644e44dDFCAA0054"` OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0x6bA5d52CA1B931E89611995F53dde2E1f914b0a7"` From 30627817145bece40e79b1ec37b5d9d18f6b4a22 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:23:00 +0800 Subject: [PATCH 13/29] fix sync blob to local --- internal/handler/{op.go => sync_blob.go} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename internal/handler/{op.go => sync_blob.go} (97%) diff --git a/internal/handler/op.go b/internal/handler/sync_blob.go similarity index 97% rename from internal/handler/op.go rename to internal/handler/sync_blob.go index f825efa..850bf26 100644 --- a/internal/handler/op.go +++ b/internal/handler/sync_blob.go @@ -38,10 +38,10 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { syncingBlobBlockNumber := ctx.SyncedBlobBlockNumber + 1 log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal] Try to sync block number: %d\n", syncingBlobBlockNumber) - //if syncingBlobBlockNumber > ctx.LatestBlockNumber { - // time.Sleep(3 * time.Second) - // continue - //} + if syncingBlobBlockNumber > ctx.LatestBlockNumber { + time.Sleep(3 * time.Second) + continue + } blockOnChain, err := ctx.RPC.BlockByNumber(context.Background(), big.NewInt(syncingBlobBlockNumber)) if err != nil { From 29029f8521c7833d478e207771610b2bc225816e Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:09:04 +0800 Subject: [PATCH 14/29] fix sync blob to local --- internal/handler/checkstatus.go | 39 --- internal/handler/committer.go | 249 ------------------ internal/handler/committer_test.go | 51 ---- internal/handler/handler.go | 14 +- internal/handler/op_committer_stateroot.go | 131 +++++++++ ..._committer_blob.go => op_committer_txs.go} | 12 +- internal/handler/sequenceBatchers_test.go | 19 -- internal/handler/sequenceBatches.go | 199 -------------- internal/svc/svc.go | 9 +- internal/types/config.go | 9 +- internal/types/txs_root_proposal.go | 77 +++++- pkg/b2node/committer.go | 23 ++ pkg/b2node/committer_test.go | 36 ++- pkg/ds/ds.go | 18 +- pkg/ds/ds_test.go | 17 ++ 15 files changed, 314 insertions(+), 589 deletions(-) delete mode 100644 internal/handler/checkstatus.go delete mode 100644 internal/handler/committer.go delete mode 100644 internal/handler/committer_test.go create mode 100644 internal/handler/op_committer_stateroot.go rename internal/handler/{op_committer_blob.go => op_committer_txs.go} (93%) delete mode 100644 internal/handler/sequenceBatchers_test.go delete mode 100644 internal/handler/sequenceBatches.go diff --git a/internal/handler/checkstatus.go b/internal/handler/checkstatus.go deleted file mode 100644 index 40af04f..0000000 --- a/internal/handler/checkstatus.go +++ /dev/null @@ -1,39 +0,0 @@ -package handler - -import ( - "time" - - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/internal/svc" - "github.com/b2network/b2committer/pkg/log" - "github.com/pkg/errors" -) - -// CheckStatusByContract sync check proposal status -func CheckStatusByContract(ctx *svc.ServiceContext) { - for { - proposal, err := ctx.NodeClient.QueryLastProposal() - if err != nil { - log.Errorf("[Handler.CheckStatusByContract][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) - continue - } - proposalContract, err := ctx.NodeClient.QueryProposalByID(proposal.Id) - if err != nil { - log.Errorf("[Handler.CheckStatusByContract][QueryProposalByID] error info: %s", errors.WithStack(err).Error()) - continue - } - var dbProposal schema.Proposal - err = ctx.DB.Where("proposal_id=?", proposal.Id).First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.CheckStatusByContract] find proposal err: %s\n", errors.WithStack(err).Error()) - continue - } - dbProposal.BtcTxHash = proposalContract.BtcTxHash - dbProposal.ArTxHash = proposalContract.ArweaveTxHash - dbProposal.Winner = proposalContract.Winner.String() - dbProposal.Status = uint64(proposalContract.Status) - ctx.DB.Save(&dbProposal) - time.Sleep(20 * time.Second) - } - -} diff --git a/internal/handler/committer.go b/internal/handler/committer.go deleted file mode 100644 index a33309a..0000000 --- a/internal/handler/committer.go +++ /dev/null @@ -1,249 +0,0 @@ -package handler - -import ( - "context" - "encoding/hex" - "fmt" - "github.com/b2network/b2committer/pkg/contract/zk" - "strings" - "time" - - "github.com/b2network/b2committer/pkg/log" - - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/internal/svc" - "github.com/b2network/b2committer/pkg/event/zkevm" - "github.com/b2network/b2committer/pkg/merkle" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/pkg/errors" - mt "github.com/txaty/go-merkletree" -) - -type VerifyBatchesTrustedAggregatorParams struct { - pendingStateNum uint64 - initNumBatch uint64 - finalNewBatch uint64 - newLocalExitRoot string - newStateRoot string - proof string -} - -type VerifyBatchesAndTxHash struct { - verifyBatches *zkevm.VerifyBatches - txHash string -} - -type VerifyRangBatchInfo struct { - startBatchNum uint64 - endBatchNum uint64 - proofRootHash string - stateRootHash string -} - -// Committer find verifyBatchesTrustedAggregator event and commit stateRoot proof to b2node -func Committer(ctx *svc.ServiceContext) { - for { - proposal, err := ctx.NodeClient.QueryLastProposal() - lastProposalID, lastFinalBatchNum := proposal.Id, proposal.EndIndex - if err != nil { - log.Errorf("[Handler.Committer][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - if lastProposalID == 0 { - lastProposalID = 1 - } - - if proposal.Status == schema.ProposalSucceedStatus { - lastProposalID++ - proposal, err = ctx.NodeClient.QueryProposalByID(lastProposalID) - if err != nil { - log.Errorf("[Handler.Committer][QueryProposalByID] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - } - - res, err := ctx.NodeClient.CheckProposalTimeout(lastProposalID) - if err != nil { - log.Errorf("[Handler.Committer][CheckProposalTimeout] error info: %s", errors.WithStack(err).Error()) - continue - } - - if !res && proposal.Status != schema.ProposalVotingStatus { - log.Infof("[Handler.Committer] proposal status is processing, proposalID: %d", lastProposalID) - time.Sleep(10 * time.Second) - continue - } - if res && lastProposalID == 1 { - lastFinalBatchNum = 0 - } - - verifyBatchInfo, err := GetVerifyBatchInfoByLastBatchNum(ctx, lastFinalBatchNum) - if err != nil { - log.Errorf("[Handler.Committer] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - - err = committerProposal(ctx, verifyBatchInfo, lastProposalID) - if err != nil { - log.Errorf("[Handler.Committer] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - time.Sleep(30 * time.Second) - } -} - -func GetVerifyBatchInfoByLastBatchNum(ctx *svc.ServiceContext, lastFinalBatchNum uint64) (*VerifyRangBatchInfo, error) { - verifyBatchesAndTxHashes, err := GetVerifyBatchesFromStartBatchNum(ctx, lastFinalBatchNum, ctx.Config.LimitNum) - if err != nil || len(verifyBatchesAndTxHashes) != ctx.Config.LimitNum { - return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) - } - verifyBatchesParams := make([]*VerifyBatchesTrustedAggregatorParams, 0, ctx.Config.LimitNum) - for _, verifyBatch := range verifyBatchesAndTxHashes { - verifyBatchParam, err := GetVerifyBatchesParamsByTxHash(ctx, common.HexToHash(verifyBatch.txHash)) - if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) - } - verifyBatchesParams = append(verifyBatchesParams, verifyBatchParam) - } - verifyBatchInfo, err := GetMerkleStateRootsAndProofs(verifyBatchesParams) - if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchInfoByLastBatchNum] error info: %s", errors.WithStack(err)) - } - return verifyBatchInfo, nil -} - -// CommitterProposal committer transaction to b2-node -func committerProposal(ctx *svc.ServiceContext, verifyBatchInfo *VerifyRangBatchInfo, lastProposalID uint64) error { - _, err := ctx.NodeClient.SubmitProof(lastProposalID, verifyBatchInfo.proofRootHash, verifyBatchInfo.stateRootHash, - verifyBatchInfo.startBatchNum, verifyBatchInfo.endBatchNum) - if err != nil { - return fmt.Errorf("[committerProposal] submit proof error info: %s, %d", errors.WithStack(err), verifyBatchInfo.startBatchNum) - } - return nil -} - -func GetMerkleStateRootsAndProofs(params []*VerifyBatchesTrustedAggregatorParams) (*VerifyRangBatchInfo, error) { - stateRoots := make([]string, 0, 10) - proofs := make([]string, 0, 10) - var startBatchNum uint64 - var endBatchNum uint64 - for index, param := range params { - if index == 0 { - startBatchNum = param.initNumBatch - endBatchNum = param.finalNewBatch - } - if startBatchNum > param.initNumBatch { - startBatchNum = param.initNumBatch - } - if endBatchNum <= param.finalNewBatch { - endBatchNum = param.finalNewBatch - } - stateRoots = append(stateRoots, param.newStateRoot) - proofs = append(proofs, param.proof) - } - if startBatchNum == 0 { - startBatchNum = 1 - } - stateBlocks := merkle.GenerateBlocks(stateRoots) - proofBlocks := merkle.GenerateBlocks(proofs) - - stateTree, err := mt.New(nil, stateBlocks) - if err != nil { - return nil, fmt.Errorf("[GetMerkleStateRootsAndProofs] generate state tree err: %s", err) - } - proofTree, err := mt.New(nil, proofBlocks) - if err != nil { - return nil, fmt.Errorf("[GetMerkleStateRootsAndProofs] generate proof tree err: %s", err) - } - return &VerifyRangBatchInfo{ - startBatchNum: startBatchNum, - endBatchNum: endBatchNum, - proofRootHash: hex.EncodeToString(proofTree.Root), - stateRootHash: hex.EncodeToString(stateTree.Root), - }, nil -} - -func GetVerifyBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum uint64, limit int) ([]*VerifyBatchesAndTxHash, error) { - events := make([]schema.SyncEvent, 0, limit) - err := ctx.DB.Table("sync_events").Select("*, JSON_EXTRACT(data, '$.numBatch') as numBatch"). - Where(" event_name = ? and JSON_EXTRACT(data, '$.numBatch') > ?", "verifyBatchesTrustedAggregator", - startBatchNum).Order("numBatch").Limit(limit).Find(&events).Error - if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchesFromStartBatchNum] dbbase err: %s", err) - } - if len(events) != 10 { - return nil, fmt.Errorf("[GetVerifyBatchesFromStartBatchNum] sync_events find event is not enough %s", err) - } - verifyBatchesAndTxHashes := make([]*VerifyBatchesAndTxHash, 0, limit) - for _, event := range events { - verifyBatch := &zkevm.VerifyBatches{} - err = verifyBatch.ToObj(event.Data) - if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchesFromStartBatchNum] parse event data error: %s", errors.WithStack(err)) - } - verifyBatchesAndTxHash := &VerifyBatchesAndTxHash{ - verifyBatches: verifyBatch, - txHash: event.TxHash, - } - verifyBatchesAndTxHashes = append(verifyBatchesAndTxHashes, verifyBatchesAndTxHash) - } - return verifyBatchesAndTxHashes, nil -} - -func DecodeTransactionInputData(contractABI abi.ABI, data []byte) (map[string]interface{}, string) { - methodSigData := data[:4] - inputsSigData := data[4:] - - method, err := contractABI.MethodById(methodSigData) - if err != nil { - log.Errorf("[DecodeTransactionInputData] parse abi error: %s\n", errors.WithStack(err)) - } - - inputsMap := make(map[string]interface{}) - - if err := method.Inputs.UnpackIntoMap(inputsMap, inputsSigData); err != nil { - log.Errorf("[DecodeTransactionInputData] parse abi error: %s\n", errors.WithStack(err)) - } - return inputsMap, method.Name -} - -func GetVerifyBatchesParamsByTxHash(ctx *svc.ServiceContext, txHash common.Hash) (*VerifyBatchesTrustedAggregatorParams, error) { - abiObject, err := abi.JSON(strings.NewReader(zk.VerifyMetaData.ABI)) - if err != nil { - return nil, fmt.Errorf("[GetVerifyBatchesParamsByTxHash] parse abi error: %s", errors.WithStack(err)) - } - // method := "VerifyBatchesTrustedAggregator" - tx, _, err := ctx.RPC.TransactionByHash(context.Background(), txHash) - - inputsMap, methodName := DecodeTransactionInputData(abiObject, tx.Data()) - - if methodName != "verifyBatchesTrustedAggregator" { - return nil, fmt.Errorf("[GetVerifyBatchesParamsByTxHash] methodName is : %s parse method error: %s", methodName, errors.WithStack(err)) - } - - e := inputsMap["newLocalExitRoot"].([32]byte) - f := inputsMap["newStateRoot"].([32]byte) - g := inputsMap["proof"].([24][32]byte) - - var result string - for _, arr := range g { - result += hex.EncodeToString(arr[:]) - } - - log.Debugf("newStateRoot outputs: %v\n", hex.EncodeToString(f[:])) - log.Debugf("proof outputs: %v\n", common.HexToHash(result)) - - return &VerifyBatchesTrustedAggregatorParams{ - pendingStateNum: inputsMap["pendingStateNum"].(uint64), - initNumBatch: inputsMap["initNumBatch"].(uint64), - finalNewBatch: inputsMap["finalNewBatch"].(uint64), - newLocalExitRoot: hex.EncodeToString(e[:]), - newStateRoot: hex.EncodeToString(f[:]), - proof: common.HexToHash(result).String(), - }, err -} diff --git a/internal/handler/committer_test.go b/internal/handler/committer_test.go deleted file mode 100644 index 1163ef2..0000000 --- a/internal/handler/committer_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package handler - -import ( - "context" - "encoding/hex" - "fmt" - "github.com/b2network/b2committer/pkg/contract/zk" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" - "strings" - "testing" -) - -func TestGetVerifyBatchesParamsByTxHash(t *testing.T) { - //txHash := "0x05a4cf1c23eb2fea36a7d23dc0d419f35e27474f8217bf371ff8299502d99224" - txHash := "0x442edca80b4882ef2cd3482e5cb95570a81d19fd8a03ed1e302a711fd7e994ed" - // method := "VerifyBatchesTrustedAggregator" - rpc, err := ethclient.Dial("https://ethereum-goerli-rpc.publicnode.com") - tx, _, err := rpc.TransactionByHash(context.Background(), common.HexToHash(txHash)) - - //inputsMap, methodName := DecodeTransactionInputData(abiObject, tx.Data()) - - methodSigData := tx.Data()[:4] - inputsSigData := tx.Data()[4:] - - abiObject, err := abi.JSON(strings.NewReader(zk.VerifyMetaData.ABI)) - require.NoError(t, err) - method, err := abiObject.MethodById(methodSigData) - require.NoError(t, err) - - inputsMap := make(map[string]interface{}) - err = method.Inputs.UnpackIntoMap(inputsMap, inputsSigData) - require.NoError(t, err) - initNumBatch := inputsMap["initNumBatch"].(uint64) - finalNewBatch := inputsMap["finalNewBatch"].(uint64) - e := inputsMap["newLocalExitRoot"].([32]byte) - f := inputsMap["newStateRoot"].([32]byte) - g := inputsMap["proof"].([24][32]byte) - - var result string - for _, arr := range g { - result += hex.EncodeToString(arr[:]) - } - fmt.Println("initNumBatch", initNumBatch) - fmt.Println("finalNewBatch", finalNewBatch) - fmt.Println("newLocalExitRoot", hex.EncodeToString(e[:])) - fmt.Println("newStateRoot outputs:", hex.EncodeToString(f[:])) - fmt.Println("proof outputs: ", common.HexToHash(result)) -} diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 7db3f4f..25dae94 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -7,14 +7,14 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - //go LatestBlackNumber(ctx) - //// sync blocks - //go SyncBlock(ctx) - //// sync events - //go SyncEvent(ctx) + go LatestBlackNumber(ctx) + // sync blocks + go SyncBlock(ctx) + // sync events + go SyncEvent(ctx) // query blob and store in local - go QueryBlobOnChainAndStoreInLocal(ctx) + //go QueryBlobOnChainAndStoreInLocal(ctx) // commit and vote txs proposal - //go GetBlobsAndCommitProposal(ctx) + //go GetBlobsAndCommitTxsProposal(ctx) } diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go new file mode 100644 index 0000000..b7a6e70 --- /dev/null +++ b/internal/handler/op_committer_stateroot.go @@ -0,0 +1,131 @@ +package handler + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/contract/op" + "github.com/b2network/b2committer/pkg/log" + "github.com/b2network/b2committer/pkg/merkle" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + mt "github.com/txaty/go-merkletree" + "time" +) + +func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { + // check address + res, err := ctx.OpCommitterClient.Proposer.IsProposer(&bind.CallOpts{}, common.HexToAddress(ctx.B2NodeConfig.Address)) + if err != nil || !res { + panic(err) + } + for { + lastProposal, err := ctx.OpCommitterClient.ProposalManager.GetLastStateRootProposal(&bind.CallOpts{}) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get last state root proposal from contract: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + latestProposalID := lastProposal.ProposalID + //voteAddress := ctx.B2NodeConfig.Address + if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { + log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) + // submit new proposal + newStateRootProposal, err := constructNextStateRootProposal(ctx, lastProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new state root proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + _, err = ctx.OpCommitterClient.SubmitStateRoot(newStateRootProposal) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new state root proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + log.Infof("[Handler.GetBlobsAndCommitProposal] submit new state root proposal: %s", newStateRootProposal.ProposalID) + time.Sleep(10 * time.Second) + continue + } + + if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { + + } + + } + +} + +func constructNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal) (*types.StateRootProposal, error) { + var event schema.SyncEvent + var latestEndTimestamp uint64 + var latestStartTimestamp uint64 + if lastProposal.EndL1Timestamp == 0 { + // contract has no one proposal + err := ctx.DB.Where("event_name=?", "OutputProposed").Order("block_number").First(&event).Error + if err != nil { + return nil, fmt.Errorf("find original blob block error: %s", errors.WithStack(err)) + } + latestStartTimestamp = uint64(event.BlockTime) + latestEndTimestamp = uint64(event.BlockTime) + ctx.Config.OutputIntervalTime + } else { + latestStartTimestamp = lastProposal.EndL1Timestamp + 1 // plus 1 to exclude the last proposal end blob block + latestEndTimestamp = lastProposal.EndL1Timestamp + ctx.Config.BlobIntervalTime + } + tsp, err := constructStateRootProposal(ctx, lastProposal.ProposalID+1, latestStartTimestamp, latestEndTimestamp) + if err != nil { + return nil, fmt.Errorf("construct txs root proposal failed, err: %s", errors.WithStack(err)) + } + return tsp, nil +} + +func constructStateRootProposal(ctx *svc.ServiceContext, proposalID uint64, startTimestamp uint64, endTimestamp uint64) (*types.StateRootProposal, error) { + var event schema.SyncEvent + err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&event).Error + if err != nil { + return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) + } + var events []schema.SyncEvent + err = ctx.DB.Where("block_time between ? and ?", startTimestamp, endTimestamp).Order("block_number").Find(&events).Error + if err != nil { + return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + outputRoots, err := GetOutputRootMerkleRoot(events) + if err != nil { + return nil, fmt.Errorf("getting the output merkle root is failed. err : %s", errors.WithStack(err)) + } + stateRootProposal, err := types.NewStateRootProposal(proposalID, outputRoots, events) + if err != nil { + return nil, fmt.Errorf("constructing the state root proposal is failed. err : %s", errors.WithStack(err)) + } + return stateRootProposal, nil +} + +func GetOutputRootMerkleRoot(events []schema.SyncEvent) (string, error) { + if len(events) == 0 { + return "", fmt.Errorf("no output root") + } + var data types.OutputEvent + if len(events) == 1 { + err := json.Unmarshal([]byte(events[0].Data), &data) + if err != nil { + return "", fmt.Errorf("[GetOutputRootMerkleRoot] unmarshal output event failed %s", err.Error()) + } + return data.OutputRoot, nil + } + newOutputRoots := make([]string, 0) + for _, event := range events { + err := json.Unmarshal([]byte(event.Data), &data) + if err != nil { + return "", fmt.Errorf("[GetOutputRootMerkleRoot] unmarshal output event failed %s", err.Error()) + } + newOutputRoots = append(newOutputRoots, data.OutputRoot) + } + outputs := merkle.GenerateBlocks(newOutputRoots) + outputsTree, _ := mt.New(nil, outputs) + return hex.EncodeToString(outputsTree.Root), nil +} diff --git a/internal/handler/op_committer_blob.go b/internal/handler/op_committer_txs.go similarity index 93% rename from internal/handler/op_committer_blob.go rename to internal/handler/op_committer_txs.go index 8772997..3791d0d 100644 --- a/internal/handler/op_committer_blob.go +++ b/internal/handler/op_committer_txs.go @@ -18,7 +18,7 @@ import ( "time" ) -func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { +func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { // check address res, err := ctx.OpCommitterClient.Proposer.IsProposer(&bind.CallOpts{}, common.HexToAddress(ctx.B2NodeConfig.Address)) if err != nil || !res { @@ -46,7 +46,11 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { _, err = ctx.OpCommitterClient.SubmitTxsRoot(newTxsRootProposal) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue } + log.Infof("[Handler.GetBlobsAndCommitProposal] submit new txs proposal: %s", newTxsRootProposal.ProposalID) + time.Sleep(10 * time.Second) continue } @@ -87,7 +91,10 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { _, err = ctx.OpCommitterClient.SubmitTxsRoot(tsp) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal to vote: %s", err.Error()) + time.Sleep(3 * time.Second) + continue } + log.Infof("[Handler.GetBlobsAndCommitProposal] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) continue } @@ -121,12 +128,14 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { dsTxID, err := ctx.DecentralizedStore.StoreTxsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to store ds proposal: %s", err.Error()) + continue } _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, dsTxID) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) continue } + log.Infof("[Handler.GetBlobsAndCommitProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) } if lastProposal.Winner != common.HexToAddress(ctx.B2NodeConfig.Address) { blobs, err := ctx.DecentralizedStore.QueryTxsByTxID(lastProposal.DsTxHash) @@ -157,6 +166,7 @@ func GetBlobsAndCommitProposal(ctx *svc.ServiceContext) { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) continue } + log.Infof("[Handler.GetBlobsAndCommitProposal] success verify and vote submit txs from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) } } time.Sleep(30 * time.Second) diff --git a/internal/handler/sequenceBatchers_test.go b/internal/handler/sequenceBatchers_test.go deleted file mode 100644 index 7e94ac6..0000000 --- a/internal/handler/sequenceBatchers_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package handler - -import ( - "fmt" - "testing" - "time" -) - -func TestReadFile(t *testing.T) { - //content, _ := os.ReadFile("../../batchFile/56908-56949.json") - ////fmt.Println(content) - //seq := make(map[uint64][]byte) - //json.Unmarshal(content, &seq) - //for k, v := range seq { - // fmt.Println(k) - // fmt.Println(string(v)) - //} - fmt.Println(time.Now().Format("2006-01-02")) -} diff --git a/internal/handler/sequenceBatches.go b/internal/handler/sequenceBatches.go deleted file mode 100644 index 37d0416..0000000 --- a/internal/handler/sequenceBatches.go +++ /dev/null @@ -1,199 +0,0 @@ -package handler - -import ( - "context" - "encoding/json" - "fmt" - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/internal/svc" - "github.com/b2network/b2committer/pkg/event/zkevm" - "github.com/b2network/b2committer/pkg/log" - "github.com/ethereum/go-ethereum/common" - "github.com/everFinance/goar" - "github.com/everFinance/goar/types" - "github.com/pkg/errors" - "os" - "strconv" - "time" -) - -type CollectionSequenceBatches struct { - IsCompleted bool - SequenceBatches []*SequenceBatchesAndTxHash - StartBatchNum uint64 - EndBatchNum uint64 -} - -type SequenceBatchesAndTxHash struct { - NumBatch uint64 - TxHash string -} - -func SequenceBatches(ctx *svc.ServiceContext) { - time.Sleep(40 * time.Second) - for { - var dbProposal schema.Proposal - err := ctx.DB.Where("status = ? and ar_tx_hash=''", schema.ProposalCommitting).Order("proposal_id desc").First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.SequenceBatches]query proposal from db, error info: %s", errors.WithStack(err).Error()) - time.Sleep(5 * time.Second) - continue - } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) - if err != nil { - log.Errorf("[Handler.SequenceBatches] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) - time.Sleep(3 * time.Second) - continue - } - if proposal.Status == schema.ProposalCommitting && proposal.Winner.String() == ctx.B2NodeConfig.Address && - proposal.ArweaveTxHash == "" { - collectionSequenceBatches, err := GetSequenceBatchesFromStartBatchNum(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum) - if err != nil { - log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesFromStartBatchNum] error info: %s", errors.WithStack(err).Error()) - time.Sleep(10 * time.Second) - continue - } - if !collectionSequenceBatches.IsCompleted { - log.Errorf("[Handler.SequenceBatches] sync batches not completed") - time.Sleep(10 * time.Second) - continue - } - sequenceBatchesMap, err := GetSequenceBatchesDetails(ctx, collectionSequenceBatches.SequenceBatches) - if err != nil { - log.Errorf("[Handler.SequenceBatches][GetSequenceBatchesDetails] error info: %s", errors.WithStack(err).Error()) - time.Sleep(3 * time.Second) - continue - } - jsonData, err := json.Marshal(sequenceBatchesMap) - if err != nil { - log.Errorf("[WriteFile] json marshal error: %s", errors.WithStack(err)) - continue - } - tags := []types.Tag{ - {Name: "Content-Type", Value: "application/json"}, - {Name: "title", Value: "b2-batch"}, - {Name: "chainID", Value: strconv.FormatInt(ctx.B2NodeConfig.ChainID, 10)}, - } - arNode := ctx.Config.ArweaveRPC - wallet := ctx.Config.ArweaveWallet - w, err := goar.NewWalletFromPath(wallet, arNode) - arTx, err := w.SendData(jsonData, tags) - - _, err = ctx.NodeClient.ArweaveTx(dbProposal.ProposalID, arTx.ID) - if err != nil { - log.Errorf("[Handler.BatchDetailsToAr] get ar tx error: %s", errors.WithStack(err).Error()) - continue - } - err = ctx.DB.Model(&dbProposal).Update("ar_tx_hash", arTx.ID).Error - if err != nil { - log.Errorf("[Handler.BatchDetailsToAr] update proposal error: %s", errors.WithStack(err).Error()) - continue - } - - res, err := WriteFile(ctx, dbProposal.StartBatchNum, dbProposal.EndBatchNum, sequenceBatchesMap) - if err != nil { - log.Errorf("[Handler.SequenceBatches][WriteFile] error info: %s", errors.WithStack(err).Error()) - time.Sleep(3 * time.Second) - continue - } - if res { - err = ctx.DB.Model(&dbProposal).Update("generate_details_file", true).Error - if err != nil { - log.Errorf("[Handler.SequenceBatches][Update] error info: %s", errors.WithStack(err).Error()) - time.Sleep(3 * time.Second) - continue - } - } - } - time.Sleep(3 * time.Second) - } -} - -func GetSequenceBatchesFromStartBatchNum(ctx *svc.ServiceContext, startBatchNum uint64, endBatchNum uint64) (*CollectionSequenceBatches, error) { - isCompleted := false - events := make([]schema.SyncEvent, 0) - err := ctx.DB.Table("sync_events").Select("*, JSON_EXTRACT(data, '$.numBatch') as numBatch "). - Where(" event_name = ? and JSON_EXTRACT(data, '$.numBatch') between ? and ?", "sequenceBatches", - startBatchNum, endBatchNum).Order("numBatch").Find(&events).Error - if err != nil { - return nil, fmt.Errorf("[GetSequenceBatchesFromStartBatchNum] dbbase err: %s", err) - } - - sequenceBatchesAndTxHashes := make([]*SequenceBatchesAndTxHash, 0) - for _, event := range events { - sequenceBatch := &zkevm.SequenceBatches{} - err = sequenceBatch.ToObj(event.Data) - if err != nil { - return nil, fmt.Errorf("[GetSequenceBatchesFromStartBatchNum] parse event data error: %s", errors.WithStack(err)) - } - SequenceBatchesAndTxHash := &SequenceBatchesAndTxHash{ - NumBatch: sequenceBatch.BatchNum, - TxHash: event.TxHash, - } - sequenceBatchesAndTxHashes = append(sequenceBatchesAndTxHashes, SequenceBatchesAndTxHash) - if sequenceBatch.BatchNum == endBatchNum { - isCompleted = true - } - } - - return &CollectionSequenceBatches{ - StartBatchNum: startBatchNum, - EndBatchNum: endBatchNum, - SequenceBatches: sequenceBatchesAndTxHashes, - IsCompleted: isCompleted, - }, nil -} - -func GetSequenceBatchesDetails(ctx *svc.ServiceContext, sequenceBatches []*SequenceBatchesAndTxHash) (map[uint64][]byte, error) { - sequenceBatchesMap := make(map[uint64][]byte) - for _, sequenceBatch := range sequenceBatches { - txHash := sequenceBatch.TxHash - tx, _, err := ctx.RPC.TransactionByHash(context.Background(), common.HexToHash(txHash)) - if err != nil { - return nil, fmt.Errorf("[GetSequenceBatchesDetails] get tx error: %s", errors.WithStack(err)) - } - sequenceBatchesMap[sequenceBatch.NumBatch] = tx.Data() - } - return sequenceBatchesMap, nil -} - -func WriteFile(ctx *svc.ServiceContext, startBatchNum uint64, endBatchNum uint64, sequenceBatchesMap map[uint64][]byte) (bool, error) { - fileName := strconv.FormatUint(startBatchNum, 10) + "-" + strconv.FormatUint(endBatchNum, 10) + ".json" - jsonData, err := json.Marshal(sequenceBatchesMap) - if err != nil { - log.Errorf("[WriteFile] json marshal error: %s", errors.WithStack(err)) - return false, err - } - path, err := os.Getwd() - if err != nil { - log.Errorf("[WriteFile] get current path error: %s", errors.WithStack(err)) - return false, err - } - filePath := path + "/" + ctx.Config.BatchPath - _, err2 := os.Stat(filePath) - if os.IsNotExist(err2) { - errDir := os.MkdirAll(filePath, os.ModePerm) - if errDir != nil { - log.Errorf("[WriteFile] create dir error: %s", errors.WithStack(errDir)) - return false, errDir - } - } - file, err := os.Create(filePath + "/" + fileName) - if err != nil { - log.Errorf("[WriteFile] create file error: %s", errors.WithStack(err)) - return false, err - } - defer func(file *os.File) { - err := file.Close() - if err != nil { - log.Errorf("[WriteFile] close file error: %s", errors.WithStack(err)) - } - }(file) - - _, err = file.Write(jsonData) - if err != nil { - log.Errorf("[WriteFile] write file error: %s", errors.WithStack(err)) - return false, nil - } - return true, nil -} diff --git a/internal/svc/svc.go b/internal/svc/svc.go index 84fccc1..1ceaff8 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -117,7 +117,14 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 panic("Invalid arweaveWallet path") } arClient := goar.NewClient(cfg.ArweaveRPC) - svc.DecentralizedStore = ds.NewArWeave(cfg.ArweaveWallet, cfg.ArweaveRPC, arClient) + wallet := cfg.ArweaveWallet + arNode := cfg.ArweaveRPC + w, err := goar.NewWalletFromPath(wallet, arNode) + if err != nil { + log.Panicf("[svc] init arweave wallet panic: %s\n", err) + } + + svc.DecentralizedStore = ds.NewArWeave(w, arClient) } return svc } diff --git a/internal/types/config.go b/internal/types/config.go index d5cef0f..d7dd55a 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -22,6 +22,7 @@ type Config struct { InitBlobBlockNumber int64 `env:"INIT_BLOB_BLOCK_NUMBER" envDefault:"5687501"` InitBlobBlockHash string `env:"INIT_BLOB_BLOCK_HASH" envDefault:"0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee"` BlobIntervalTime uint64 `env:"BLOB_INTERVAL_TIME" envDefault:"1800"` + OutputIntervalTime uint64 `env:"OUTPUT_INTERVAL_TIME" envDefault:"3600"` PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xa6AAdA6845b2083ff6812bAc773038442e7f4dE6"` PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0xDdee8ddfA81F5E36373637240038DCCC14529BF7"` L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` //sepolia @@ -31,7 +32,7 @@ type Config struct { InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` BatchPath string `env:"BATCH_PATH" envDefault:"batchFile"` DSType string `env:"DSTYPE" envDefault:"arweave"` - ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"./wallet/account.json"` + ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"/tmp/wallet/account.json"` ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` } @@ -39,9 +40,9 @@ type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` - OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x0484fE0888684b39B2cce0a1644e44dDFCAA0054"` - OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0x6bA5d52CA1B931E89611995F53dde2E1f914b0a7"` - OpProposalManagerAddress string `env:"B2NODE_OP_PROPOSAL_MANAGER_ADDRESS" envDefault:"0x1A9Df4e0949a8699739B63F0155F41e0505df593"` + OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x2D3F3B68eDb74a9665aC5394eC51881d54529aa5"` + OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0x8C1ceB039414204809a343C1145a26E4a927Ac0f"` + OpProposalManagerAddress string `env:"B2NODE_OP_PROPOSAL_MANAGER_ADDRESS" envDefault:"0x18465f258b51CfB576564791016152F583d1acD1"` Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } diff --git a/internal/types/txs_root_proposal.go b/internal/types/txs_root_proposal.go index 6b529c4..caaaf4c 100644 --- a/internal/types/txs_root_proposal.go +++ b/internal/types/txs_root_proposal.go @@ -1,6 +1,9 @@ package types -import "github.com/b2network/b2committer/internal/schema" +import ( + "encoding/json" + "github.com/b2network/b2committer/internal/schema" +) type TxsRootProposal struct { ProposalID uint64 @@ -14,8 +17,12 @@ type TxsRootProposal struct { func NewTxsRootProposal(proposalID uint64, txsRoot string, blobs []schema.BlobInfo) *TxsRootProposal { proposal := &TxsRootProposal{ - ProposalID: proposalID, - TxsRoot: txsRoot, + ProposalID: proposalID, + StartBlockNumber: uint64(blobs[0].BlockNumber), + EndBlockNumber: uint64(blobs[len(blobs)-1].BlockNumber), + StartTimestamp: blobs[0].BlockTime, + EndTimestamp: blobs[len(blobs)-1].BlockTime, + TxsRoot: txsRoot, } fillBlockListAndBlockInfo(blobs, proposal) return proposal @@ -41,3 +48,67 @@ func fillBlockListAndBlockInfo(blobs []schema.BlobInfo, proposal *TxsRootProposa } proposal.BlockList = blockList } + +type StateRootProposal struct { + ProposalID uint64 + OutputRoot string + StartL1Timestamp uint64 + EndL1Timestamp uint64 + StartL2BlockNumber uint64 + EndL2BlockNumber uint64 + OutputStartIndex uint64 + OutputEndIndex uint64 +} + +func NewStateRootProposal(proposalID uint64, output string, events []schema.SyncEvent) (*StateRootProposal, error) { + proposal := &StateRootProposal{ + ProposalID: proposalID, + OutputRoot: output, + } + err := fillStateRootProposal(events, proposal) + if err != nil { + return nil, err + } + return proposal, nil +} + +func fillStateRootProposal(events []schema.SyncEvent, proposal *StateRootProposal) error { + var data OutputEvent + for _, event := range events { + err := json.Unmarshal([]byte(event.Data), &data) + if err != nil { + return err + } + if proposal.StartL1Timestamp == 0 && proposal.StartL2BlockNumber == 0 && proposal.OutputStartIndex == 0 { + proposal.StartL1Timestamp = data.L1Timestamp + proposal.StartL2BlockNumber = data.L2blockNumber + proposal.OutputStartIndex = data.L2OutputIndex + } + if proposal.StartL1Timestamp > data.L1Timestamp { + proposal.StartL1Timestamp = data.L1Timestamp + } + if proposal.EndL1Timestamp < data.L1Timestamp { + proposal.EndL1Timestamp = data.L1Timestamp + } + if proposal.StartL2BlockNumber > data.L2blockNumber { + proposal.StartL2BlockNumber = data.L2blockNumber + } + if proposal.EndL2BlockNumber < data.L2blockNumber { + proposal.EndL2BlockNumber = data.L2blockNumber + } + if proposal.OutputStartIndex > data.L2OutputIndex { + proposal.OutputStartIndex = data.L2OutputIndex + } + if proposal.OutputEndIndex < data.L2OutputIndex { + proposal.OutputEndIndex = data.L2OutputIndex + } + } + return nil +} + +type OutputEvent struct { + OutputRoot string `json:"outputRoot"` + L1Timestamp uint64 `json:"l1Timestamp"` + L2blockNumber uint64 `json:"l2blockNumber"` + L2OutputIndex uint64 `json:"l2OutputIndex"` +} diff --git a/pkg/b2node/committer.go b/pkg/b2node/committer.go index 71f594a..8dbd2ed 100644 --- a/pkg/b2node/committer.go +++ b/pkg/b2node/committer.go @@ -61,6 +61,18 @@ func (client *OpCommitterClient) SubmitTxsRoot(proposal *types.TxsRootProposal) return tx, nil } +func (client *OpCommitterClient) SubmitStateRoot(proposal *types.StateRootProposal) (*ethTypes.Transaction, error) { + tx, err := client.Committer.SubmitStateRoot(&bind.TransactOpts{ + From: client.Auth.From, + Signer: client.Auth.Signer, + }, proposal.ProposalID, proposal.OutputRoot, proposal.StartL1Timestamp, proposal.EndL1Timestamp, proposal.StartL2BlockNumber, + proposal.EndL2BlockNumber, proposal.OutputStartIndex, proposal.OutputEndIndex) + if err != nil { + return nil, err + } + return tx, nil +} + func (client *OpCommitterClient) DsHash(proposalID uint64, proposalType uint64, dsType uint64, txsHash string) (*ethTypes.Transaction, error) { tx, err := client.Committer.DsTxHash(&bind.TransactOpts{ From: client.Auth.From, @@ -71,3 +83,14 @@ func (client *OpCommitterClient) DsHash(proposalID uint64, proposalType uint64, } return tx, nil } + +func (client *OpCommitterClient) SetCommitter(committerContractAddress string) (*ethTypes.Transaction, error) { + tx, err := client.ProposalManager.SetCommitter(&bind.TransactOpts{ + From: client.Auth.From, + Signer: client.Auth.Signer, + }, common.HexToAddress(committerContractAddress)) + if err != nil { + return nil, err + } + return tx, nil +} diff --git a/pkg/b2node/committer_test.go b/pkg/b2node/committer_test.go index b7e90b6..4d724bc 100644 --- a/pkg/b2node/committer_test.go +++ b/pkg/b2node/committer_test.go @@ -11,13 +11,14 @@ import ( ) const ( - WalletAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" + WalletAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" + WalletPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" Sepolia_URL = "https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30/" Sepolia_chainID = 11155111 - proposerContractAddress = "0x6bA5d52CA1B931E89611995F53dde2E1f914b0a7" - proposalManagerContract = "0x1A9Df4e0949a8699739B63F0155F41e0505df593" - committerContractAddress = "0x0484fE0888684b39B2cce0a1644e44dDFCAA0054" + proposerContractAddress = "0x8C1ceB039414204809a343C1145a26E4a927Ac0f" + proposalManagerContract = "0x18465f258b51CfB576564791016152F583d1acD1" + committerContractAddress = "0x2D3F3B68eDb74a9665aC5394eC51881d54529aa5" ) var opCommitterClient *OpCommitterClient @@ -57,9 +58,36 @@ func TestIsProposer(t *testing.T) { fmt.Println(res) } +func TestSetCommitterContract(t *testing.T) { + setup(t) + tx, err := opCommitterClient.SetCommitter(committerContractAddress) + require.NoError(t, err) + fmt.Println(tx) +} + func TestGetLastTxsRootProposal(t *testing.T) { setup(t) proposal, err := opCommitterClient.ProposalManager.GetLastTxsRootProposal(&bind.CallOpts{}) require.NoError(t, err) fmt.Println(proposal) } + +func TestGetTxsRootProposalByID(t *testing.T) { + setup(t) + proposal1, err := opCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, 1) + require.NoError(t, err) + fmt.Println(proposal1) + proposal2, err := opCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, 2) + require.NoError(t, err) + fmt.Println(proposal2) + proposal3, err := opCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, 3) + require.NoError(t, err) + fmt.Println(proposal3) +} + +func TestQueryCommitterProposer(t *testing.T) { + setup(t) + proposer, err := opCommitterClient.Committer.Proposer(&bind.CallOpts{}) + require.NoError(t, err) + fmt.Println(proposer) +} diff --git a/pkg/ds/ds.go b/pkg/ds/ds.go index 8e8020b..e5c2668 100644 --- a/pkg/ds/ds.go +++ b/pkg/ds/ds.go @@ -12,16 +12,14 @@ type DecentralizedStore interface { QueryTxsByTxID(txID string) ([]byte, error) } type ArWeave struct { - URL string //rpc url - WalletPath string - Client *goar.Client + Client *goar.Client + Wallet *goar.Wallet } -func NewArWeave(url, walletPath string, client *goar.Client) *ArWeave { +func NewArWeave(wallet *goar.Wallet, client *goar.Client) *ArWeave { return &ArWeave{ - URL: url, - WalletPath: walletPath, - Client: client, + Wallet: wallet, + Client: client, } } @@ -32,11 +30,7 @@ func (ar *ArWeave) StoreTxsOnChain(txs []byte, chainID int64, proposalID uint64) {Name: "chainID", Value: strconv.FormatInt(chainID, 10)}, {Name: "ProposalID", Value: strconv.FormatUint(proposalID, 10)}, } - w, err := goar.NewWalletFromPath(ar.WalletPath, ar.URL) - if err != nil { - return "", err - } - arTx, err := w.SendData(txs, tags) + arTx, err := ar.Wallet.SendData(txs, tags) if err != nil { return "", err } diff --git a/pkg/ds/ds_test.go b/pkg/ds/ds_test.go index 6775c6e..20b8217 100644 --- a/pkg/ds/ds_test.go +++ b/pkg/ds/ds_test.go @@ -3,6 +3,9 @@ package ds import ( "fmt" "github.com/everFinance/goar" + "github.com/everFinance/goar/types" + "github.com/stretchr/testify/require" + "strconv" "testing" ) @@ -11,3 +14,17 @@ func TestQueryTxsByTxID(t *testing.T) { txs, _ := arClient.GetTransactionData("5m16jdjzJpWAOrCd83CM9izkn8md1IYKcsOK2SMESDU", "json") fmt.Println(string(txs)) } + +func TestSendData(t *testing.T) { + tags := []types.Tag{ + {Name: "Content-Type", Value: "application/json"}, + {Name: "title", Value: "b2-batch"}, + {Name: "chainID", Value: strconv.FormatInt(123, 10)}, + } + arNode := "https://arweave.net" + wallet := "../../wallet/account.json" + w, err := goar.NewWalletFromPath(wallet, arNode) + require.NoError(t, err) + arTx, err := w.SendData([]byte{}, tags) + fmt.Println(arTx) +} From 0d7eb8d21c8842629cbca1e36f20f4d0df94e029 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 22 Apr 2024 15:57:06 +0800 Subject: [PATCH 15/29] add committer state root --- internal/handler/handler.go | 12 +- internal/handler/inscribe.go | 4 +- internal/handler/op_committer_stateroot.go | 234 +++++++++++++++++- internal/handler/op_committer_txs.go | 8 +- internal/svc/svc.go | 6 +- internal/types/config.go | 8 +- internal/types/ds.go | 43 +++- .../{txs_root_proposal.go => proposal.go} | 27 ++ internal/types/unisat.go | 26 ++ pkg/b2node/committer.go | 11 + pkg/b2node/committer_test.go | 6 +- pkg/client/http_test.go | 43 ++++ pkg/ds/ds.go | 8 +- pkg/inscribe/inscribe.go | 16 +- pkg/unisat/unisat.go | 62 +++++ pkg/unisat/unisat_test.go | 29 +++ 16 files changed, 507 insertions(+), 36 deletions(-) rename internal/types/{txs_root_proposal.go => proposal.go} (83%) create mode 100644 internal/types/unisat.go create mode 100644 pkg/client/http_test.go create mode 100644 pkg/unisat/unisat.go create mode 100644 pkg/unisat/unisat_test.go diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 25dae94..449d160 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -7,14 +7,16 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - go LatestBlackNumber(ctx) - // sync blocks - go SyncBlock(ctx) - // sync events - go SyncEvent(ctx) + //go LatestBlackNumber(ctx) + //// sync blocks + //go SyncBlock(ctx) + //// sync events + //go SyncEvent(ctx) // query blob and store in local //go QueryBlobOnChainAndStoreInLocal(ctx) // commit and vote txs proposal //go GetBlobsAndCommitTxsProposal(ctx) + // commit state root to ar and btc + go GetStateRootAndCommitStateRootProposal(ctx) } diff --git a/internal/handler/inscribe.go b/internal/handler/inscribe.go index f6b4a6f..6e045bf 100644 --- a/internal/handler/inscribe.go +++ b/internal/handler/inscribe.go @@ -33,8 +33,8 @@ func Inscribe(ctx *svc.ServiceContext) { if proposal.Status == schema.ProposalPendingStatus && proposal.Winner.String() == ctx.B2NodeConfig.Address && proposal.BtcTxHash == "" { - rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, proposal.StateRootHash, - proposal.ProofHash, ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) + rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, []byte(proposal.StateRootHash+proposal.ProofHash), + ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) if err != nil { log.Errorf("[Handler.Inscribe] Inscribe err: %s\n", errors.WithStack(err).Error()) continue diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index b7a6e70..c8126c1 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -1,13 +1,16 @@ package handler import ( + "context" "encoding/hex" "encoding/json" "fmt" "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/btcapi" "github.com/b2network/b2committer/pkg/contract/op" + "github.com/b2network/b2committer/pkg/inscribe" "github.com/b2network/b2committer/pkg/log" "github.com/b2network/b2committer/pkg/merkle" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -31,33 +34,252 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } latestProposalID := lastProposal.ProposalID - //voteAddress := ctx.B2NodeConfig.Address + voteAddress := ctx.B2NodeConfig.Address if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { - log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] this proposal has been successful or just beginning : %d", latestProposalID) // submit new proposal newStateRootProposal, err := constructNextStateRootProposal(ctx, lastProposal) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new state root proposal: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to construct new state root proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } _, err = ctx.OpCommitterClient.SubmitStateRoot(newStateRootProposal) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new state root proposal: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]Try to submit new state root proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } - log.Infof("[Handler.GetBlobsAndCommitProposal] submit new state root proposal: %s", newStateRootProposal.ProposalID) + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] submit new state root proposal: %s", newStateRootProposal.ProposalID) time.Sleep(10 * time.Second) continue } if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { + // check address voted or not + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to find address voted or not: %s", err) + time.Sleep(3 * time.Second) + continue + } + if phase { + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted in voting status: %s", voteAddress) + continue + } + var voteProposalStartL1Timestamp uint64 + var voteProposalEndL1Timestamp uint64 + if lastProposal.ProposalID == 1 { + voteProposalStartL1Timestamp = lastProposal.StartL1Timestamp + voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.BlobIntervalTime + } else { + beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]Try to get before last proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + voteProposalStartL1Timestamp = beforeLastProposal.EndTimestamp + 1 + voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.BlobIntervalTime + } + tsp, err := constructStateRootProposal(ctx, lastProposal.ProposalID, voteProposalStartL1Timestamp, voteProposalEndL1Timestamp) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to construct new proposal to vote: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + _, err = ctx.OpCommitterClient.SubmitStateRoot(tsp) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to submit new proposal to vote: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) + continue + } + + if lastProposal.Status == schema.ProposalPendingStatus { + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][IsVotedOnStateRootDSTxPhase] is failed : %s", err) + time.Sleep(3 * time.Second) + continue + } + if phase { + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted in pending status: %s", voteAddress) + continue + } + if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { + var events []schema.SyncEvent + err = ctx.DB.Where("block_time between ? and ?", lastProposal.StartL1Timestamp, lastProposal.EndL1Timestamp).Order("block_number").Find(&events).Error + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]collecting the state root blocks of proposal is failed. err : %s", errors.WithStack(err)) + continue + } + stateRoots, err := types.NewDsStateRootProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, lastProposal.OutputRoot, events) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] constructing state root for ds is failed. err : %s", errors.WithStack(err)) + } + dsJson, err := stateRoots.MarshalJson() + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to marshal ds proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + + dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to store ds proposal: %s", err.Error()) + continue + } + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, dsTxID) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal: %s", err.Error()) + continue + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + + } + if lastProposal.Winner != common.HexToAddress(voteAddress) { + outputs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from ds: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + var dsProposal types.DsStateRootProposal + err = json.Unmarshal(outputs, &dsProposal) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to unmarshal ds proposal: %s", err.Error()) + continue + } + + events, err := types.ConvertOutputsToEventData(dsProposal.OutputEvents) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to convert outputs to event data: %s", err.Error()) + continue + } + verifyOutputRoots, err := GetOutputRootMerkleRoot(events) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs merkle root: %s", err.Error()) + continue + } + + if verifyOutputRoots != lastProposal.OutputRoot { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to verify output from ds: %s", err.Error()) + continue + } + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal: %s", err.Error()) + continue + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + } } - } + if lastProposal.Status == schema.ProposalCommitting { + isVotedBtcTx, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnSubmitBitcoinTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][IsVotedOnSubmitBitcoinTxPhase] is failed : %s", err) + time.Sleep(3 * time.Second) + continue + } + if isVotedBtcTx { + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted btc tx in committing status: %s", voteAddress) + continue + } + if lastProposal.Winner == common.HexToAddress(voteAddress) { + stateRoot := &types.StateRootProposal{ + ProposalID: lastProposal.ProposalID, + OutputRoot: lastProposal.OutputRoot, + StartL1Timestamp: lastProposal.StartL1Timestamp, + EndL1Timestamp: lastProposal.EndL1Timestamp, + StartL2BlockNumber: lastProposal.StartL2BlockNumber, + EndL2BlockNumber: lastProposal.EndL2BlockNumber, + OutputStartIndex: lastProposal.OutputStartIndex, + OutputEndIndex: lastProposal.OutputEndIndex, + } + btcStateRoot := &types.BtcStateRootProposal{ + Proposal: stateRoot, + ChainID: ctx.B2NodeConfig.ChainID, + } + content, err := json.Marshal(btcStateRoot) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Pending btcHash Try to marshal state root proposal: %s", err.Error()) + continue + } + rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, content, + ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Inscribe state root err: %s\n", errors.WithStack(err).Error()) + continue + } + str, err := json.Marshal(rs) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Marshal result err: %s\n", errors.WithStack(err).Error()) + continue + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] inscribe result: %s", str) + bitcoinTxHash := rs.RevealTxHashList[0].String() + _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, bitcoinTxHash) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send bitcoin tx hash: %s", err.Error()) + continue + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit content to btc network. proposalID: %s, btcTxHash: %s", lastProposal.ProposalID, bitcoinTxHash) + } else { + outs, err := ctx.UnisatHTTPClient.QueryAPIBTCTxOutputsByTxID(context.Background(), lastProposal.BitcoinTxHash) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + if len(outs.Data) <= 0 { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: no data") + time.Sleep(3 * time.Second) + continue + } + if len(outs.Data[0].Inscriptions) <= 0 { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: no inscription") + time.Sleep(3 * time.Second) + continue + } + blockHeight := outs.Data[0].Height + 6 + if uint64(ctx.LatestBTCBlockNumber) < blockHeight { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: block height is too low") + time.Sleep(3 * time.Second) + continue + } + + insID := outs.Data[0].Inscriptions[0].InscriptionID + btcStateRootProposal, err := ctx.UnisatHTTPClient.QueryStateRootProposalByInsID(context.Background(), insID) + if lastProposal.ProposalID != btcStateRootProposal.Proposal.ProposalID || + btcStateRootProposal.Proposal.OutputRoot != lastProposal.OutputRoot || + btcStateRootProposal.Proposal.StartL1Timestamp != lastProposal.StartL1Timestamp || + btcStateRootProposal.Proposal.EndL1Timestamp != lastProposal.EndL1Timestamp || + btcStateRootProposal.Proposal.StartL2BlockNumber != lastProposal.StartL2BlockNumber || + btcStateRootProposal.Proposal.EndL2BlockNumber != lastProposal.EndL2BlockNumber || + btcStateRootProposal.Proposal.OutputStartIndex != lastProposal.OutputStartIndex || + btcStateRootProposal.Proposal.OutputEndIndex != lastProposal.OutputEndIndex || + btcStateRootProposal.ChainID != ctx.B2NodeConfig.ChainID { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to verify btc state root proposal: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } + _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, lastProposal.BitcoinTxHash) + if err != nil { + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to vote bitcoin tx hash: %s", err.Error()) + continue + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from btc: %s, btcTxHash: %s", lastProposal.ProposalID, lastProposal.BitcoinTxHash) + } + + } + + } } func constructNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal) (*types.StateRootProposal, error) { diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index 3791d0d..32f83c0 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -118,14 +118,14 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) - dsProposal := types.NewDsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) + dsProposal := types.NewDsTxsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) dsJson, err := dsProposal.MarshalJson() if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } - dsTxID, err := ctx.DecentralizedStore.StoreTxsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to store ds proposal: %s", err.Error()) continue @@ -138,13 +138,13 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { log.Infof("[Handler.GetBlobsAndCommitProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) } if lastProposal.Winner != common.HexToAddress(ctx.B2NodeConfig.Address) { - blobs, err := ctx.DecentralizedStore.QueryTxsByTxID(lastProposal.DsTxHash) + blobs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from ds: %s", err.Error()) time.Sleep(3 * time.Second) continue } - var dsProposal types.DsProposal + var dsProposal types.DsTxsProposal err = json.Unmarshal(blobs, &dsProposal) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to unmarshal ds proposal: %s", err.Error()) diff --git a/internal/svc/svc.go b/internal/svc/svc.go index 1ceaff8..818581b 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -8,6 +8,7 @@ import ( "github.com/b2network/b2committer/pkg/contract/op" "github.com/b2network/b2committer/pkg/ds" "github.com/b2network/b2committer/pkg/log" + "github.com/b2network/b2committer/pkg/unisat" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" @@ -38,6 +39,7 @@ type ServiceContext struct { SyncedBlobBlockHash common.Hash OpCommitterClient *b2node.OpCommitterClient DecentralizedStore ds.DecentralizedStore + UnisatHTTPClient *unisat.UnisatHTTPClient } func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2nodeConfig *types.B2NODEConfig) *ServiceContext { @@ -92,7 +94,7 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 log.Panicf("[svc] init committer contract panic: %s\n", err) } opCommitterClient := b2node.NewOpCommitterClient(b2nodeConfig.PrivateKey, b2nodeConfig.ChainID, proposer, committer, proposalManager) - + unisatClient := unisat.NewUnisatHTTPClient(client.NewBasicHTTPClient(cfg.UnisatURL), cfg.UnisatAuth) svc = &ServiceContext{ BTCConfig: bitcoinCfg, DB: storage, @@ -103,6 +105,7 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 NodeClient: nodeClient, BlobDataSource: bds, OpCommitterClient: opCommitterClient, + UnisatHTTPClient: unisatClient, } dsType := cfg.DSType @@ -126,5 +129,6 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 svc.DecentralizedStore = ds.NewArWeave(w, arClient) } + return svc } diff --git a/internal/types/config.go b/internal/types/config.go index d7dd55a..49866e8 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -34,15 +34,17 @@ type Config struct { DSType string `env:"DSTYPE" envDefault:"arweave"` ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"/tmp/wallet/account.json"` ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` + UnisatURL string `env:"UNISAT_URL" envDefault:"https://open-api-testnet.unisat.io/"` + UnisatAuth string `env:"UNISAT_PRIVATE_KEY" envDefault:"4cb09e6eec9a0c3ebd07135b3817a3dcedcc9791d50fade4cb564e8ad68a7ac3"` } type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` - OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x2D3F3B68eDb74a9665aC5394eC51881d54529aa5"` - OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0x8C1ceB039414204809a343C1145a26E4a927Ac0f"` - OpProposalManagerAddress string `env:"B2NODE_OP_PROPOSAL_MANAGER_ADDRESS" envDefault:"0x18465f258b51CfB576564791016152F583d1acD1"` + OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x270794Fc3ca753CDE033D2AeF9D00EAf71EbC386"` + OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0xcbC418ce125d806087da0DAb15d6ad50E035a250"` + OpProposalManagerAddress string `env:"B2NODE_OP_PROPOSAL_MANAGER_ADDRESS" envDefault:"0x837596C1Aa783E3B06C7Efb10a51Fe6699208D1D"` Address string `env:"B2NODE_CREATOR_ADDRESS" envDefault:"0xb634434CA448c39b05b460dEC51f458EaC1e2759"` PrivateKey string `env:"B2NODE_CREATOR_PRIVATE_KEY" envDefault:"0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551"` } diff --git a/internal/types/ds.go b/internal/types/ds.go index 04b90e9..0ac68e2 100644 --- a/internal/types/ds.go +++ b/internal/types/ds.go @@ -5,20 +5,27 @@ import ( "github.com/b2network/b2committer/internal/schema" ) -type DsProposal struct { +type DsTxsProposal struct { ChainID int64 ProposalID uint64 TxsRoot string Blobs *[]DsBlob } +type DsStateRootProposal struct { + ChainID int64 + ProposalID uint64 + OutputRoot string + OutputEvents []OutputEvent +} + type DsBlob struct { BlockID int64 Blob string } -func NewDsProposal(chainID int64, proposalID uint64, txsRoot string, blobs []schema.BlobInfo) *DsProposal { - return &DsProposal{ +func NewDsTxsProposal(chainID int64, proposalID uint64, txsRoot string, blobs []schema.BlobInfo) *DsTxsProposal { + return &DsTxsProposal{ ChainID: chainID, ProposalID: proposalID, TxsRoot: txsRoot, @@ -26,6 +33,19 @@ func NewDsProposal(chainID int64, proposalID uint64, txsRoot string, blobs []sch } } +func NewDsStateRootProposal(chainID int64, proposalID uint64, outputRoot string, events []schema.SyncEvent) (*DsStateRootProposal, error) { + outputEvents, err := ConvertEventDataToOutputEvent(events) + if err != nil { + return nil, err + } + return &DsStateRootProposal{ + ChainID: chainID, + ProposalID: proposalID, + OutputRoot: outputRoot, + OutputEvents: outputEvents, + }, nil +} + func convertBlobToDsBlob(blobs []schema.BlobInfo) *[]DsBlob { var dsBlobs []DsBlob for _, blob := range blobs { @@ -37,7 +57,7 @@ func convertBlobToDsBlob(blobs []schema.BlobInfo) *[]DsBlob { return &dsBlobs } -func (b *DsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { +func (b *DsTxsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { var dbBlobs []schema.BlobInfo for _, blob := range *b.Blobs { dbBlobs = append(dbBlobs, schema.BlobInfo{ @@ -48,10 +68,23 @@ func (b *DsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { return dbBlobs, nil } -func (b *DsProposal) MarshalJson() ([]byte, error) { +func (b *DsTxsProposal) MarshalJson() ([]byte, error) { marshal, err := json.Marshal(b) if err != nil { return nil, err } return marshal, nil } + +func (s *DsStateRootProposal) MarshalJson() ([]byte, error) { + marshal, err := json.Marshal(s) + if err != nil { + return nil, err + } + return marshal, nil +} + +type BtcStateRootProposal struct { + Proposal *StateRootProposal + ChainID int64 +} diff --git a/internal/types/txs_root_proposal.go b/internal/types/proposal.go similarity index 83% rename from internal/types/txs_root_proposal.go rename to internal/types/proposal.go index caaaf4c..fe6bf9e 100644 --- a/internal/types/txs_root_proposal.go +++ b/internal/types/proposal.go @@ -112,3 +112,30 @@ type OutputEvent struct { L2blockNumber uint64 `json:"l2blockNumber"` L2OutputIndex uint64 `json:"l2OutputIndex"` } + +func ConvertEventDataToOutputEvent(events []schema.SyncEvent) ([]OutputEvent, error) { + outputs := make([]OutputEvent, 0) + for _, event := range events { + var data OutputEvent + err := json.Unmarshal([]byte(event.Data), &data) + if err != nil { + return nil, err + } + outputs = append(outputs, data) + } + return outputs, nil +} + +func ConvertOutputsToEventData(outputs []OutputEvent) ([]schema.SyncEvent, error) { + events := make([]schema.SyncEvent, 0) + for _, output := range outputs { + var event schema.SyncEvent + data, err := json.Marshal(output) + if err != nil { + return nil, err + } + event.Data = string(data) + events = append(events, event) + } + return events, nil +} diff --git a/internal/types/unisat.go b/internal/types/unisat.go new file mode 100644 index 0000000..00e247b --- /dev/null +++ b/internal/types/unisat.go @@ -0,0 +1,26 @@ +package types + +type BTCTxOutputs struct { + TxID string `json:"txid"` + Vout uint64 `json:"vout"` + Address string `json:"address"` + CodeType uint64 `json:"codeType"` + Satoshi uint64 `json:"satoshi"` + ScriptType string `json:"scriptType"` + Height uint64 `json:"height"` + Idx uint64 `json:"idx"` + Inscriptions []Inscriptions `json:"inscriptions"` +} + +type Inscriptions struct { + InscriptionNumber uint64 `json:"inscriptionNumber"` + InscriptionID string `json:"inscriptionId"` + Offset uint64 `json:"offset"` + Moved bool `json:"moved"` + Sequence uint64 `json:"sequence"` + IsBRC20 bool `json:"isBRC20"` +} + +type APIBTCTxOutputs struct { + Data []BTCTxOutputs `json:"data"` +} diff --git a/pkg/b2node/committer.go b/pkg/b2node/committer.go index 8dbd2ed..45e9405 100644 --- a/pkg/b2node/committer.go +++ b/pkg/b2node/committer.go @@ -84,6 +84,17 @@ func (client *OpCommitterClient) DsHash(proposalID uint64, proposalType uint64, return tx, nil } +func (client *OpCommitterClient) BitcoinTxHash(proposalID uint64, btcTxHash string) (*ethTypes.Transaction, error) { + tx, err := client.Committer.BitcoinTxHash(&bind.TransactOpts{ + From: client.Auth.From, + Signer: client.Auth.Signer, + }, proposalID, btcTxHash) + if err != nil { + return nil, err + } + return tx, nil +} + func (client *OpCommitterClient) SetCommitter(committerContractAddress string) (*ethTypes.Transaction, error) { tx, err := client.ProposalManager.SetCommitter(&bind.TransactOpts{ From: client.Auth.From, diff --git a/pkg/b2node/committer_test.go b/pkg/b2node/committer_test.go index 4d724bc..7f04b39 100644 --- a/pkg/b2node/committer_test.go +++ b/pkg/b2node/committer_test.go @@ -16,9 +16,9 @@ const ( WalletPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" Sepolia_URL = "https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30/" Sepolia_chainID = 11155111 - proposerContractAddress = "0x8C1ceB039414204809a343C1145a26E4a927Ac0f" - proposalManagerContract = "0x18465f258b51CfB576564791016152F583d1acD1" - committerContractAddress = "0x2D3F3B68eDb74a9665aC5394eC51881d54529aa5" + proposerContractAddress = "0xcbC418ce125d806087da0DAb15d6ad50E035a250" + proposalManagerContract = "0x837596C1Aa783E3B06C7Efb10a51Fe6699208D1D" + committerContractAddress = "0x270794Fc3ca753CDE033D2AeF9D00EAf71EbC386" ) var opCommitterClient *OpCommitterClient diff --git a/pkg/client/http_test.go b/pkg/client/http_test.go new file mode 100644 index 0000000..e288ee0 --- /dev/null +++ b/pkg/client/http_test.go @@ -0,0 +1,43 @@ +package client + +import ( + "context" + "encoding/json" + "fmt" + "github.com/b2network/b2committer/internal/types" + "github.com/stretchr/testify/require" + "io" + "net/http" + "testing" +) + +func TestHttp(t *testing.T) { + url := "https://open-api-testnet.unisat.io/" + client := NewBasicHTTPClient(url) + headers := http.Header{} + headers.Add("Authorization", "Bearer 4cb09e6eec9a0c3ebd07135b3817a3dcedcc9791d50fade4cb564e8ad68a7ac3") + resp, err := client.Get(context.Background(), "/v1/indexer/tx/2f0025a6c5173a4cc5ea6c3eb85b5433c700dfeae34503394933712f8b3ffb26/outs", nil, headers) + require.NoError(t, err) + //b, _ := io.ReadAll(resp.Body) + //fmt.Println(string(b)) + + var res types.APIBTCTxOutputs + json.NewDecoder(resp.Body).Decode(&res) + fmt.Println(res.Data) +} + +func TestContent(t *testing.T) { + url := "https://open-api-testnet.unisat.io/" + client := NewBasicHTTPClient(url) + headers := http.Header{} + headers.Add("Authorization", "Bearer 4cb09e6eec9a0c3ebd07135b3817a3dcedcc9791d50fade4cb564e8ad68a7ac3") + resp, err := client.Get(context.Background(), "/v1/indexer/inscription/content/2f0025a6c5173a4cc5ea6c3eb85b5433c700dfeae34503394933712f8b3ffb26i0", nil, headers) + require.NoError(t, err) + b, _ := io.ReadAll(resp.Body) + fmt.Println(string(b)) + + var res types.StateRootProposal + err = json.Unmarshal(b, &res) + require.NoError(t, err) + fmt.Println(res) +} diff --git a/pkg/ds/ds.go b/pkg/ds/ds.go index e5c2668..4ff74f9 100644 --- a/pkg/ds/ds.go +++ b/pkg/ds/ds.go @@ -7,9 +7,9 @@ import ( ) type DecentralizedStore interface { - StoreTxsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) + StoreDetailsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) - QueryTxsByTxID(txID string) ([]byte, error) + QueryDetailsByTxID(txID string) ([]byte, error) } type ArWeave struct { Client *goar.Client @@ -23,7 +23,7 @@ func NewArWeave(wallet *goar.Wallet, client *goar.Client) *ArWeave { } } -func (ar *ArWeave) StoreTxsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) { +func (ar *ArWeave) StoreDetailsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) { tags := []types.Tag{ {Name: "Content-Type", Value: "application/json"}, {Name: "title", Value: "b2-batch"}, @@ -37,7 +37,7 @@ func (ar *ArWeave) StoreTxsOnChain(txs []byte, chainID int64, proposalID uint64) return arTx.ID, nil } -func (ar *ArWeave) QueryTxsByTxID(txID string) ([]byte, error) { +func (ar *ArWeave) QueryDetailsByTxID(txID string) ([]byte, error) { txs, err := ar.Client.GetTransactionData(txID, "json") if err != nil { return nil, err diff --git a/pkg/inscribe/inscribe.go b/pkg/inscribe/inscribe.go index 08338e7..40b8e2a 100644 --- a/pkg/inscribe/inscribe.go +++ b/pkg/inscribe/inscribe.go @@ -25,6 +25,7 @@ import ( // InscriptionData is the data of an inscription type InscriptionData struct { + ContentType string Body []byte // The body of the inscription Destination string // The destination of the inscription } @@ -83,7 +84,7 @@ type Result struct { Fees int64 } -func Inscribe(privateKeyHex string, stateRootHash string, proofRootHash string, destination string, net *chaincfg.Params) (*Result, error) { +func Inscribe(privateKeyHex string, content []byte, destination string, net *chaincfg.Params) (*Result, error) { btcAPIClient := btcmempool.NewClient(net) dataList := make([]InscriptionData, 0) utxoPrivateKeyBytes, err := hex.DecodeString(privateKeyHex) @@ -96,7 +97,8 @@ func Inscribe(privateKeyHex string, stateRootHash string, proofRootHash string, return nil, fmt.Errorf("private key generate address error: %w", err) } dataList = append(dataList, InscriptionData{ - Body: []byte(stateRootHash + proofRootHash), + ContentType: "text/plain;charset=utf-8", + Body: content, Destination: destination, }) fmt.Println(utxoTaprootAddress.EncodeAddress()) @@ -205,7 +207,15 @@ func createInscriptionTxCtxData(net *chaincfg.Params, data InscriptionData) (*in AddData(schnorr.SerializePubKey(privateKey.PubKey())). AddOp(txscript.OP_CHECKSIG). AddOp(txscript.OP_FALSE). - AddOp(txscript.OP_IF) + AddOp(txscript.OP_IF). + AddData([]byte("ord")). + // Two OP_DATA_1 should be OP_1. However, in the following link, it's not set as OP_1: + // https://github.com/casey/ord/blob/0.5.1/src/inscription.rs#L17 + // Therefore, we use two OP_DATA_1 to maintain consistency with ord. + AddOp(txscript.OP_DATA_1). + AddOp(txscript.OP_DATA_1). + AddData([]byte(data.ContentType)). + AddOp(txscript.OP_0) maxChunkSize := 520 bodySize := len(data.Body) for i := 0; i < bodySize; i += maxChunkSize { diff --git a/pkg/unisat/unisat.go b/pkg/unisat/unisat.go new file mode 100644 index 0000000..0630535 --- /dev/null +++ b/pkg/unisat/unisat.go @@ -0,0 +1,62 @@ +package unisat + +import ( + "context" + "encoding/json" + "fmt" + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/client" + "io" + "net/http" + "net/url" +) + +type UnisatHTTPClient struct { + auth string + cl client.HTTP +} + +func NewUnisatHTTPClient(cl client.HTTP, auth string) *UnisatHTTPClient { + return &UnisatHTTPClient{auth, cl} +} + +func (cl *UnisatHTTPClient) apiReq(ctx context.Context, dest any, reqPath string, reqQuery url.Values) error { + headers := http.Header{} + headers.Add("Accept", "application/json") + headers.Add("Authorization", "Bearer "+cl.auth) + resp, err := cl.cl.Get(ctx, reqPath, reqQuery, headers) + if err != nil { + return fmt.Errorf("http Get failed: %w", err) + } + if resp.StatusCode != http.StatusOK { + errMsg, _ := io.ReadAll(resp.Body) + _ = resp.Body.Close() + return fmt.Errorf("failed request with status %d: %s", resp.StatusCode, string(errMsg)) + } + if err := json.NewDecoder(resp.Body).Decode(dest); err != nil { + _ = resp.Body.Close() + return err + } + if err := resp.Body.Close(); err != nil { + return fmt.Errorf("failed to close response body: %w", err) + } + return nil +} + +func (cl *UnisatHTTPClient) QueryAPIBTCTxOutputsByTxID(ctx context.Context, txID string) (*types.APIBTCTxOutputs, error) { + var res types.APIBTCTxOutputs + err := cl.apiReq(ctx, &res, "/v1/indexer/tx/"+txID+"/outs", nil) + if err != nil { + return nil, err + } + return &res, nil +} + +func (cl *UnisatHTTPClient) QueryStateRootProposalByInsID(ctx context.Context, insID string) (*types.BtcStateRootProposal, error) { + var res types.BtcStateRootProposal + err := cl.apiReq(ctx, &res, "/v1/indexer/inscription/content/"+insID, nil) + if err != nil { + return nil, err + } + return &res, nil +} diff --git a/pkg/unisat/unisat_test.go b/pkg/unisat/unisat_test.go new file mode 100644 index 0000000..49700ed --- /dev/null +++ b/pkg/unisat/unisat_test.go @@ -0,0 +1,29 @@ +package unisat + +import ( + "context" + "fmt" + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/client" + "github.com/stretchr/testify/require" + "testing" +) + +func TestQueryInscribeNumber(t *testing.T) { + url := "https://open-api-testnet.unisat.io/" + unisat := NewUnisatHTTPClient(client.NewBasicHTTPClient(url), "4cb09e6eec9a0c3ebd07135b3817a3dcedcc9791d50fade4cb564e8ad68a7ac3") + var res types.APIBTCTxOutputs + err := unisat.apiReq(context.Background(), &res, "/v1/indexer/tx/2f0025a6c5173a4cc5ea6c3eb85b5433c700dfeae34503394933712f8b3ffb26/outs", nil) + require.NoError(t, err) + fmt.Println(res) + fmt.Println(res.Data[0].Inscriptions[0].InscriptionID) +} + +func TestQueryContent(t *testing.T) { + url := "https://open-api-testnet.unisat.io/" + unisat := NewUnisatHTTPClient(client.NewBasicHTTPClient(url), "4cb09e6eec9a0c3ebd07135b3817a3dcedcc9791d50fade4cb564e8ad68a7ac3") + var res types.StateRootProposal + err := unisat.apiReq(context.Background(), &res, "/v1/indexer/inscription/content/2f0025a6c5173a4cc5ea6c3eb85b5433c700dfeae34503394933712f8b3ffb26i0", nil) + require.NoError(t, err) + fmt.Println(res) +} From a25030acb6747f42ba6cb093f7921fadb292b670 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:11:57 +0800 Subject: [PATCH 16/29] add committer state root --- docs/sql/listener.sql | 4 +- internal/handler/handler.go | 14 +++--- internal/handler/inscribe.go | 76 -------------------------------- internal/handler/syncProposal.go | 75 ------------------------------- internal/types/config.go | 5 +-- 5 files changed, 10 insertions(+), 164 deletions(-) delete mode 100644 internal/handler/inscribe.go delete mode 100644 internal/handler/syncProposal.go diff --git a/docs/sql/listener.sql b/docs/sql/listener.sql index 2ec9c00..ec07bb1 100644 --- a/docs/sql/listener.sql +++ b/docs/sql/listener.sql @@ -1,5 +1,5 @@ -Create Database If Not Exists b2_committer_op Character Set UTF8; -USE b2_committer_op; +Create Database If Not Exists b2_committer_main Character Set UTF8; +USE b2_committer_main; SET NAMES utf8mb4; diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 449d160..8d604d5 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -7,15 +7,15 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - //go LatestBlackNumber(ctx) - //// sync blocks - //go SyncBlock(ctx) - //// sync events - //go SyncEvent(ctx) + go LatestBlackNumber(ctx) + // sync blocks + go SyncBlock(ctx) + // sync events + go SyncEvent(ctx) // query blob and store in local - //go QueryBlobOnChainAndStoreInLocal(ctx) + go QueryBlobOnChainAndStoreInLocal(ctx) // commit and vote txs proposal - //go GetBlobsAndCommitTxsProposal(ctx) + go GetBlobsAndCommitTxsProposal(ctx) // commit state root to ar and btc go GetStateRootAndCommitStateRootProposal(ctx) diff --git a/internal/handler/inscribe.go b/internal/handler/inscribe.go deleted file mode 100644 index 6e045bf..0000000 --- a/internal/handler/inscribe.go +++ /dev/null @@ -1,76 +0,0 @@ -package handler - -import ( - "encoding/json" - "github.com/b2network/b2committer/pkg/btcapi" - btcmempool "github.com/b2network/b2committer/pkg/btcapi/mempool" - "github.com/b2network/b2committer/pkg/inscribe" - "time" - - "github.com/b2network/b2committer/pkg/log" - - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/internal/svc" - "github.com/pkg/errors" -) - -// Inscribe check proposal statues. process pending proposal. -func Inscribe(ctx *svc.ServiceContext) { - time.Sleep(30 * time.Second) - for { - var dbProposal schema.Proposal - err := ctx.DB.Where("status=? AND btc_tx_hash=''", schema.ProposalPendingStatus).Order("end_batch_num asc").First(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.Inscribe] no proposal wait for inscribe. err: %s\n", errors.WithStack(err).Error()) - time.Sleep(5 * time.Second) - continue - } - proposal, err := ctx.NodeClient.QueryProposalByID(dbProposal.ProposalID) - if err != nil { - log.Errorf("[CheckProposalPending] QueryProposalByID err: %s\n", errors.WithStack(err).Error()) - continue - } - - if proposal.Status == schema.ProposalPendingStatus && - proposal.Winner.String() == ctx.B2NodeConfig.Address && proposal.BtcTxHash == "" { - rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, []byte(proposal.StateRootHash+proposal.ProofHash), - ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) - if err != nil { - log.Errorf("[Handler.Inscribe] Inscribe err: %s\n", errors.WithStack(err).Error()) - continue - } - str, err := json.Marshal(rs) - if err != nil { - log.Errorf("[Handler.Inscribe] Marshal result err: %s\n", errors.WithStack(err).Error()) - continue - } - log.Infof("[Handler.Inscribe] inscribe result: %s", str) - bitcoinTxHash := rs.RevealTxHashList[0].String() - - _, err = ctx.NodeClient.BitcoinTxHash(proposal.Id, bitcoinTxHash) - if err != nil { - log.Errorf("[Handler.Inscribe] BitcoinTx err: %s\n", errors.WithStack(err).Error()) - continue - } - dbProposal.BtcTxHash = bitcoinTxHash - ctx.DB.Save(dbProposal) - } - if proposal.Status == schema.ProposalPendingStatus && proposal.BtcTxHash != "" && proposal.Winner.String() != ctx.B2NodeConfig.Address { - // Get bitcoin txHash and query on btc network confirm status If the comparison is greater than 6 heights, submit the proposal after confirmation - btcAPIClient := btcmempool.NewClient(btcapi.ChainParams(ctx.BTCConfig.NetworkName)) - transaction, err := btcAPIClient.GetTransactionByID(proposal.BtcTxHash) - if err != nil { - log.Errorf("[Handler.Inscribe] GetTransactionByID err: %s\n", errors.WithStack(err).Error()) - continue - } - if transaction.Status.Confirmed && (ctx.LatestBTCBlockNumber-transaction.Status.BlockHeight) >= 6 { - _, err = ctx.NodeClient.BitcoinTxHash(proposal.Id, proposal.BtcTxHash) - if err != nil { - log.Errorf("[Handler.Inscribe] BitcoinTx err: %s\n", errors.WithStack(err).Error()) - continue - } - } - } - time.Sleep(3 * time.Second) - } -} diff --git a/internal/handler/syncProposal.go b/internal/handler/syncProposal.go deleted file mode 100644 index 078fbdc..0000000 --- a/internal/handler/syncProposal.go +++ /dev/null @@ -1,75 +0,0 @@ -package handler - -import ( - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/pkg/log" - "github.com/pkg/errors" - "gorm.io/gorm" - "time" - - "github.com/b2network/b2committer/internal/svc" -) - -// SyncProposal sync proposal and process voting status -func SyncProposal(ctx *svc.ServiceContext) { - time.Sleep(10 * time.Second) - proposalID := ctx.Config.InitProposalID - for { - lastProposal, err := ctx.NodeClient.QueryLastProposal() - if err != nil { - log.Errorf("[Handler.Committer][QueryLastProposalID] error info: %s", errors.WithStack(err).Error()) - time.Sleep(3 * time.Second) - continue - } - if lastProposal.Id < proposalID { - log.Infof("[Handler.SyncProposal] Current proposalId is latest") - time.Sleep(30 * time.Second) - continue - } - - proposal, err := ctx.NodeClient.QueryProposalByID(proposalID) - if err != nil { - log.Errorf("[Handler.SyncProposal] proposal QueryProposalByID error info:", errors.WithStack(err)) - time.Sleep(3 * time.Second) - continue - } - if proposal == nil { - log.Infof("[Handler.SyncProposal] proposal is nil", proposalID) - continue - } - var dbProposal schema.Proposal - err = ctx.DB.Where("proposal_id = ?", proposalID).Order("proposal_id desc").First(&dbProposal).Error - if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - log.Errorf("[Handler.SyncProposal] db query error info:", errors.WithStack(err)) - time.Sleep(3 * time.Second) - continue - } - if errors.Is(err, gorm.ErrRecordNotFound) { - dbProposal = schema.Proposal{ - Base: schema.Base{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, - ProposalID: proposal.Id, - StateRootHash: proposal.StateRootHash, - ProofRootHash: proposal.ProofHash, - StartBatchNum: proposal.StartIndex, - EndBatchNum: proposal.EndIndex, - BtcTxHash: proposal.BtcTxHash, - Winner: proposal.Winner.String(), - Status: uint64(proposal.Status), - ArTxHash: proposal.ArweaveTxHash, - } - err = ctx.DB.Create(&dbProposal).Error - if err != nil { - log.Errorf("[Handler.SyncProposal] db create error info: %s", errors.WithStack(err).Error()) - } - } - - if dbProposal.ProposalID != 0 { - log.Infof("[Handler.SyncProposal] already sync :", ctx.B2NodeConfig.Address) - proposalID++ - continue - } - } -} diff --git a/internal/types/config.go b/internal/types/config.go index 49866e8..5b9d79a 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -10,7 +10,7 @@ type Config struct { LogLevel string `env:"LOG_LEVEL" envDefault:"info"` // "console","json" LogFormat string `env:"LOG_FORMAT" envDefault:"console"` - MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer_op?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` + MySQLDataSource string `env:"MYSQL_DATA_SOURCE" envDefault:"root:root@tcp(127.0.0.1:3366)/b2_committer_main?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true"` MySQLMaxIdleConns int `env:"MYSQL_MAX_IDLE_CONNS" envDefault:"10"` MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` @@ -23,14 +23,11 @@ type Config struct { InitBlobBlockHash string `env:"INIT_BLOB_BLOCK_HASH" envDefault:"0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee"` BlobIntervalTime uint64 `env:"BLOB_INTERVAL_TIME" envDefault:"1800"` OutputIntervalTime uint64 `env:"OUTPUT_INTERVAL_TIME" envDefault:"3600"` - PolygonSequenceContract string `env:"POLYGON_SEQUENCE_CONTRACT" envDefault:"0xa6AAdA6845b2083ff6812bAc773038442e7f4dE6"` - PolygonVerifyBatchContract string `env:"POLYGON_VERIFY_BATCH_CONTRACT" envDefault:"0xDdee8ddfA81F5E36373637240038DCCC14529BF7"` L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` //sepolia BatcherInbox string `env:"BATCHER_INBOX" envDefault:"0xff00000000000000000000000000000011155420"` BatcherSender string `env:"BATCHER_SENDER" envDefault:"0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c"` LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` - BatchPath string `env:"BATCH_PATH" envDefault:"batchFile"` DSType string `env:"DSTYPE" envDefault:"arweave"` ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"/tmp/wallet/account.json"` ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` From 56ee23819cd67abc117f01d41eb50f6ccf0f24b5 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 29 Apr 2024 14:59:58 +0800 Subject: [PATCH 17/29] add committer --- internal/handler/handler.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 8d604d5..8ac8706 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -5,7 +5,6 @@ import ( ) func Run(ctx *svc.ServiceContext) { - // query last block number go LatestBlackNumber(ctx) // sync blocks @@ -18,5 +17,4 @@ func Run(ctx *svc.ServiceContext) { go GetBlobsAndCommitTxsProposal(ctx) // commit state root to ar and btc go GetStateRootAndCommitStateRootProposal(ctx) - } From 0f70d0c8e01fc571553b22df7b0166b95c314a0c Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:37:18 +0800 Subject: [PATCH 18/29] format --- internal/handler/op_committer_stateroot.go | 15 ++++++--------- internal/handler/op_committer_txs.go | 13 +++++++++---- internal/handler/sync_blob.go | 7 ++++--- internal/svc/svc.go | 7 ++++--- internal/types/config.go | 2 +- internal/types/ds.go | 17 +++++++++-------- internal/types/proposal.go | 1 + pkg/b2node/b2node.go | 11 +++++++++-- pkg/b2node/committer.go | 6 +++++- pkg/beacon/l1_beacon_client.go | 22 ++++++++++++---------- pkg/ds/ds.go | 3 ++- pkg/event/op/l2OutputOracle.go | 1 - pkg/event/zkevm/sequenceBatches.go | 1 + pkg/event/zkevm/verifybatches.go | 1 - pkg/unisat/unisat.go | 17 +++++++++-------- 15 files changed, 72 insertions(+), 52 deletions(-) diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index c8126c1..7583702 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -5,6 +5,8 @@ import ( "encoding/hex" "encoding/json" "fmt" + "time" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/internal/types" @@ -17,7 +19,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" mt "github.com/txaty/go-merkletree" - "time" ) func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { @@ -120,14 +121,14 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] constructing state root for ds is failed. err : %s", errors.WithStack(err)) } - dsJson, err := stateRoots.MarshalJson() + dsJSON, err := stateRoots.MarshalJSON() if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } - dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJSON, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to store ds proposal: %s", err.Error()) continue @@ -138,7 +139,6 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) - } if lastProposal.Winner != common.HexToAddress(voteAddress) { outputs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) @@ -176,7 +176,6 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) } - } if lastProposal.Status == schema.ProposalCommitting { @@ -236,12 +235,12 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { time.Sleep(3 * time.Second) continue } - if len(outs.Data) <= 0 { + if len(outs.Data) == 0 { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: no data") time.Sleep(3 * time.Second) continue } - if len(outs.Data[0].Inscriptions) <= 0 { + if len(outs.Data[0].Inscriptions) == 0 { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: no inscription") time.Sleep(3 * time.Second) continue @@ -276,9 +275,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from btc: %s, btcTxHash: %s", lastProposal.ProposalID, lastProposal.BitcoinTxHash) } - } - } } diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index 32f83c0..8aebd7b 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -5,6 +5,8 @@ import ( "encoding/hex" "encoding/json" "fmt" + "time" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/internal/types" @@ -15,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" mt "github.com/txaty/go-merkletree" - "time" ) func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { @@ -99,7 +100,6 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { } if lastProposal.Status == schema.ProposalPendingStatus { - phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal][IsVotedOntxsRootDSTxPhase] is failed : %s", err) @@ -118,14 +118,19 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + if err != nil { + log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs merkle root: %s", err.Error()) + time.Sleep(3 * time.Second) + continue + } dsProposal := types.NewDsTxsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) - dsJson, err := dsProposal.MarshalJson() + dsJSON, err := dsProposal.MarshalJSON() if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } - dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJson, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJSON, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to store ds proposal: %s", err.Error()) continue diff --git a/internal/handler/sync_blob.go b/internal/handler/sync_blob.go index 850bf26..11c4240 100644 --- a/internal/handler/sync_blob.go +++ b/internal/handler/sync_blob.go @@ -2,6 +2,9 @@ package handler import ( "context" + "math/big" + "time" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/pkg/errcode" @@ -9,8 +12,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" "gorm.io/gorm" - "math/big" - "time" ) func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { @@ -83,7 +84,6 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { } ctx.SyncedBlobBlockNumber = blockOnChain.Number().Int64() ctx.SyncedBlobBlockHash = blockOnChain.Hash() - continue } else { err := ctx.DB.Delete(&dbBlob, "block_number=?", syncingBlobBlockNumber).Error if err != nil { @@ -92,6 +92,7 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { continue } } + continue } for _, bif := range blobInfos { diff --git a/internal/svc/svc.go b/internal/svc/svc.go index 818581b..ca139da 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -1,6 +1,9 @@ package svc import ( + "math/big" + "time" + "github.com/b2network/b2committer/internal/types" "github.com/b2network/b2committer/pkg/b2node" "github.com/b2network/b2committer/pkg/beacon" @@ -17,8 +20,6 @@ import ( "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" - "math/big" - "time" ) var svc *ServiceContext @@ -39,7 +40,7 @@ type ServiceContext struct { SyncedBlobBlockHash common.Hash OpCommitterClient *b2node.OpCommitterClient DecentralizedStore ds.DecentralizedStore - UnisatHTTPClient *unisat.UnisatHTTPClient + UnisatHTTPClient *unisat.UstHTTPClient } func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2nodeConfig *types.B2NODEConfig) *ServiceContext { diff --git a/internal/types/config.go b/internal/types/config.go index 5b9d79a..6663489 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -23,7 +23,7 @@ type Config struct { InitBlobBlockHash string `env:"INIT_BLOB_BLOCK_HASH" envDefault:"0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee"` BlobIntervalTime uint64 `env:"BLOB_INTERVAL_TIME" envDefault:"1800"` OutputIntervalTime uint64 `env:"OUTPUT_INTERVAL_TIME" envDefault:"3600"` - L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` //sepolia + L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` BatcherInbox string `env:"BATCHER_INBOX" envDefault:"0xff00000000000000000000000000000011155420"` BatcherSender string `env:"BATCHER_SENDER" envDefault:"0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c"` LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` diff --git a/internal/types/ds.go b/internal/types/ds.go index 0ac68e2..156b53c 100644 --- a/internal/types/ds.go +++ b/internal/types/ds.go @@ -2,6 +2,7 @@ package types import ( "encoding/json" + "github.com/b2network/b2committer/internal/schema" ) @@ -9,7 +10,7 @@ type DsTxsProposal struct { ChainID int64 ProposalID uint64 TxsRoot string - Blobs *[]DsBlob + Blobs []*DsBlob } type DsStateRootProposal struct { @@ -46,20 +47,20 @@ func NewDsStateRootProposal(chainID int64, proposalID uint64, outputRoot string, }, nil } -func convertBlobToDsBlob(blobs []schema.BlobInfo) *[]DsBlob { - var dsBlobs []DsBlob +func convertBlobToDsBlob(blobs []schema.BlobInfo) []*DsBlob { + var dsBlobs []*DsBlob for _, blob := range blobs { - dsBlobs = append(dsBlobs, DsBlob{ + dsBlobs = append(dsBlobs, &DsBlob{ BlockID: blob.BlockNumber, Blob: blob.Blob, }) } - return &dsBlobs + return dsBlobs } func (b *DsTxsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { var dbBlobs []schema.BlobInfo - for _, blob := range *b.Blobs { + for _, blob := range b.Blobs { dbBlobs = append(dbBlobs, schema.BlobInfo{ BlockNumber: blob.BlockID, Blob: blob.Blob, @@ -68,7 +69,7 @@ func (b *DsTxsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { return dbBlobs, nil } -func (b *DsTxsProposal) MarshalJson() ([]byte, error) { +func (b *DsTxsProposal) MarshalJSON() ([]byte, error) { marshal, err := json.Marshal(b) if err != nil { return nil, err @@ -76,7 +77,7 @@ func (b *DsTxsProposal) MarshalJson() ([]byte, error) { return marshal, nil } -func (s *DsStateRootProposal) MarshalJson() ([]byte, error) { +func (s *DsStateRootProposal) MarshalJSON() ([]byte, error) { marshal, err := json.Marshal(s) if err != nil { return nil, err diff --git a/internal/types/proposal.go b/internal/types/proposal.go index fe6bf9e..b68f58a 100644 --- a/internal/types/proposal.go +++ b/internal/types/proposal.go @@ -2,6 +2,7 @@ package types import ( "encoding/json" + "github.com/b2network/b2committer/internal/schema" ) diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go index 07643a0..774ec29 100644 --- a/pkg/b2node/b2node.go +++ b/pkg/b2node/b2node.go @@ -3,6 +3,9 @@ package b2node import ( "crypto/ecdsa" "fmt" + "math/big" + "time" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/pkg/contract/zk" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -10,8 +13,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - "math/big" - "time" ) type NodeClient struct { @@ -29,7 +30,13 @@ func NewNodeClient(privateKeyStr string, chainID int64, address string, contract panic(err) } auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + if err != nil { + panic(err) + } committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) + if err != nil { + panic(err) + } return &NodeClient{ PrivateKey: privateKey, Address: address, diff --git a/pkg/b2node/committer.go b/pkg/b2node/committer.go index 45e9405..d5e1f0f 100644 --- a/pkg/b2node/committer.go +++ b/pkg/b2node/committer.go @@ -1,13 +1,14 @@ package b2node import ( + "math/big" + "github.com/b2network/b2committer/internal/types" "github.com/b2network/b2committer/pkg/contract/op" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "math/big" ) type OpCommitterClient struct { @@ -23,6 +24,9 @@ func NewOpCommitterClient(privateKeyStr string, chainID int64, proposer *op.Prop panic(err) } auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) + if nil != err { + panic(err) + } return &OpCommitterClient{ Proposer: proposer, Committer: committer, diff --git a/pkg/beacon/l1_beacon_client.go b/pkg/beacon/l1_beacon_client.go index 4986d4b..f47f60d 100644 --- a/pkg/beacon/l1_beacon_client.go +++ b/pkg/beacon/l1_beacon_client.go @@ -4,6 +4,8 @@ import ( "context" "errors" "fmt" + "math/big" + "github.com/b2network/b2committer/pkg/errcode" "github.com/b2network/b2committer/pkg/log" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -12,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "math/big" ) type BlobDataSource struct { @@ -25,7 +26,8 @@ type BlobDataSource struct { } func NewBlobDataSource(l1Signer types.Signer, batchInboxAddress common.Address, batchSenderAddress common.Address, - blobsFetcher *sources.L1BeaconClient, ethRPC *ethclient.Client) *BlobDataSource { + blobsFetcher *sources.L1BeaconClient, ethRPC *ethclient.Client, +) *BlobDataSource { return &BlobDataSource{ L1Signer: l1Signer, BatchInboxAddress: batchInboxAddress, @@ -35,7 +37,7 @@ func NewBlobDataSource(l1Signer types.Signer, batchInboxAddress common.Address, } } -func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big.Int) ([]BlockBlobInfo, error) { +func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big.Int) ([]*BlockBlobInfo, error) { block, err := bds.EthRPC.BlockByNumber(ctx, blockNum) if err != nil { return nil, fmt.Errorf("failed to get block %d: %v", blockNum, err) @@ -44,7 +46,7 @@ func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big. hashes := DataAndHashesFromTxs(txs, bds.L1Signer, bds.BatchInboxAddress, bds.BatchSenderAddress) if len(hashes) == 0 { // there are no blobs to fetch so we can return immediately - //return nil, fmt.Errorf("no blobs found in block %d", blockNum) + return nil, errcode.ErrNoBlobFoundInBlock } l1Block := eth.L1BlockRef{ @@ -53,24 +55,24 @@ func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big. ParentHash: block.ParentHash(), Time: block.Time(), } - //blobs, err := bds.BlobsFetcher.GetBlobs(context.Background(), l1Block, hashes) + blobSidecars, err := bds.BlobsFetcher.GetBlobSidecars(context.Background(), l1Block, hashes) if errors.Is(err, ethereum.NotFound) { // If the L1 block was available, then the blobs should be available too. The only // exception is if the blob retention window has expired, which we will ultimately handle // by failing over to a blob archival service. - return nil, fmt.Errorf("failed to fetch blobs: %w", err) + return nil, fmt.Errorf("failed to fetch blobs no record: %w", err) } else if err != nil { return nil, fmt.Errorf("failed to fetch blobs: %w", err) } - var data []BlockBlobInfo + var data []*BlockBlobInfo for i, hash := range hashes { - if &blobSidecars[i] == nil { + if blobSidecars[i] == nil { log.Errorf("blob %d not found in block %d", hash.Index, blockNum) continue } - data = append(data, BlockBlobInfo{ + data = append(data, &BlockBlobInfo{ BlobSidecar: blobSidecars[i], Hash: &hash, }) @@ -103,7 +105,7 @@ func DataAndHashesFromTxs(txs types.Transactions, l1Signer types.Signer, batchIn Hash: h, } hashes = append(hashes, idh) - blobIndex += 1 + blobIndex++ } } return hashes diff --git a/pkg/ds/ds.go b/pkg/ds/ds.go index 4ff74f9..e3841ec 100644 --- a/pkg/ds/ds.go +++ b/pkg/ds/ds.go @@ -1,9 +1,10 @@ package ds import ( + "strconv" + "github.com/everFinance/goar" "github.com/everFinance/goar/types" - "strconv" ) type DecentralizedStore interface { diff --git a/pkg/event/op/l2OutputOracle.go b/pkg/event/op/l2OutputOracle.go index 2f0ebb6..f75957d 100644 --- a/pkg/event/op/l2OutputOracle.go +++ b/pkg/event/op/l2OutputOracle.go @@ -40,7 +40,6 @@ func (t *OutputProposed) ToObj(data string) error { } func (*OutputProposed) Data(log types.Log) (string, error) { - transfer := &OutputProposed{ OutputRoot: event.TopicToHash(log, 1).Hex(), L2OutputIndex: big.NewInt(event.TopicToInt64(log, 2)), diff --git a/pkg/event/zkevm/sequenceBatches.go b/pkg/event/zkevm/sequenceBatches.go index 8fd831a..9e7d614 100644 --- a/pkg/event/zkevm/sequenceBatches.go +++ b/pkg/event/zkevm/sequenceBatches.go @@ -2,6 +2,7 @@ package zkevm import ( "encoding/json" + "github.com/b2network/b2committer/pkg/event" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" diff --git a/pkg/event/zkevm/verifybatches.go b/pkg/event/zkevm/verifybatches.go index ddef40f..bbd6989 100644 --- a/pkg/event/zkevm/verifybatches.go +++ b/pkg/event/zkevm/verifybatches.go @@ -40,7 +40,6 @@ func (t *VerifyBatches) ToObj(data string) error { } func (*VerifyBatches) Data(log types.Log) (string, error) { - transfer := &VerifyBatches{ RollupID: uint32(event.TopicToInt64(log, 1)), Aggregator: event.TopicToAddress(log, 2).Hex(), diff --git a/pkg/unisat/unisat.go b/pkg/unisat/unisat.go index 0630535..3fa6390 100644 --- a/pkg/unisat/unisat.go +++ b/pkg/unisat/unisat.go @@ -4,23 +4,24 @@ import ( "context" "encoding/json" "fmt" - "github.com/b2network/b2committer/internal/types" - "github.com/b2network/b2committer/pkg/client" "io" "net/http" "net/url" + + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/client" ) -type UnisatHTTPClient struct { +type UstHTTPClient struct { auth string cl client.HTTP } -func NewUnisatHTTPClient(cl client.HTTP, auth string) *UnisatHTTPClient { - return &UnisatHTTPClient{auth, cl} +func NewUnisatHTTPClient(cl client.HTTP, auth string) *UstHTTPClient { + return &UstHTTPClient{auth, cl} } -func (cl *UnisatHTTPClient) apiReq(ctx context.Context, dest any, reqPath string, reqQuery url.Values) error { +func (cl *UstHTTPClient) apiReq(ctx context.Context, dest any, reqPath string, reqQuery url.Values) error { headers := http.Header{} headers.Add("Accept", "application/json") headers.Add("Authorization", "Bearer "+cl.auth) @@ -43,7 +44,7 @@ func (cl *UnisatHTTPClient) apiReq(ctx context.Context, dest any, reqPath string return nil } -func (cl *UnisatHTTPClient) QueryAPIBTCTxOutputsByTxID(ctx context.Context, txID string) (*types.APIBTCTxOutputs, error) { +func (cl *UstHTTPClient) QueryAPIBTCTxOutputsByTxID(ctx context.Context, txID string) (*types.APIBTCTxOutputs, error) { var res types.APIBTCTxOutputs err := cl.apiReq(ctx, &res, "/v1/indexer/tx/"+txID+"/outs", nil) if err != nil { @@ -52,7 +53,7 @@ func (cl *UnisatHTTPClient) QueryAPIBTCTxOutputsByTxID(ctx context.Context, txID return &res, nil } -func (cl *UnisatHTTPClient) QueryStateRootProposalByInsID(ctx context.Context, insID string) (*types.BtcStateRootProposal, error) { +func (cl *UstHTTPClient) QueryStateRootProposalByInsID(ctx context.Context, insID string) (*types.BtcStateRootProposal, error) { var res types.BtcStateRootProposal err := cl.apiReq(ctx, &res, "/v1/indexer/inscription/content/"+insID, nil) if err != nil { From 041120890cc72112b2843dd84baea473b2fe705a Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:00:31 +0800 Subject: [PATCH 19/29] format --- internal/handler/handler.go | 18 +- internal/handler/op_committer_stateroot.go | 34 ++- internal/handler/op_committer_txs.go | 26 ++- internal/handler/sync_blob.go | 11 +- internal/svc/svc.go | 11 +- internal/types/config.go | 4 +- internal/types/ds.go | 25 +- pkg/b2node/b2node.go | 175 -------------- pkg/b2node/b2node_test.go | 251 --------------------- pkg/beacon/l1_beacon_client.go | 17 +- 10 files changed, 85 insertions(+), 487 deletions(-) delete mode 100644 pkg/b2node/b2node.go delete mode 100644 pkg/b2node/b2node_test.go diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 8ac8706..1170845 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -6,15 +6,15 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - go LatestBlackNumber(ctx) - // sync blocks - go SyncBlock(ctx) - // sync events - go SyncEvent(ctx) - // query blob and store in local - go QueryBlobOnChainAndStoreInLocal(ctx) - // commit and vote txs proposal - go GetBlobsAndCommitTxsProposal(ctx) + // go LatestBlackNumber(ctx) + //// sync blocks + // go SyncBlock(ctx) + //// sync events + // go SyncEvent(ctx) + //// query blob and store in local + // go QueryBlobOnChainAndStoreInLocal(ctx) + //// commit and vote txs proposal + // go GetBlobsAndCommitTxsProposal(ctx) // commit state root to ar and btc go GetStateRootAndCommitStateRootProposal(ctx) } diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index 7583702..574b45e 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -29,6 +29,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { } for { lastProposal, err := ctx.OpCommitterClient.ProposalManager.GetLastStateRootProposal(&bind.CallOpts{}) + fmt.Println(lastProposal.Winner.String()) if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get last state root proposal from contract: %s", err.Error()) time.Sleep(3 * time.Second) @@ -56,6 +57,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } + //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) @@ -72,7 +74,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { var voteProposalEndL1Timestamp uint64 if lastProposal.ProposalID == 1 { voteProposalStartL1Timestamp = lastProposal.StartL1Timestamp - voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.BlobIntervalTime + voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.OutputIntervalTime } else { beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) if err != nil { @@ -81,7 +83,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } voteProposalStartL1Timestamp = beforeLastProposal.EndTimestamp + 1 - voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.BlobIntervalTime + voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.OutputIntervalTime } tsp, err := constructStateRootProposal(ctx, lastProposal.ProposalID, voteProposalStartL1Timestamp, voteProposalEndL1Timestamp) if err != nil { @@ -121,7 +123,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] constructing state root for ds is failed. err : %s", errors.WithStack(err)) } - dsJSON, err := stateRoots.MarshalJSON() + dsJSON, err := stateRoots.MarshalJson() if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) @@ -224,10 +226,11 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { bitcoinTxHash := rs.RevealTxHashList[0].String() _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, bitcoinTxHash) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send bitcoin tx hash: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send bitcoin tx hash: %s, winner:%s", err.Error(), lastProposal.Winner.String()) continue } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit content to btc network. proposalID: %s, btcTxHash: %s", lastProposal.ProposalID, bitcoinTxHash) + time.Sleep(30 * time.Second) } else { outs, err := ctx.UnisatHTTPClient.QueryAPIBTCTxOutputsByTxID(context.Background(), lastProposal.BitcoinTxHash) if err != nil { @@ -304,14 +307,23 @@ func constructNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpP func constructStateRootProposal(ctx *svc.ServiceContext, proposalID uint64, startTimestamp uint64, endTimestamp uint64) (*types.StateRootProposal, error) { var event schema.SyncEvent - err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&event).Error - if err != nil { - return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) - } + var events []schema.SyncEvent - err = ctx.DB.Where("block_time between ? and ?", startTimestamp, endTimestamp).Order("block_number").Find(&events).Error - if err != nil { - return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + for { + event = schema.SyncEvent{} + err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&event).Error + if err != nil { + return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) + } + err = ctx.DB.Where("block_time between ? and ?", startTimestamp, endTimestamp).Order("block_number").Find(&events).Error + if err != nil { + return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + if len(events) == 0 { + endTimestamp += ctx.Config.OutputIntervalTime + } else { + break + } } outputRoots, err := GetOutputRootMerkleRoot(events) if err != nil { diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index 8aebd7b..7f4986a 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -55,6 +55,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } + //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) @@ -124,7 +125,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } dsProposal := types.NewDsTxsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) - dsJSON, err := dsProposal.MarshalJSON() + dsJSON, err := dsProposal.MarshalJson() if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) @@ -192,14 +193,23 @@ func GetBlobsByBlockListFromDB(ctx *svc.ServiceContext, blockList []uint64) ([]s func constructTxsRootProposal(ctx *svc.ServiceContext, proposalID uint64, startTimestamp uint64, endTimestamp uint64) (*types.TxsRootProposal, error) { var blob schema.BlobInfo - err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&blob).Error - if err != nil { - return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) - } + var blobs []schema.BlobInfo - err = ctx.DB.Where("block_time between ? and ?", startTimestamp, endTimestamp).Order("block_number").Find(&blobs).Error - if err != nil { - return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + for { + blob = schema.BlobInfo{} + err := ctx.DB.Where("block_time > ?", endTimestamp).Order("block_number").First(&blob).Error + if err != nil { + return nil, fmt.Errorf("sync blob blocks is not completed: %s", errors.WithStack(err)) + } + err = ctx.DB.Where("block_time between ? and ?", startTimestamp, endTimestamp).Order("block_number").Find(&blobs).Error + if err != nil { + return nil, fmt.Errorf("collecting the blob blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + if len(blobs) == 0 { + endTimestamp += ctx.Config.BlobIntervalTime + } else { + break + } } blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) if err != nil { diff --git a/internal/handler/sync_blob.go b/internal/handler/sync_blob.go index 11c4240..e72bf73 100644 --- a/internal/handler/sync_blob.go +++ b/internal/handler/sync_blob.go @@ -38,12 +38,15 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { for { syncingBlobBlockNumber := ctx.SyncedBlobBlockNumber + 1 log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal] Try to sync block number: %d\n", syncingBlobBlockNumber) - - if syncingBlobBlockNumber > ctx.LatestBlockNumber { - time.Sleep(3 * time.Second) - continue + if syncingBlobBlockNumber == 23373 { + log.Infof("debug") } + // if syncingBlobBlockNumber > ctx.LatestBlockNumber { + // time.Sleep(3 * time.Second) + // continue + //} + blockOnChain, err := ctx.RPC.BlockByNumber(context.Background(), big.NewInt(syncingBlobBlockNumber)) if err != nil { log.Errorf("[Handler.QueryBlobOnChainAndStoreInLocal] Get block by number error: %s", err.Error()) diff --git a/internal/svc/svc.go b/internal/svc/svc.go index ca139da..312c823 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -33,7 +33,6 @@ type ServiceContext struct { LatestBlockNumber int64 SyncedBlockNumber int64 SyncedBlockHash common.Hash - NodeClient *b2node.NodeClient LatestBTCBlockNumber int64 BlobDataSource *beacon.BlobDataSource SyncedBlobBlockNumber int64 @@ -45,7 +44,7 @@ type ServiceContext struct { func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2nodeConfig *types.B2NODEConfig) *ServiceContext { storage, err := gorm.Open(mysql.Open(cfg.MySQLDataSource), &gorm.Config{ - Logger: logger.Default.LogMode(logger.Info), + Logger: logger.Default.LogMode(logger.Error), }) if err != nil { log.Panicf("[svc]gorm get db panic: %s\n", err) @@ -67,17 +66,12 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 log.Panicf("[svc] get eth client panic: %s\n", err) } - privateKeHex := b2nodeConfig.PrivateKey - chainID := b2nodeConfig.ChainID - address := b2nodeConfig.Address - contractAddress := b2nodeConfig.CommitterAddress b2rpc, err := ethclient.Dial(b2nodeConfig.RPCUrl) if err != nil { log.Panicf("[svc] init b2node grpc panic: %s\n", err) } - nodeClient := b2node.NewNodeClient(privateKeHex, chainID, address, contractAddress, b2rpc) - l1Signer := ethTypes.NewCancunSigner(big.NewInt(chainID)) + l1Signer := ethTypes.NewCancunSigner(big.NewInt(cfg.BeaconChainID)) l1Beacon := sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(cfg.BeaconChainRPCUrl)) l1BlobFetcher := sources.NewL1BeaconClient(l1Beacon, sources.L1BeaconClientConfig{FetchAllSidecars: false}) bds := beacon.NewBlobDataSource(l1Signer, common.HexToAddress(cfg.BatcherInbox), common.HexToAddress(cfg.BatcherSender), l1BlobFetcher, rpc) @@ -103,7 +97,6 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 RPC: rpc, LatestBlockNumber: cfg.InitBlockNumber, B2NodeConfig: b2nodeConfig, - NodeClient: nodeClient, BlobDataSource: bds, OpCommitterClient: opCommitterClient, UnisatHTTPClient: unisatClient, diff --git a/internal/types/config.go b/internal/types/config.go index 6663489..0879ee6 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -15,6 +15,7 @@ type Config struct { MySQLMaxOpenConns int `env:"MYSQL_MAX_OPEN_CONNS" envDefault:"20"` MySQLConnMaxLifetime int `env:"MYSQL_CONN_MAX_LIFETIME" envDefault:"3600"` RPCUrl string `env:"RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` + BeaconChainID int64 `env:"BEACON_CHAIN_ID" envDefault:"11155111"` BeaconChainRPCUrl string `env:"BEACON_CHAIN_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` Blockchain string `env:"BLOCKCHAIN" envDefault:"b2-node"` InitBlockNumber int64 `env:"INIT_BLOCK_NUMBER" envDefault:"4102885"` @@ -22,7 +23,7 @@ type Config struct { InitBlobBlockNumber int64 `env:"INIT_BLOB_BLOCK_NUMBER" envDefault:"5687501"` InitBlobBlockHash string `env:"INIT_BLOB_BLOCK_HASH" envDefault:"0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee"` BlobIntervalTime uint64 `env:"BLOB_INTERVAL_TIME" envDefault:"1800"` - OutputIntervalTime uint64 `env:"OUTPUT_INTERVAL_TIME" envDefault:"3600"` + OutputIntervalTime uint64 `env:"OUTPUT_INTERVAL_TIME" envDefault:"1800"` L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` BatcherInbox string `env:"BATCHER_INBOX" envDefault:"0xff00000000000000000000000000000011155420"` BatcherSender string `env:"BATCHER_SENDER" envDefault:"0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c"` @@ -38,7 +39,6 @@ type Config struct { type B2NODEConfig struct { ChainID int64 `env:"B2NODE_CHAIN_ID" envDefault:"11155111"` RPCUrl string `env:"B2NODE_RPC_URL" envDefault:"https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30"` - CommitterAddress string `env:"B2NODE_COMMITTER_ADDRESS" envDefault:"0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D"` OpCommitterAddress string `env:"B2NODE_OP_COMMITTER_ADDRESS" envDefault:"0x270794Fc3ca753CDE033D2AeF9D00EAf71EbC386"` OpProposersAddress string `env:"B2NODE_OP_PROPOSERS_ADDRESS" envDefault:"0xcbC418ce125d806087da0DAb15d6ad50E035a250"` OpProposalManagerAddress string `env:"B2NODE_OP_PROPOSAL_MANAGER_ADDRESS" envDefault:"0x837596C1Aa783E3B06C7Efb10a51Fe6699208D1D"` diff --git a/internal/types/ds.go b/internal/types/ds.go index 156b53c..3d5bd37 100644 --- a/internal/types/ds.go +++ b/internal/types/ds.go @@ -10,7 +10,7 @@ type DsTxsProposal struct { ChainID int64 ProposalID uint64 TxsRoot string - Blobs []*DsBlob + Blobs []DsBlob } type DsStateRootProposal struct { @@ -47,29 +47,31 @@ func NewDsStateRootProposal(chainID int64, proposalID uint64, outputRoot string, }, nil } -func convertBlobToDsBlob(blobs []schema.BlobInfo) []*DsBlob { - var dsBlobs []*DsBlob - for _, blob := range blobs { - dsBlobs = append(dsBlobs, &DsBlob{ +// nolint: unparam +func convertBlobToDsBlob(blobs []schema.BlobInfo) []DsBlob { + var dsBlobs []DsBlob + for i, blob := range blobs { + dsBlobs[i] = DsBlob{ BlockID: blob.BlockNumber, Blob: blob.Blob, - }) + } } return dsBlobs } func (b *DsTxsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { var dbBlobs []schema.BlobInfo - for _, blob := range b.Blobs { - dbBlobs = append(dbBlobs, schema.BlobInfo{ + for i, blob := range b.Blobs { + dbBlobs[i] = schema.BlobInfo{ BlockNumber: blob.BlockID, Blob: blob.Blob, - }) + } } return dbBlobs, nil } -func (b *DsTxsProposal) MarshalJSON() ([]byte, error) { +// nolint: revive,stylecheck +func (b *DsTxsProposal) MarshalJson() ([]byte, error) { marshal, err := json.Marshal(b) if err != nil { return nil, err @@ -77,7 +79,8 @@ func (b *DsTxsProposal) MarshalJSON() ([]byte, error) { return marshal, nil } -func (s *DsStateRootProposal) MarshalJSON() ([]byte, error) { +// nolint: revive,stylecheck +func (s *DsStateRootProposal) MarshalJson() ([]byte, error) { marshal, err := json.Marshal(s) if err != nil { return nil, err diff --git a/pkg/b2node/b2node.go b/pkg/b2node/b2node.go deleted file mode 100644 index 774ec29..0000000 --- a/pkg/b2node/b2node.go +++ /dev/null @@ -1,175 +0,0 @@ -package b2node - -import ( - "crypto/ecdsa" - "fmt" - "math/big" - "time" - - "github.com/b2network/b2committer/internal/schema" - "github.com/b2network/b2committer/pkg/contract/zk" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" -) - -type NodeClient struct { - PrivateKey *ecdsa.PrivateKey - Address string - ChainID int64 - Conn *ethclient.Client - Committer *zk.Committer - Auth *bind.TransactOpts -} - -func NewNodeClient(privateKeyStr string, chainID int64, address string, contractAddress string, conn *ethclient.Client) *NodeClient { - privateKey, err := crypto.HexToECDSA(privateKeyStr) - if nil != err { - panic(err) - } - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - if err != nil { - panic(err) - } - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - if err != nil { - panic(err) - } - return &NodeClient{ - PrivateKey: privateKey, - Address: address, - ChainID: chainID, - Conn: conn, - Committer: committer, - Auth: auth, - } -} - -func (n NodeClient) AddCommitter(address string) (string, error) { - tx, err := n.Committer.AddProposer(&bind.TransactOpts{ - From: n.Auth.From, - Signer: n.Auth.Signer, - }, common.HexToAddress(address)) - if err != nil { - return "", fmt.Errorf("[AddCommitter] err: %s", err) - } - return tx.Hash().String(), nil -} - -func (n NodeClient) QueryAllProposers() ([]common.Address, error) { - res, err := n.Committer.AllProposers(&bind.CallOpts{}) - if err != nil { - return nil, fmt.Errorf("[QueryAllProposers] err: %s", err) - } - return res, nil -} - -func (n NodeClient) RemoveProposers(address common.Address) (*types.Transaction, error) { - tx, err := n.Committer.RemoveProposer(&bind.TransactOpts{ - From: n.Auth.From, - Signer: n.Auth.Signer, - }, address) - if err != nil { - return nil, fmt.Errorf("[RemoveProposers] err: %s", err) - } - return tx, nil -} - -func (n NodeClient) QueryLastProposal() (*zk.CommitterProposal, error) { - proposal, err := n.Committer.GetLastProposal(&bind.CallOpts{ - From: common.HexToAddress(n.Address), - }, uint64(n.ChainID)) - if err != nil { - return nil, fmt.Errorf("[QueryLastProposalID] err: %s", err) - } - return &proposal, nil -} - -func (n NodeClient) QueryProposalByID(id uint64) (*zk.CommitterProposal, error) { - proposal, err := n.Committer.Proposal(&bind.CallOpts{ - From: common.HexToAddress(n.Address), - }, uint64(n.ChainID), id) - if err != nil { - return nil, fmt.Errorf("[QueryProposalByID] err: %s", err) - } - return &proposal, nil -} - -func (n NodeClient) SubmitProof(id uint64, proofHash string, stateRootHash string, - startIndex uint64, endIndex uint64, -) (*types.Transaction, error) { - tx, err := n.Committer.SubmitProof(&bind.TransactOpts{ - From: n.Auth.From, - Signer: n.Auth.Signer, - }, uint64(n.ChainID), id, proofHash, stateRootHash, startIndex, endIndex) - if err != nil { - return nil, fmt.Errorf("[SubmitProof] err: %s", err) - } - return tx, nil -} - -func (n NodeClient) BitcoinTxHash(id uint64, txHash string) (*types.Transaction, error) { - tx, err := n.Committer.BitcoinTx(&bind.TransactOpts{ - From: n.Auth.From, - Signer: n.Auth.Signer, - }, uint64(n.ChainID), id, txHash) - if err != nil { - return nil, fmt.Errorf("[BitcoinTxHash] err: %s", err) - } - return tx, nil -} - -func (n NodeClient) ArweaveTx(id uint64, txHash string) (*types.Transaction, error) { - tx, err := n.Committer.ArweaveTx(&bind.TransactOpts{ - From: n.Auth.From, - Signer: n.Auth.Signer, - }, uint64(n.ChainID), id, txHash) - if err != nil { - return nil, fmt.Errorf("[ArweaveTx] err: %s", err) - } - return tx, nil -} - -func (n NodeClient) TimeoutProposal(id uint64) (*types.Transaction, error) { - tx, err := n.Committer.TimeoutProposal(&bind.TransactOpts{ - From: n.Auth.From, - Signer: n.Auth.Signer, - }, uint64(n.ChainID), id) - if err != nil { - return nil, fmt.Errorf("[TimeoutProposal] err: %s", err) - } - return tx, nil -} - -func (n NodeClient) IsProposalTimeout(id uint64) (bool, error) { - res, err := n.Committer.IsProposalTimeout(&bind.CallOpts{ - From: common.HexToAddress(n.Address), - }, uint64(n.ChainID), id) - if err != nil { - return false, fmt.Errorf("[IsProposalTimeout] err: %s", err) - } - return res, nil -} - -func (n NodeClient) CheckProposalTimeout(id uint64) (bool, error) { - res, err := n.IsProposalTimeout(id) - if err != nil { - return false, err - } - if res { - proposalLatest, err := n.QueryProposalByID(id) - if err != nil { - return true, err - } - if proposalLatest.Status != schema.ProposalTimeoutStatus { - _, err := n.TimeoutProposal(id) - if err != nil { - return true, err - } - time.Sleep(5 * time.Second) - } - } - return res, nil -} diff --git a/pkg/b2node/b2node_test.go b/pkg/b2node/b2node_test.go deleted file mode 100644 index 77c5a15..0000000 --- a/pkg/b2node/b2node_test.go +++ /dev/null @@ -1,251 +0,0 @@ -package b2node - -import ( - "fmt" - "github.com/b2network/b2committer/pkg/contract/zk" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" - "math/big" - "testing" -) - -const ( - creatorAddress = "0xb634434CA448c39b05b460dEC51f458EaC1e2759" - creatorPrivateKey = "0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551" - contractAddress = "0x85D40bDc724bcabF6D17d8343a74e0d916dfD40D" - URL = "https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30/" - chainID = 1113 - - SepoliaBatcherSender = "0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c" - SepoliaBatcherInbox = "0xff00000000000000000000000000000011155420" -) - -func TestQueryTimeoutPeriod(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - time, _ := committer.TimeoutPeriod(&bind.CallOpts{ - From: common.HexToAddress(creatorAddress), - }) - fmt.Println(time) -} - -func TestSetTimeoutPeriod(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.SetTimeoutPeriod(&bind.TransactOpts{ - From: common.HexToAddress(creatorAddress), - Signer: auth.Signer, - }, big.NewInt(60*20)) - require.NoError(t, err) - fmt.Println(tx.Hash()) -} - -func TestAddChain(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.AddChain(&bind.TransactOpts{ - From: auth.From, - Signer: auth.Signer, - }, 1113) - require.NoError(t, err) - fmt.Println(tx.Hash()) -} - -func TestQueryAllChain(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - res, err := committer.AllChains(&bind.CallOpts{ - From: common.HexToAddress(creatorAddress), - }) - fmt.Println(res) - require.NoError(t, err) - require.Containsf(t, res, uint64(1113), "error message %s") -} - -func TestAddCommitter(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.AddProposer(&bind.TransactOpts{ - From: auth.From, - Signer: auth.Signer, - }, common.HexToAddress(creatorAddress)) - require.NoError(t, err) - require.NotEmpty(t, tx.Hash()) -} - -func TestQueryAllCommitter(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - res, err := committer.AllProposers(&bind.CallOpts{ - From: common.HexToAddress(creatorAddress), - }) - fmt.Println(res) - require.NoError(t, err) - require.Containsf(t, res, common.HexToAddress(creatorAddress), "error message %s") -} - -func TestRemoveCommitter(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.RemoveProposer(&bind.TransactOpts{ - From: auth.From, - Signer: auth.Signer, - }, common.HexToAddress(creatorAddress)) - require.NotEmpty(t, tx.Hash()) -} - -func TestQueryLastProposalID(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - proposal, err := committer.GetLastProposal(&bind.CallOpts{ - From: common.HexToAddress(creatorAddress), - }, chainID) - require.NoError(t, err) - fmt.Println(proposal) -} - -func TestQueryProposalByID(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - proposal, err := committer.Proposal(&bind.CallOpts{ - From: common.HexToAddress(creatorAddress), - }, chainID, 1) - require.NoError(t, err) - fmt.Println(proposal) -} - -func TestSubmitProof(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.SubmitProof(&bind.TransactOpts{ - From: common.HexToAddress(creatorAddress), - Signer: auth.Signer, - }, chainID, 1, "proofHash", "stateRoot", 1, 56908) - require.NoError(t, err) - fmt.Println(tx.Hash()) -} - -func TestBitcoinTxHash(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.BitcoinTx(&bind.TransactOpts{ - From: common.HexToAddress(creatorAddress), - Signer: auth.Signer, - }, chainID, 1, "txHash") - require.NoError(t, err) - fmt.Println(tx.Hash()) -} - -func TestAr(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.ArweaveTx(&bind.TransactOpts{ - From: common.HexToAddress(creatorAddress), - Signer: auth.Signer, - }, chainID, 1, "arTxhash") - require.NoError(t, err) - fmt.Println(tx.Hash()) -} - -func TestIsProposalTimeout(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - res, err := committer.IsProposalTimeout(&bind.CallOpts{ - From: common.HexToAddress(creatorAddress), - }, chainID, 2) - fmt.Println(res) -} - -func TestTimeoutProposal(t *testing.T) { - conn, err := ethclient.Dial(URL) - require.NoError(t, err) - defer conn.Close() - - committer, err := zk.NewCommitter(common.HexToAddress(contractAddress), conn) - require.NoError(t, err) - privateKey, _ := crypto.HexToECDSA(creatorPrivateKey) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(chainID)) - require.NoError(t, err) - tx, err := committer.TimeoutProposal(&bind.TransactOpts{ - From: common.HexToAddress(creatorAddress), - Signer: auth.Signer, - }, chainID, 1) - require.NoError(t, err) - fmt.Println(tx.Hash()) -} diff --git a/pkg/beacon/l1_beacon_client.go b/pkg/beacon/l1_beacon_client.go index f47f60d..4454e12 100644 --- a/pkg/beacon/l1_beacon_client.go +++ b/pkg/beacon/l1_beacon_client.go @@ -20,9 +20,10 @@ type BlobDataSource struct { L1Signer types.Signer BatchInboxAddress common.Address BatchSenderAddress common.Address - data []BlockBlobInfo - BlobsFetcher *sources.L1BeaconClient - EthRPC *ethclient.Client + //nolint:unused + data []BlockBlobInfo + BlobsFetcher *sources.L1BeaconClient + EthRPC *ethclient.Client } func NewBlobDataSource(l1Signer types.Signer, batchInboxAddress common.Address, batchSenderAddress common.Address, @@ -37,7 +38,7 @@ func NewBlobDataSource(l1Signer types.Signer, batchInboxAddress common.Address, } } -func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big.Int) ([]*BlockBlobInfo, error) { +func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big.Int) ([]BlockBlobInfo, error) { block, err := bds.EthRPC.BlockByNumber(ctx, blockNum) if err != nil { return nil, fmt.Errorf("failed to get block %d: %v", blockNum, err) @@ -62,17 +63,19 @@ func (bds *BlobDataSource) GetBlobByBlockNum(ctx context.Context, blockNum *big. // If the L1 block was available, then the blobs should be available too. The only // exception is if the blob retention window has expired, which we will ultimately handle // by failing over to a blob archival service. - return nil, fmt.Errorf("failed to fetch blobs no record: %w", err) + return nil, fmt.Errorf("failed to fetch blobs: %w", err) } else if err != nil { return nil, fmt.Errorf("failed to fetch blobs: %w", err) } - var data []*BlockBlobInfo + //nolint:prealloc + var data []BlockBlobInfo for i, hash := range hashes { if blobSidecars[i] == nil { log.Errorf("blob %d not found in block %d", hash.Index, blockNum) continue } - data = append(data, &BlockBlobInfo{ + //nolint:gosec,exportloopref + data = append(data, BlockBlobInfo{ BlobSidecar: blobSidecars[i], Hash: &hash, }) From d4fc6b5f2b4aa3d7f5122e8c0eeae43d3493bdea Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:10:41 +0800 Subject: [PATCH 20/29] format --- internal/handler/op_committer_stateroot.go | 2 +- internal/handler/op_committer_txs.go | 2 +- internal/types/ds.go | 9 +++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index 574b45e..ad4c590 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -123,7 +123,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] constructing state root for ds is failed. err : %s", errors.WithStack(err)) } - dsJSON, err := stateRoots.MarshalJson() + dsJSON, err := stateRoots.ToJSONBytes() if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index 7f4986a..fe15a50 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -125,7 +125,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } dsProposal := types.NewDsTxsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) - dsJSON, err := dsProposal.MarshalJson() + dsJSON, err := dsProposal.ToJSONBytes() if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to marshal ds proposal: %s", err.Error()) time.Sleep(3 * time.Second) diff --git a/internal/types/ds.go b/internal/types/ds.go index 3d5bd37..1999459 100644 --- a/internal/types/ds.go +++ b/internal/types/ds.go @@ -47,9 +47,8 @@ func NewDsStateRootProposal(chainID int64, proposalID uint64, outputRoot string, }, nil } -// nolint: unparam func convertBlobToDsBlob(blobs []schema.BlobInfo) []DsBlob { - var dsBlobs []DsBlob + dsBlobs := make([]DsBlob, len(blobs)) for i, blob := range blobs { dsBlobs[i] = DsBlob{ BlockID: blob.BlockNumber, @@ -70,8 +69,7 @@ func (b *DsTxsProposal) GetDBBlobInfos() ([]schema.BlobInfo, error) { return dbBlobs, nil } -// nolint: revive,stylecheck -func (b *DsTxsProposal) MarshalJson() ([]byte, error) { +func (b *DsTxsProposal) ToJSONBytes() ([]byte, error) { marshal, err := json.Marshal(b) if err != nil { return nil, err @@ -79,8 +77,7 @@ func (b *DsTxsProposal) MarshalJson() ([]byte, error) { return marshal, nil } -// nolint: revive,stylecheck -func (s *DsStateRootProposal) MarshalJson() ([]byte, error) { +func (s *DsStateRootProposal) ToJSONBytes() ([]byte, error) { marshal, err := json.Marshal(s) if err != nil { return nil, err From 3ceb57d543401aad53018c6b15de91541241140a Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 29 Apr 2024 20:12:44 +0800 Subject: [PATCH 21/29] format --- internal/handler/handler.go | 18 ++++++++--------- internal/handler/op_committer_stateroot.go | 23 +++++++++++++--------- internal/handler/op_committer_txs.go | 6 +++++- internal/handler/syncBlock.go | 3 --- internal/handler/sync_blob.go | 11 ++++------- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 1170845..8ac8706 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -6,15 +6,15 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - // go LatestBlackNumber(ctx) - //// sync blocks - // go SyncBlock(ctx) - //// sync events - // go SyncEvent(ctx) - //// query blob and store in local - // go QueryBlobOnChainAndStoreInLocal(ctx) - //// commit and vote txs proposal - // go GetBlobsAndCommitTxsProposal(ctx) + go LatestBlackNumber(ctx) + // sync blocks + go SyncBlock(ctx) + // sync events + go SyncEvent(ctx) + // query blob and store in local + go QueryBlobOnChainAndStoreInLocal(ctx) + // commit and vote txs proposal + go GetBlobsAndCommitTxsProposal(ctx) // commit state root to ar and btc go GetStateRootAndCommitStateRootProposal(ctx) } diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index ad4c590..a901d21 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -29,7 +29,6 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { } for { lastProposal, err := ctx.OpCommitterClient.ProposalManager.GetLastStateRootProposal(&bind.CallOpts{}) - fmt.Println(lastProposal.Winner.String()) if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get last state root proposal from contract: %s", err.Error()) time.Sleep(3 * time.Second) @@ -48,17 +47,18 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { } _, err = ctx.OpCommitterClient.SubmitStateRoot(newStateRootProposal) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]Try to submit new state root proposal: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]Try to submit new state root proposal: %s, proposalID: %s", err.Error(), newStateRootProposal.ProposalID) time.Sleep(3 * time.Second) continue } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] submit new state root proposal: %s", newStateRootProposal.ProposalID) - time.Sleep(10 * time.Second) + time.Sleep(30 * time.Second) continue } //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { + time.Sleep(30 * time.Second) // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { @@ -98,7 +98,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) - continue + time.Sleep(30 * time.Second) } if lastProposal.Status == schema.ProposalPendingStatus { @@ -109,7 +109,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } if phase { - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted in pending status: %s", voteAddress) + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted in pending status: %s, proposalID: %s", voteAddress, lastProposal.ProposalID) continue } if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { @@ -135,12 +135,14 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to store ds proposal: %s", err.Error()) continue } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] proposal %s, success data to ds %s", lastProposal.ProposalID, dsTxID) _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, dsTxID) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal by winner: %s", err.Error()) continue } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, dsTxID) + time.Sleep(30 * time.Second) } if lastProposal.Winner != common.HexToAddress(voteAddress) { outputs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) @@ -173,14 +175,17 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { } _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal by voter: %s", err.Error()) continue } log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + time.Sleep(30 * time.Second) } + } if lastProposal.Status == schema.ProposalCommitting { + time.Sleep(30 * time.Second) isVotedBtcTx, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnSubmitBitcoinTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][IsVotedOnSubmitBitcoinTxPhase] is failed : %s", err) @@ -188,7 +193,7 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } if isVotedBtcTx { - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted btc tx in committing status: %s", voteAddress) + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted btc tx in committing status: %s, proposalID: %s", voteAddress, lastProposal.ProposalID) continue } if lastProposal.Winner == common.HexToAddress(voteAddress) { diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index fe15a50..fdd0858 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -35,6 +35,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { latestProposalID := lastProposal.ProposalID voteAddress := ctx.B2NodeConfig.Address if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { + time.Sleep(30 * time.Second) log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) // submit new proposal newTxsRootProposal, err := constructNextProposal(ctx, lastProposal) @@ -57,6 +58,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { + time.Sleep(30 * time.Second) // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { @@ -101,6 +103,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { } if lastProposal.Status == schema.ProposalPendingStatus { + time.Sleep(30 * time.Second) phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal][IsVotedOntxsRootDSTxPhase] is failed : %s", err) @@ -136,12 +139,14 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to store ds proposal: %s", err.Error()) continue } + log.Infof("[Handler.GetBlobsAndCommitProposal] proposal %s, success data to ds %s", lastProposal.ProposalID, dsTxID) _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, dsTxID) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) continue } log.Infof("[Handler.GetBlobsAndCommitProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + time.Sleep(30 * time.Second) } if lastProposal.Winner != common.HexToAddress(ctx.B2NodeConfig.Address) { blobs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) @@ -175,7 +180,6 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { log.Infof("[Handler.GetBlobsAndCommitProposal] success verify and vote submit txs from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) } } - time.Sleep(30 * time.Second) } } diff --git a/internal/handler/syncBlock.go b/internal/handler/syncBlock.go index 254cc35..fb8afa7 100644 --- a/internal/handler/syncBlock.go +++ b/internal/handler/syncBlock.go @@ -52,9 +52,6 @@ func SyncBlock(ctx *svc.ServiceContext) { } block := rpc.ParseJSONBlock(string(blockJSON)) log.Infof("[Handler.SyncBlock] Syncing block number: %d, hash: %v, parent hash: %v \n", block.Number(), block.Hash(), block.ParentHash()) - // 回滚判断 - fmt.Println("block.ParentHash", block.ParentHash()) - fmt.Println("SyncedBlockHash", ctx.SyncedBlockHash.String()) if common.HexToHash(block.ParentHash()) != ctx.SyncedBlockHash { log.Errorf("[Handler.SyncBlock] ParentHash of the block being synchronized is inconsistent: %s \n", ctx.SyncedBlockHash) diff --git a/internal/handler/sync_blob.go b/internal/handler/sync_blob.go index e72bf73..11c4240 100644 --- a/internal/handler/sync_blob.go +++ b/internal/handler/sync_blob.go @@ -38,14 +38,11 @@ func QueryBlobOnChainAndStoreInLocal(ctx *svc.ServiceContext) { for { syncingBlobBlockNumber := ctx.SyncedBlobBlockNumber + 1 log.Infof("[Handler.QueryBlobOnChainAndStoreInLocal] Try to sync block number: %d\n", syncingBlobBlockNumber) - if syncingBlobBlockNumber == 23373 { - log.Infof("debug") - } - // if syncingBlobBlockNumber > ctx.LatestBlockNumber { - // time.Sleep(3 * time.Second) - // continue - //} + if syncingBlobBlockNumber > ctx.LatestBlockNumber { + time.Sleep(3 * time.Second) + continue + } blockOnChain, err := ctx.RPC.BlockByNumber(context.Background(), big.NewInt(syncingBlobBlockNumber)) if err != nil { From f7b85172ab518417651e7574ef0e39b2265ea025 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Mon, 29 Apr 2024 20:14:39 +0800 Subject: [PATCH 22/29] format --- internal/handler/op_committer_txs.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index fdd0858..9e5b36b 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -58,7 +58,6 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { - time.Sleep(30 * time.Second) // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { @@ -99,11 +98,10 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } log.Infof("[Handler.GetBlobsAndCommitProposal] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) - continue + time.Sleep(30 * time.Second) } if lastProposal.Status == schema.ProposalPendingStatus { - time.Sleep(30 * time.Second) phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { log.Errorf("[Handler.GetBlobsAndCommitProposal][IsVotedOntxsRootDSTxPhase] is failed : %s", err) @@ -178,6 +176,7 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } log.Infof("[Handler.GetBlobsAndCommitProposal] success verify and vote submit txs from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + time.Sleep(30 * time.Second) } } } From 16e24360acca583c56adfacb58726befa20dfff9 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:46:32 +0800 Subject: [PATCH 23/29] format --- internal/handler/op_committer_stateroot.go | 2 -- internal/handler/op_committer_txs.go | 1 - 2 files changed, 3 deletions(-) diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index a901d21..c5b61ca 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -56,7 +56,6 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } - //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { time.Sleep(30 * time.Second) // check address voted or not @@ -181,7 +180,6 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) time.Sleep(30 * time.Second) } - } if lastProposal.Status == schema.ProposalCommitting { diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index 9e5b36b..5b2c0e6 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -56,7 +56,6 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } - //nolint: dupl if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { // check address voted or not phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) From e0a5af0b419c42619f180d7971e22d09e42796f4 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 7 May 2024 14:50:04 +0800 Subject: [PATCH 24/29] format --- internal/handler/handler.go | 18 +- internal/handler/op_committer_stateroot.go | 234 +------------- internal/handler/op_committer_txs.go | 137 +------- internal/handler/stateroot_committer.go | 344 +++++++++++++++++++++ internal/handler/txs_committer.go | 233 ++++++++++++++ internal/schema/txs_proposal.go | 2 +- internal/types/proposal.go | 38 ++- pkg/ds/ds.go | 1 - pkg/ds/ds_test.go | 7 +- 9 files changed, 648 insertions(+), 366 deletions(-) create mode 100644 internal/handler/stateroot_committer.go create mode 100644 internal/handler/txs_committer.go diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 8ac8706..07b2678 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -6,15 +6,15 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - go LatestBlackNumber(ctx) - // sync blocks - go SyncBlock(ctx) - // sync events - go SyncEvent(ctx) - // query blob and store in local - go QueryBlobOnChainAndStoreInLocal(ctx) - // commit and vote txs proposal - go GetBlobsAndCommitTxsProposal(ctx) + //go LatestBlackNumber(ctx) + //// sync blocks + //go SyncBlock(ctx) + //// sync events + //go SyncEvent(ctx) + //// query blob and store in local + //go QueryBlobOnChainAndStoreInLocal(ctx) + //// commit and vote txs proposal + //go GetBlobsAndCommitTxsProposal(ctx) // commit state root to ar and btc go GetStateRootAndCommitStateRootProposal(ctx) } diff --git a/internal/handler/op_committer_stateroot.go b/internal/handler/op_committer_stateroot.go index c5b61ca..5be9d57 100644 --- a/internal/handler/op_committer_stateroot.go +++ b/internal/handler/op_committer_stateroot.go @@ -1,7 +1,6 @@ package handler import ( - "context" "encoding/hex" "encoding/json" "fmt" @@ -10,9 +9,7 @@ import ( "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/internal/types" - "github.com/b2network/b2committer/pkg/btcapi" "github.com/b2network/b2committer/pkg/contract/op" - "github.com/b2network/b2committer/pkg/inscribe" "github.com/b2network/b2committer/pkg/log" "github.com/b2network/b2committer/pkg/merkle" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -35,253 +32,43 @@ func GetStateRootAndCommitStateRootProposal(ctx *svc.ServiceContext) { continue } latestProposalID := lastProposal.ProposalID - voteAddress := ctx.B2NodeConfig.Address if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] this proposal has been successful or just beginning : %d", latestProposalID) - // submit new proposal - newStateRootProposal, err := constructNextStateRootProposal(ctx, lastProposal) + tx, newStateRootProposal, err := SubmitNextStateRootProposal(ctx, lastProposal, latestProposalID) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to construct new state root proposal: %s", err.Error()) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to submit proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } - _, err = ctx.OpCommitterClient.SubmitStateRoot(newStateRootProposal) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]Try to submit new state root proposal: %s, proposalID: %s", err.Error(), newStateRootProposal.ProposalID) - time.Sleep(3 * time.Second) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] submit new state root proposal: %s", newStateRootProposal.ProposalID) - time.Sleep(30 * time.Second) - continue + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] submit new proposal success. proposalID: %s, transaction: %s", newStateRootProposal.ProposalID, tx.Hash()) } if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { - time.Sleep(30 * time.Second) - // check address voted or not - phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + err = ProcessStateRootVotingAndTimeoutState(ctx, lastProposal) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to find address voted or not: %s", err) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][ProcessStateRootVotingAndTimeoutState] Try to process voting and timeout state: %s", err.Error()) time.Sleep(3 * time.Second) continue } - if phase { - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted in voting status: %s", voteAddress) - continue - } - var voteProposalStartL1Timestamp uint64 - var voteProposalEndL1Timestamp uint64 - if lastProposal.ProposalID == 1 { - voteProposalStartL1Timestamp = lastProposal.StartL1Timestamp - voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.OutputIntervalTime - } else { - beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]Try to get before last proposal: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - voteProposalStartL1Timestamp = beforeLastProposal.EndTimestamp + 1 - voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.OutputIntervalTime - } - tsp, err := constructStateRootProposal(ctx, lastProposal.ProposalID, voteProposalStartL1Timestamp, voteProposalEndL1Timestamp) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to construct new proposal to vote: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - _, err = ctx.OpCommitterClient.SubmitStateRoot(tsp) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to submit new proposal to vote: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) - time.Sleep(30 * time.Second) } if lastProposal.Status == schema.ProposalPendingStatus { - phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + err = ProcessStateRootPendingStates(ctx, lastProposal) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][IsVotedOnStateRootDSTxPhase] is failed : %s", err) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][ProcessStateRootPendingStates] Try to process pending state: %s", err.Error()) time.Sleep(3 * time.Second) continue } - if phase { - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted in pending status: %s, proposalID: %s", voteAddress, lastProposal.ProposalID) - continue - } - if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { - var events []schema.SyncEvent - err = ctx.DB.Where("block_time between ? and ?", lastProposal.StartL1Timestamp, lastProposal.EndL1Timestamp).Order("block_number").Find(&events).Error - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal]collecting the state root blocks of proposal is failed. err : %s", errors.WithStack(err)) - continue - } - stateRoots, err := types.NewDsStateRootProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, lastProposal.OutputRoot, events) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] constructing state root for ds is failed. err : %s", errors.WithStack(err)) - } - dsJSON, err := stateRoots.ToJSONBytes() - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to marshal ds proposal: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - - dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJSON, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to store ds proposal: %s", err.Error()) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] proposal %s, success data to ds %s", lastProposal.ProposalID, dsTxID) - _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, dsTxID) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal by winner: %s", err.Error()) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, dsTxID) - time.Sleep(30 * time.Second) - } - if lastProposal.Winner != common.HexToAddress(voteAddress) { - outputs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from ds: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - var dsProposal types.DsStateRootProposal - err = json.Unmarshal(outputs, &dsProposal) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to unmarshal ds proposal: %s", err.Error()) - continue - } - - events, err := types.ConvertOutputsToEventData(dsProposal.OutputEvents) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to convert outputs to event data: %s", err.Error()) - continue - } - verifyOutputRoots, err := GetOutputRootMerkleRoot(events) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs merkle root: %s", err.Error()) - continue - } - - if verifyOutputRoots != lastProposal.OutputRoot { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to verify output from ds: %s", err.Error()) - continue - } - _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal by voter: %s", err.Error()) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) - time.Sleep(30 * time.Second) - } } if lastProposal.Status == schema.ProposalCommitting { - time.Sleep(30 * time.Second) - isVotedBtcTx, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnSubmitBitcoinTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + err = ProcessStateRootCommittingStates(ctx, lastProposal) if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][IsVotedOnSubmitBitcoinTxPhase] is failed : %s", err) + log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal][ProcessStateRootCommittingStates] Try to process committing state: %s", err.Error()) time.Sleep(3 * time.Second) continue } - if isVotedBtcTx { - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] address already voted btc tx in committing status: %s, proposalID: %s", voteAddress, lastProposal.ProposalID) - continue - } - if lastProposal.Winner == common.HexToAddress(voteAddress) { - stateRoot := &types.StateRootProposal{ - ProposalID: lastProposal.ProposalID, - OutputRoot: lastProposal.OutputRoot, - StartL1Timestamp: lastProposal.StartL1Timestamp, - EndL1Timestamp: lastProposal.EndL1Timestamp, - StartL2BlockNumber: lastProposal.StartL2BlockNumber, - EndL2BlockNumber: lastProposal.EndL2BlockNumber, - OutputStartIndex: lastProposal.OutputStartIndex, - OutputEndIndex: lastProposal.OutputEndIndex, - } - btcStateRoot := &types.BtcStateRootProposal{ - Proposal: stateRoot, - ChainID: ctx.B2NodeConfig.ChainID, - } - content, err := json.Marshal(btcStateRoot) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Pending btcHash Try to marshal state root proposal: %s", err.Error()) - continue - } - rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, content, - ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Inscribe state root err: %s\n", errors.WithStack(err).Error()) - continue - } - str, err := json.Marshal(rs) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Marshal result err: %s\n", errors.WithStack(err).Error()) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] inscribe result: %s", str) - bitcoinTxHash := rs.RevealTxHashList[0].String() - _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, bitcoinTxHash) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send bitcoin tx hash: %s, winner:%s", err.Error(), lastProposal.Winner.String()) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit content to btc network. proposalID: %s, btcTxHash: %s", lastProposal.ProposalID, bitcoinTxHash) - time.Sleep(30 * time.Second) - } else { - outs, err := ctx.UnisatHTTPClient.QueryAPIBTCTxOutputsByTxID(context.Background(), lastProposal.BitcoinTxHash) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - if len(outs.Data) == 0 { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: no data") - time.Sleep(3 * time.Second) - continue - } - if len(outs.Data[0].Inscriptions) == 0 { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: no inscription") - time.Sleep(3 * time.Second) - continue - } - blockHeight := outs.Data[0].Height + 6 - if uint64(ctx.LatestBTCBlockNumber) < blockHeight { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to get outputs from btc: block height is too low") - time.Sleep(3 * time.Second) - continue - } - - insID := outs.Data[0].Inscriptions[0].InscriptionID - btcStateRootProposal, err := ctx.UnisatHTTPClient.QueryStateRootProposalByInsID(context.Background(), insID) - if lastProposal.ProposalID != btcStateRootProposal.Proposal.ProposalID || - btcStateRootProposal.Proposal.OutputRoot != lastProposal.OutputRoot || - btcStateRootProposal.Proposal.StartL1Timestamp != lastProposal.StartL1Timestamp || - btcStateRootProposal.Proposal.EndL1Timestamp != lastProposal.EndL1Timestamp || - btcStateRootProposal.Proposal.StartL2BlockNumber != lastProposal.StartL2BlockNumber || - btcStateRootProposal.Proposal.EndL2BlockNumber != lastProposal.EndL2BlockNumber || - btcStateRootProposal.Proposal.OutputStartIndex != lastProposal.OutputStartIndex || - btcStateRootProposal.Proposal.OutputEndIndex != lastProposal.OutputEndIndex || - btcStateRootProposal.ChainID != ctx.B2NodeConfig.ChainID { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to verify btc state root proposal: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - - _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, lastProposal.BitcoinTxHash) - if err != nil { - log.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to vote bitcoin tx hash: %s", err.Error()) - continue - } - log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success verify and vote submit output from btc: %s, btcTxHash: %s", lastProposal.ProposalID, lastProposal.BitcoinTxHash) - } } + time.Sleep(15 * time.Second) } } @@ -310,7 +97,6 @@ func constructNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpP func constructStateRootProposal(ctx *svc.ServiceContext, proposalID uint64, startTimestamp uint64, endTimestamp uint64) (*types.StateRootProposal, error) { var event schema.SyncEvent - var events []schema.SyncEvent for { event = schema.SyncEvent{} diff --git a/internal/handler/op_committer_txs.go b/internal/handler/op_committer_txs.go index 5b2c0e6..7e06d16 100644 --- a/internal/handler/op_committer_txs.go +++ b/internal/handler/op_committer_txs.go @@ -3,7 +3,6 @@ package handler import ( "crypto/sha256" "encoding/hex" - "encoding/json" "fmt" "time" @@ -33,151 +32,33 @@ func GetBlobsAndCommitTxsProposal(ctx *svc.ServiceContext) { continue } latestProposalID := lastProposal.ProposalID - voteAddress := ctx.B2NodeConfig.Address if lastProposal.Status == schema.ProposalSucceedStatus || lastProposal.ProposalID == 0 { - time.Sleep(30 * time.Second) - log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) - // submit new proposal - newTxsRootProposal, err := constructNextProposal(ctx, lastProposal) + tx, newProposal, err := SubmitNextTxsProposal(ctx, lastProposal, latestProposalID) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal: %s", err.Error()) + log.Errorf("[Handler.GetBlobsAndCommitProposal][SubmitNextTxsProposal] Try to submit proposal: %s", err.Error()) time.Sleep(3 * time.Second) continue } - - _, err = ctx.OpCommitterClient.SubmitTxsRoot(newTxsRootProposal) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - log.Infof("[Handler.GetBlobsAndCommitProposal] submit new txs proposal: %s", newTxsRootProposal.ProposalID) - time.Sleep(10 * time.Second) - continue + log.Infof("[Handler.GetBlobsAndCommitProposal][SubmitNextTxsProposal] submit new proposal success. proposalID: %s, transaction: %s", newProposal.ProposalID, tx.Hash()) } - if lastProposal.Status == schema.ProposalVotingStatus || lastProposal.Status == schema.ProposalTimeoutStatus { - // check address voted or not - phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + err = ProcessTxsVotingAndTimeoutState(ctx, lastProposal) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to find address voted or not: %s", err) + log.Errorf("[Handler.GetBlobsAndCommitProposal][ProcessVotingAndTimeoutState] Try to process voting and timeout state: %s", err.Error()) time.Sleep(3 * time.Second) continue } - if phase { - log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted in voting status: %s", voteAddress) - continue - } - var voteProposalStartTimestamp uint64 - var voteProposalEndTimestamp uint64 - if lastProposal.ProposalID == 1 { - voteProposalStartTimestamp = lastProposal.StartTimestamp - voteProposalEndTimestamp = voteProposalStartTimestamp + ctx.Config.BlobIntervalTime - } else { - beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get before last proposal: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - voteProposalStartTimestamp = beforeLastProposal.EndTimestamp + 1 - voteProposalEndTimestamp = voteProposalStartTimestamp + ctx.Config.BlobIntervalTime - } - - tsp, err := constructTxsRootProposal(ctx, lastProposal.ProposalID, voteProposalStartTimestamp, voteProposalEndTimestamp) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to construct new proposal to vote: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - _, err = ctx.OpCommitterClient.SubmitTxsRoot(tsp) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to submit new proposal to vote: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - log.Infof("[Handler.GetBlobsAndCommitProposal] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) - time.Sleep(30 * time.Second) } - if lastProposal.Status == schema.ProposalPendingStatus { - phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + err = ProcessTxsPendingStates(ctx, lastProposal) if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal][IsVotedOntxsRootDSTxPhase] is failed : %s", err) + log.Errorf("[Handler.GetBlobsAndCommitProposal][ProcessPendingStates] Try to process pending state: %s", err.Error()) time.Sleep(3 * time.Second) continue } - if phase { - log.Infof("[Handler.GetBlobsAndCommitProposal] address already voted in pending status: %s", voteAddress) - continue - } - if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { - blobs, err := GetBlobsByBlockListFromDB(ctx, lastProposal.BlockList) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from db: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs merkle root: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - dsProposal := types.NewDsTxsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) - dsJSON, err := dsProposal.ToJSONBytes() - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to marshal ds proposal: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJSON, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to store ds proposal: %s", err.Error()) - continue - } - log.Infof("[Handler.GetBlobsAndCommitProposal] proposal %s, success data to ds %s", lastProposal.ProposalID, dsTxID) - _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, dsTxID) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) - continue - } - log.Infof("[Handler.GetBlobsAndCommitProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) - time.Sleep(30 * time.Second) - } - if lastProposal.Winner != common.HexToAddress(ctx.B2NodeConfig.Address) { - blobs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from ds: %s", err.Error()) - time.Sleep(3 * time.Second) - continue - } - var dsProposal types.DsTxsProposal - err = json.Unmarshal(blobs, &dsProposal) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to unmarshal ds proposal: %s", err.Error()) - continue - } - dbBlobs, err := dsProposal.GetDBBlobInfos() - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to get blobs from ds: %s", err.Error()) - continue - } - verifyTxsRootHash, err := GetBlobsMerkleRoot(dbBlobs) - - if verifyTxsRootHash != lastProposal.TxsRoot { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to verify blobs from ds: %s", err.Error()) - continue - } - _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) - if err != nil { - log.Errorf("[Handler.GetBlobsAndCommitProposal] Try to send ds proposal: %s", err.Error()) - continue - } - log.Infof("[Handler.GetBlobsAndCommitProposal] success verify and vote submit txs from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) - time.Sleep(30 * time.Second) - } + log.Infof("[Handler.GetBlobsAndCommitProposal] success verify and vote submit txs from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) } + time.Sleep(15 * time.Second) } } diff --git a/internal/handler/stateroot_committer.go b/internal/handler/stateroot_committer.go new file mode 100644 index 0000000..2ef1ca0 --- /dev/null +++ b/internal/handler/stateroot_committer.go @@ -0,0 +1,344 @@ +package handler + +import ( + "context" + "encoding/json" + "fmt" + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/btcapi" + "github.com/b2network/b2committer/pkg/contract/op" + "github.com/b2network/b2committer/pkg/inscribe" + "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/pkg/errors" + "time" +) + +func SubmitNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, latestProposalID uint64) (*ethTypes.Transaction, *types.StateRootProposal, error) { + log.Infof("[SubmitNextStateRootProposal] this proposal has been successful or just beginning : %d", latestProposalID) + // submit new proposal + newStateRootProposal, err := constructNextStateRootProposal(ctx, lastProposal) + if err != nil { + return nil, nil, fmt.Errorf("[SubmitNextStateRootProposal] Try to construct new state root proposal: %s", err.Error()) + } + tx, err := ctx.OpCommitterClient.SubmitStateRoot(newStateRootProposal) + if err != nil { + return nil, nil, fmt.Errorf("[SubmitNextStateRootProposal]Try to submit new state root proposal: %s, proposalID: %s", err.Error(), newStateRootProposal.ProposalID) + } + voteAddress := ctx.B2NodeConfig.Address + err = confirmSubmitStateRootProposal(ctx, newStateRootProposal.ProposalID, voteAddress) + if err != nil { + return nil, nil, fmt.Errorf("[ProcessStateRootVotingAndTimeoutState] Try to confirm SubmitStateRoot failed: %s", err.Error()) + } + log.Infof("[SubmitNextStateRootProposal] submit new state root proposal: %s", newStateRootProposal.ProposalID) + return tx, newStateRootProposal, nil +} + +func ProcessStateRootVotingAndTimeoutState(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal) error { + voteAddress := ctx.B2NodeConfig.Address + // check address voted or not + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + return fmt.Errorf("[ProcessStateRootVotingAndTimeoutState] Try to find address voted or not: %s", err) + } + if phase { + return fmt.Errorf("[ProcessStateRootVotingAndTimeoutState] address already voted in voting status: %s", voteAddress) + } + var voteProposalStartL1Timestamp uint64 + var voteProposalEndL1Timestamp uint64 + if lastProposal.ProposalID == 1 { + voteProposalStartL1Timestamp = lastProposal.StartL1Timestamp + voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.OutputIntervalTime + } else { + beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetStateRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) + if err != nil { + return fmt.Errorf("[ProcessStateRootVotingAndTimeoutState]Try to get before last proposal: %s", err.Error()) + } + voteProposalStartL1Timestamp = beforeLastProposal.EndL1Timestamp + 1 + voteProposalEndL1Timestamp = voteProposalStartL1Timestamp + ctx.Config.OutputIntervalTime + } + tsp, err := constructStateRootProposal(ctx, lastProposal.ProposalID, voteProposalStartL1Timestamp, voteProposalEndL1Timestamp) + if err != nil { + return fmt.Errorf("[ProcessStateRootVotingAndTimeoutState] Try to construct new proposal to vote: %s", err.Error()) + } + _, err = ctx.OpCommitterClient.SubmitStateRoot(tsp) + if err != nil { + return fmt.Errorf("[ProcessStateRootVotingAndTimeoutState] Try to submit new proposal to vote: %s", err.Error()) + } + err = confirmSubmitStateRootProposal(ctx, tsp.ProposalID, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootVotingAndTimeoutState] Try to confirm SubmitStateRoot failed: %s", err.Error()) + } + log.Infof("[ProcessStateRootVotingAndTimeoutState] vote txs proposal %s, %s ", tsp.ProposalID, voteAddress) + return nil +} + +func ProcessStateRootPendingStates(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal) error { + voteAddress := ctx.B2NodeConfig.Address + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingStates][IsVotedOntxsRootDSTxPhase] is failed : %s", err) + } + if phase { + return fmt.Errorf("[ProcessStateRootPendingStates][IsVotedOntxsRootDSTxPhase] address already voted in pending status: %s", voteAddress) + } + if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { + err = ProcessStateRootPendingWinner(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingStates][ProcessStateRootPendingWinner] Try to process pending winner: %s", err.Error()) + } + } else { + err = ProcessStateRootPendingVoter(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingStates][ProcessStateRootPendingVoter] Try to process pending voter: %s", err.Error()) + } + } + return nil +} + +func ProcessStateRootPendingWinner(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { + var events []schema.SyncEvent + err := ctx.DB.Where("block_time between ? and ?", lastProposal.StartL1Timestamp, lastProposal.EndL1Timestamp).Order("block_number").Find(&events).Error + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner]collecting the state root blocks of proposal is failed. err : %s", errors.WithStack(err)) + } + stateRoots, err := types.NewDsStateRootProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, lastProposal.OutputRoot, events) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner] constructing state root for ds is failed. err : %s", errors.WithStack(err)) + } + dsJSON, err := stateRoots.ToJSONBytes() + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner] Try to marshal ds proposal: %s", err.Error()) + } + + dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJSON, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner] Try to store ds proposal: %s", err.Error()) + } + err = confirmDSTransaction(ctx, dsTxID) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner] Try to confirm ds tx: %s", err.Error()) + } + log.Infof("[ProcessStateRootPendingWinner] proposal %s, success data to ds %s", lastProposal.ProposalID, dsTxID) + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, dsTxID) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner] Try to send ds proposal by winner: %s", err.Error()) + } + err = confirmStateRootDSTxPhase(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingWinner][confirmStateRootDSTxPhase] Try to confirm ds tx phase: %s", err.Error()) + } + log.Infof("[ProcessStateRootPendingWinner] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, dsTxID) + return nil +} + +func ProcessStateRootPendingVoter(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { + outputs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingVoter] Try to get outputs from ds: %s", err.Error()) + } + var dsProposal types.DsStateRootProposal + err = json.Unmarshal(outputs, &dsProposal) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingVoter] Try to unmarshal ds proposal: %s", err.Error()) + } + + events, err := types.ConvertOutputsToEventData(dsProposal.OutputEvents) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingVoter] Try to convert outputs to event data: %s", err.Error()) + } + verifyOutputRoots, err := GetOutputRootMerkleRoot(events) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingVoter] Try to get outputs merkle root: %s", err.Error()) + } + + if verifyOutputRoots != lastProposal.OutputRoot { + return fmt.Errorf("[ProcessStateRootPendingVoter] Try to verify output from ds: %s", err.Error()) + } + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeStateRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) + if err != nil { + return fmt.Errorf("[Handler.GetStateRootAndCommitStateRootProposal] Try to send ds proposal by voter: %s", err.Error()) + } + err = confirmStateRootDSTxPhase(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingVoter][confirmDSTxPhase] Try to confirm ds tx phase: %s", err.Error()) + } + log.Infof("[ProcessStateRootPendingVoter] success verify and vote submit output from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + return nil +} + +func ProcessStateRootCommittingStates(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal) error { + voteAddress := ctx.B2NodeConfig.Address + isVotedBtcTx, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnSubmitBitcoinTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingStates][IsVotedOnSubmitBitcoinTxPhase] is failed : %s", err) + } + if isVotedBtcTx { + return fmt.Errorf("[ProcessStateRootCommittingStates] address already voted btc tx in committing status: %s, proposalID: %s", voteAddress, lastProposal.ProposalID) + } + if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { + err = ProcessStateRootCommittingWinner(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingStates][ProcessStateRootPendingWinner] Try to process pending winner: %s", err.Error()) + } + } else { + err = ProcessStateRootCommittingVoter(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootPendingStates][ProcessStateRootPendingVoter] Try to process pending voter: %s", err.Error()) + } + } + return nil +} + +func ProcessStateRootCommittingWinner(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { + stateRoot := &types.StateRootProposal{ + ProposalID: lastProposal.ProposalID, + OutputRoot: lastProposal.OutputRoot, + StartL1Timestamp: lastProposal.StartL1Timestamp, + EndL1Timestamp: lastProposal.EndL1Timestamp, + StartL2BlockNumber: lastProposal.StartL2BlockNumber, + EndL2BlockNumber: lastProposal.EndL2BlockNumber, + OutputStartIndex: lastProposal.OutputStartIndex, + OutputEndIndex: lastProposal.OutputEndIndex, + } + btcStateRoot := &types.BtcStateRootProposal{ + Proposal: stateRoot, + ChainID: ctx.B2NodeConfig.ChainID, + } + content, err := json.Marshal(btcStateRoot) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingWinner] Pending btcHash Try to marshal state root proposal: %s", err.Error()) + } + rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, content, + ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingWinner] Inscribe state root err: %s\n", errors.WithStack(err).Error()) + } + str, err := json.Marshal(rs) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingWinner] Marshal result err: %s\n", errors.WithStack(err).Error()) + } + log.Infof("[ProcessStateRootCommittingWinner] inscribe result: %s", str) + bitcoinTxHash := rs.RevealTxHashList[0].String() + _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, bitcoinTxHash) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingWinner] Try to send bitcoin tx hash: %s, winner:%s", err.Error(), lastProposal.Winner.String()) + } + err = confirmBitcoinTxHashPhase(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingWinner][confirmBitcoinTxHashPhase] Try to confirm btc tx hash phase: %s", err.Error()) + } + log.Infof("[Handler.GetStateRootAndCommitStateRootProposal] success submit content to btc network. proposalID: %s, btcTxHash: %s", lastProposal.ProposalID, bitcoinTxHash) + return nil +} + +func ProcessStateRootCommittingVoter(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { + outs, err := ctx.UnisatHTTPClient.QueryAPIBTCTxOutputsByTxID(context.Background(), lastProposal.BitcoinTxHash) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingVoter] Try to get outputs from btc: %s", err.Error()) + } + if len(outs.Data) == 0 { + return fmt.Errorf("[ProcessStateRootCommittingVoter] Try to get outputs from btc: no data") + } + if len(outs.Data[0].Inscriptions) == 0 { + return fmt.Errorf("[ProcessStateRootCommittingVoter] Try to get outputs from btc: no inscription") + } + blockHeight := outs.Data[0].Height + 6 + if uint64(ctx.LatestBTCBlockNumber) < blockHeight { + return fmt.Errorf("[ProcessStateRootCommittingVoter] Try to get outputs from btc: block height is too low") + } + + insID := outs.Data[0].Inscriptions[0].InscriptionID + btcStateRootProposal, err := ctx.UnisatHTTPClient.QueryStateRootProposalByInsID(context.Background(), insID) + if lastProposal.ProposalID != btcStateRootProposal.Proposal.ProposalID || + btcStateRootProposal.Proposal.OutputRoot != lastProposal.OutputRoot || + btcStateRootProposal.Proposal.StartL1Timestamp != lastProposal.StartL1Timestamp || + btcStateRootProposal.Proposal.EndL1Timestamp != lastProposal.EndL1Timestamp || + btcStateRootProposal.Proposal.StartL2BlockNumber != lastProposal.StartL2BlockNumber || + btcStateRootProposal.Proposal.EndL2BlockNumber != lastProposal.EndL2BlockNumber || + btcStateRootProposal.Proposal.OutputStartIndex != lastProposal.OutputStartIndex || + btcStateRootProposal.Proposal.OutputEndIndex != lastProposal.OutputEndIndex || + btcStateRootProposal.ChainID != ctx.B2NodeConfig.ChainID { + return fmt.Errorf("[ProcessStateRootCommittingVoter] Try to verify btc state root proposal: %s", err.Error()) + } + + _, err = ctx.OpCommitterClient.BitcoinTxHash(lastProposal.ProposalID, lastProposal.BitcoinTxHash) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingVoter] Try to vote bitcoin tx hash: %s", err.Error()) + } + err = confirmBitcoinTxHashPhase(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessStateRootCommittingVoter][confirmBitcoinTxHashPhase] Try to confirm btc tx hash phase: %s", err.Error()) + } + log.Infof("[ProcessStateRootCommittingVoter] success verify and vote submit output from btc: %s, btcTxHash: %s", lastProposal.ProposalID, lastProposal.BitcoinTxHash) + return nil +} + +func confirmBitcoinTxHashPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { + var times uint64 = 0 + for { + if times > 60 { + return fmt.Errorf("[confirmBitcoinTxHashPhase] confirmBitcoinTxHashPhase fail, proposalID: %s, voteAddress: %s", lastProposal.ProposalID, voteAddress) + } + confirmBTCTx, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnSubmitBitcoinTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + fmt.Printf("[confirmBitcoinTxHashPhase] is failed : %s\n, proposalID: %d\n, voteAddress: %s\n\n", err, lastProposal.ProposalID, voteAddress) + time.Sleep(60 * time.Second) + times++ + continue + } + if confirmBTCTx { + log.Infof("[confirmBitcoinTxHashPhase] confirm bitcoin tx hash has been processed : %s, proposal: %s", voteAddress, lastProposal.ProposalID) + break + } + times++ + } + return nil +} + +func confirmStateRootDSTxPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { + var times uint64 = 0 + for { + if times > 60 { + return fmt.Errorf("[confirmDSTxPhase] confirmDSTxPhase fail, proposalID: %s, voteAddress: %s", lastProposal.ProposalID, voteAddress) + } + res, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + fmt.Printf("[confirmStateRootDSTxPhase] is failed : %s\n, proposalID: %d\n, voteAddress: %s\n\n", err, lastProposal.ProposalID, voteAddress) + time.Sleep(60 * time.Second) + times++ + continue + } + if res { + log.Infof("[confirmStateRootDSTxPhase] confirm decentralized store has been processed : %s, proposal: %s", voteAddress, lastProposal.ProposalID) + break + } + times++ + } + return nil +} + +func confirmSubmitStateRootProposal(ctx *svc.ServiceContext, proposalID uint64, voteAddress string) error { + var times uint64 = 0 + for { + if times > 60 { + return fmt.Errorf("[confirmSubmitStateRootProposal] confirm SubmitStateRoot fail") + } + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootProposalPhase(&bind.CallOpts{}, proposalID, common.HexToAddress(voteAddress)) + if err != nil { + fmt.Printf("[confirmSubmitStateRootProposal] Try to check submitTxProposal status fail: %s\n", err) + time.Sleep(60 * time.Second) + continue + } + if phase { + log.Infof("[confirmSubmitStateRootProposal] proposalID: %s voteAddress: %s, IsVotedOnTxsRootProposalPhase", proposalID, voteAddress) + break + } + times++ + } + return nil +} diff --git a/internal/handler/txs_committer.go b/internal/handler/txs_committer.go new file mode 100644 index 0000000..066d606 --- /dev/null +++ b/internal/handler/txs_committer.go @@ -0,0 +1,233 @@ +package handler + +import ( + "encoding/json" + "fmt" + "github.com/b2network/b2committer/internal/schema" + "github.com/b2network/b2committer/internal/svc" + "github.com/b2network/b2committer/internal/types" + "github.com/b2network/b2committer/pkg/contract/op" + "github.com/b2network/b2committer/pkg/log" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/pkg/errors" + "time" +) + +func SubmitNextTxsProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal, latestProposalID uint64) (*ethTypes.Transaction, *types.TxsRootProposal, error) { + log.Infof("this proposal has been successful or just beginning : %d", latestProposalID) + // submit new proposal + newTxsRootProposal, err := constructNextProposal(ctx, lastProposal) + if err != nil { + return nil, nil, fmt.Errorf("[SubmitNextTxsProposal][GetBlobsAndCommitProposal] Try to construct new proposal: %s", err.Error()) + } + + trans, err := ctx.OpCommitterClient.SubmitTxsRoot(newTxsRootProposal) + if err != nil { + return nil, nil, fmt.Errorf("[SubmitNextTxsProposal][GetBlobsAndCommitProposal] Try to submit new proposal: %s", err.Error()) + } + voteAddress := ctx.B2NodeConfig.Address + err = confirmSubmitTxsProposal(ctx, newTxsRootProposal.ProposalID, voteAddress) + if err != nil { + return nil, nil, fmt.Errorf("[SubmitNextTxsProposal][confirmSubmitTxsProposal] Try to confirm submitTxProposal failed: %s", err.Error()) + } + log.Infof("[SubmitNextTxsProposal] submit new txs proposal: %s", newTxsRootProposal.ProposalID) + return trans, newTxsRootProposal, nil +} + +func ProcessTxsVotingAndTimeoutState(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) error { + voteAddress := ctx.B2NodeConfig.Address + // check address voted or not + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + return fmt.Errorf("[ProcessVotingAndTimeoutState] Try to find address voted or not in Voting and Timeout phase: %s", err) + } + if phase { + return fmt.Errorf("[ProcessVotingAndTimeoutState] address already voted in voting status: %s", voteAddress) + } + var voteProposalStartTimestamp uint64 + var voteProposalEndTimestamp uint64 + if lastProposal.ProposalID == 1 { + voteProposalStartTimestamp = lastProposal.StartTimestamp + voteProposalEndTimestamp = voteProposalStartTimestamp + ctx.Config.BlobIntervalTime + } else { + beforeLastProposal, err := ctx.OpCommitterClient.ProposalManager.GetTxsRootProposal(&bind.CallOpts{}, lastProposal.ProposalID-1) + if err != nil { + return fmt.Errorf("[ProcessVotingAndTimeoutState] Try to get before last proposal: %s", err.Error()) + } + voteProposalStartTimestamp = beforeLastProposal.EndTimestamp + 1 + voteProposalEndTimestamp = voteProposalStartTimestamp + ctx.Config.BlobIntervalTime + } + + tsp, err := constructTxsRootProposal(ctx, lastProposal.ProposalID, voteProposalStartTimestamp, voteProposalEndTimestamp) + if err != nil { + return fmt.Errorf("[ProcessVotingAndTimeoutState] Try to construct new proposal to vote: %s", err.Error()) + } + txs, err := ctx.OpCommitterClient.SubmitTxsRoot(tsp) + if err != nil { + return fmt.Errorf("[ProcessVotingAndTimeoutState] Try to submit new proposal to vote: %s", err.Error()) + } + err = confirmSubmitTxsProposal(ctx, tsp.ProposalID, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessVotingAndTimeoutState][confirmSubmitTxsProposal] Try to confirm submitTxProposal failed: %s", err.Error()) + } + log.Infof("[ProcessVotingAndTimeoutState] vote txs proposal %s, %s, transaction: %s ", tsp.ProposalID, voteAddress, txs.Hash()) + return nil +} + +func ProcessTxsPendingStates(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal) error { + voteAddress := ctx.B2NodeConfig.Address + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + return fmt.Errorf("[ProcessPendingStates][IsVotedOntxsRootDSTxPhase] is failed : %s", err) + } + if phase { + return fmt.Errorf("[Handler.GetBlobsAndCommitProposal] address already voted in pending status: %s", voteAddress) + } + if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { + err = ProcessTxsPendingWinner(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessPendingStates][ProcessPendingWinner] Try to process pending winner: %s", err.Error()) + } + } else { + err = ProcessTxsPendingVoter(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessPendingStates][ProcessPendingVoter] Try to process pending voter: %s", err.Error()) + } + } + return nil +} + +func ProcessTxsPendingVoter(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal, voteAddress string) error { + blobs, err := ctx.DecentralizedStore.QueryDetailsByTxID(lastProposal.DsTxHash) + if err != nil { + return fmt.Errorf("[ProcessPendingVoter] Try to get blobs from ds: %s", err.Error()) + } + var dsProposal types.DsTxsProposal + err = json.Unmarshal(blobs, &dsProposal) + if err != nil { + return fmt.Errorf("[ProcessPendingVoter] Try to unmarshal ds proposal: %s", err.Error()) + } + dbBlobs, err := dsProposal.GetDBBlobInfos() + if err != nil { + return fmt.Errorf("[ProcessPendingVoter] Try to get blobs from ds: %s", err.Error()) + } + verifyTxsRootHash, err := GetBlobsMerkleRoot(dbBlobs) + + if verifyTxsRootHash != lastProposal.TxsRoot { + return fmt.Errorf("[ProcessPendingVoter] Try to verify blobs from ds: %s", err.Error()) + } + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, lastProposal.DsTxHash) + if err != nil { + return fmt.Errorf("[ProcessPendingVoter] Try to send ds proposal: %s", err.Error()) + } + err = confirmTxsDSTxPhase(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessPendingVoter][confirmDSTxPhase] Try to confirm ds tx phase: %s", err.Error()) + } + log.Infof("[ProcessPendingVoter] success verify and vote submit txs from ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + return nil +} + +func ProcessTxsPendingWinner(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal, voteAddress string) error { + blobs, err := GetBlobsByBlockListFromDB(ctx, lastProposal.BlockList) + if err != nil { + return fmt.Errorf("[ProcessPendingWinner][GetBlobsByBlockListFromDB] Try to get blobs from db: %s", err.Error()) + + } + blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) + if err != nil { + return fmt.Errorf("[ProcessPendingWinner][GetBlobsMerkleRoot] Try to get blobs merkle root: %s", err.Error()) + } + dsProposal := types.NewDsTxsProposal(ctx.B2NodeConfig.ChainID, lastProposal.ProposalID, blobMerkleRoot, blobs) + dsJSON, err := dsProposal.ToJSONBytes() + if err != nil { + return fmt.Errorf("[ProcessPendingWinner] Try to marshal ds proposal: %s", err.Error()) + } + // 重试机制 + dsTxID, err := ctx.DecentralizedStore.StoreDetailsOnChain(dsJSON, ctx.B2NodeConfig.ChainID, lastProposal.ProposalID) + if err != nil { + return fmt.Errorf("[StoreDetailsOnChain] Try to store ds proposal on decentralized store: %s", err.Error()) + } + err = confirmDSTransaction(ctx, dsTxID) + if err != nil { + return fmt.Errorf("[confirmDSTransaction] Try to confirm ds tx: %s", err.Error()) + } + log.Infof("[Handler.GetBlobsAndCommitProposal] proposal %s, success data to ds %s", lastProposal.ProposalID, dsTxID) + _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, dsTxID) + if err != nil { + return fmt.Errorf("[OpCommitterClient.DsHash] Try to send ds proposal: %s", err.Error()) + + } + err = confirmTxsDSTxPhase(ctx, lastProposal, voteAddress) + if err != nil { + return fmt.Errorf("[ProcessPendingWinner][confirmDSTxPhase] confirm ds tx phase %s", err.Error()) + } + log.Infof("[Handler.GetBlobsAndCommitProposal] success submit txs to ds: %s, dsHash: %s", lastProposal.ProposalID, lastProposal.DsTxHash) + return nil +} + +func confirmSubmitTxsProposal(ctx *svc.ServiceContext, proposalID uint64, voteAddress string) error { + var times uint64 = 0 + for { + if times > 60 { + return fmt.Errorf("[confirmSubmitTxsProposal] confirm submitTxsRoot fail") + } + phase, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnTxsRootProposalPhase(&bind.CallOpts{}, proposalID, common.HexToAddress(voteAddress)) + if err != nil { + fmt.Printf("[confirmSubmitTxsProposal] Try to check submitTxProposal status fail: %s\n", err) + time.Sleep(60 * time.Second) + continue + } + if phase { + log.Infof("[confirmSubmitTxsProposal] proposalID: %s voteAddress: %s, IsVotedOnTxsRootProposalPhase", proposalID, voteAddress) + break + } + times++ + } + return nil +} + +func confirmTxsDSTxPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal, voteAddress string) error { + var times uint64 = 0 + for { + if times > 60 { + return fmt.Errorf("[confirmDSTxPhase] confirmDSTxPhase fail, proposalID: %s, voteAddress: %s", lastProposal.ProposalID, voteAddress) + } + res, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) + if err != nil { + fmt.Printf("[confirmDSTxPhase] is failed : %s\n, proposalID: %d\n, voteAddress: %s\n\n", err, lastProposal.ProposalID, voteAddress) + time.Sleep(60 * time.Second) + times++ + continue + } + if res { + log.Infof("[confirmDSTxPhase] confirm decentralized store has been processed : %s, proposal: %s", voteAddress, lastProposal.ProposalID) + break + } + times++ + } + return nil +} + +func confirmDSTransaction(ctx *svc.ServiceContext, dsTxID string) error { + var times uint64 = 0 + for { + if times > 60 { + return fmt.Errorf("[confirmDSTransaction] confirmDSTransaction fail, dsTxID: %s", dsTxID) + } + bytes, err := ctx.DecentralizedStore.QueryDetailsByTxID(dsTxID) + if err != nil { + fmt.Printf("[confirmDSTransaction] Try to query details by txID: %s\n", errors.WithStack(err).Error()) + time.Sleep(60 * time.Second) + times++ + continue + } + if len(bytes) != 0 { + break + } + times++ + } + return nil +} diff --git a/internal/schema/txs_proposal.go b/internal/schema/txs_proposal.go index de31716..babf29e 100644 --- a/internal/schema/txs_proposal.go +++ b/internal/schema/txs_proposal.go @@ -16,7 +16,7 @@ type TxsProposal struct { DsType uint8 DsTxHash string Winner common.Address - BlockList []uint64 + BlockList string } func (TxsProposal) TableName() string { diff --git a/internal/types/proposal.go b/internal/types/proposal.go index b68f58a..d1c7307 100644 --- a/internal/types/proposal.go +++ b/internal/types/proposal.go @@ -2,8 +2,9 @@ package types import ( "encoding/json" - "github.com/b2network/b2committer/internal/schema" + "strconv" + "strings" ) type TxsRootProposal struct { @@ -14,6 +15,36 @@ type TxsRootProposal struct { EndBlockNumber uint64 TxsRoot string BlockList []uint64 + BlockListStr string +} + +func convertBlockListToString(blockList []uint64) string { + strArr := make([]string, 0) + for _, block := range blockList { + number := strconv.FormatUint(block, 10) + if !stringExistsInSlice(strArr, number) { + strArr = append(strArr, number) + } + } + return strings.Join(strArr, ",") +} + +func stringExistsInSlice(slice []string, target string) bool { + for _, element := range slice { + if element == target { + return true + } + } + return false +} + +func uintExistsInSlice(slice []uint64, target uint64) bool { + for _, element := range slice { + if element == target { + return true + } + } + return false } func NewTxsRootProposal(proposalID uint64, txsRoot string, blobs []schema.BlobInfo) *TxsRootProposal { @@ -26,6 +57,7 @@ func NewTxsRootProposal(proposalID uint64, txsRoot string, blobs []schema.BlobIn TxsRoot: txsRoot, } fillBlockListAndBlockInfo(blobs, proposal) + proposal.BlockListStr = convertBlockListToString(proposal.BlockList) return proposal } @@ -45,7 +77,9 @@ func fillBlockListAndBlockInfo(blobs []schema.BlobInfo, proposal *TxsRootProposa if proposal.EndTimestamp < blob.BlockTime { proposal.EndTimestamp = blob.BlockTime } - blockList = append(blockList, uint64(blob.BlockNumber)) + if !uintExistsInSlice(blockList, uint64(blob.BlockNumber)) { + blockList = append(blockList, uint64(blob.BlockNumber)) + } } proposal.BlockList = blockList } diff --git a/pkg/ds/ds.go b/pkg/ds/ds.go index e3841ec..763e0e1 100644 --- a/pkg/ds/ds.go +++ b/pkg/ds/ds.go @@ -9,7 +9,6 @@ import ( type DecentralizedStore interface { StoreDetailsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) - QueryDetailsByTxID(txID string) ([]byte, error) } type ArWeave struct { diff --git a/pkg/ds/ds_test.go b/pkg/ds/ds_test.go index 20b8217..01e0353 100644 --- a/pkg/ds/ds_test.go +++ b/pkg/ds/ds_test.go @@ -11,8 +11,13 @@ import ( func TestQueryTxsByTxID(t *testing.T) { arClient := goar.NewClient("https://arweave.net") - txs, _ := arClient.GetTransactionData("5m16jdjzJpWAOrCd83CM9izkn8md1IYKcsOK2SMESDU", "json") + txs, _ := arClient.GetTransactionData("vKYQjEJIl2n8r6u_cmM5YMev8KAJ3DAwOMhsNI717Ws", "json") + //require.NoError(t, err) fmt.Println(string(txs)) + + //state, err := arClient.GetTransactionStatus("tB0zc2qLAGsw8x2kNUUPqzOBQuRV1C5CFWEN5tfY2CY") + //require.NoError(t, err) + //fmt.Println(state) } func TestSendData(t *testing.T) { From b1387087a36ce5d108ebf394e6da0d2a7dd219d1 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Tue, 7 May 2024 15:31:17 +0800 Subject: [PATCH 25/29] format --- internal/handler/handler.go | 18 +++++++++--------- internal/handler/stateroot_committer.go | 21 +++++++++++---------- internal/handler/txs_committer.go | 13 ++++++------- internal/types/proposal.go | 3 ++- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 07b2678..8ac8706 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -6,15 +6,15 @@ import ( func Run(ctx *svc.ServiceContext) { // query last block number - //go LatestBlackNumber(ctx) - //// sync blocks - //go SyncBlock(ctx) - //// sync events - //go SyncEvent(ctx) - //// query blob and store in local - //go QueryBlobOnChainAndStoreInLocal(ctx) - //// commit and vote txs proposal - //go GetBlobsAndCommitTxsProposal(ctx) + go LatestBlackNumber(ctx) + // sync blocks + go SyncBlock(ctx) + // sync events + go SyncEvent(ctx) + // query blob and store in local + go QueryBlobOnChainAndStoreInLocal(ctx) + // commit and vote txs proposal + go GetBlobsAndCommitTxsProposal(ctx) // commit state root to ar and btc go GetStateRootAndCommitStateRootProposal(ctx) } diff --git a/internal/handler/stateroot_committer.go b/internal/handler/stateroot_committer.go index 2ef1ca0..92f7096 100644 --- a/internal/handler/stateroot_committer.go +++ b/internal/handler/stateroot_committer.go @@ -4,6 +4,8 @@ import ( "context" "encoding/json" "fmt" + "time" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/internal/types" @@ -15,7 +17,6 @@ import ( "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/pkg/errors" - "time" ) func SubmitNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, latestProposalID uint64) (*ethTypes.Transaction, *types.StateRootProposal, error) { @@ -27,7 +28,7 @@ func SubmitNextStateRootProposal(ctx *svc.ServiceContext, lastProposal op.OpProp } tx, err := ctx.OpCommitterClient.SubmitStateRoot(newStateRootProposal) if err != nil { - return nil, nil, fmt.Errorf("[SubmitNextStateRootProposal]Try to submit new state root proposal: %s, proposalID: %s", err.Error(), newStateRootProposal.ProposalID) + return nil, nil, fmt.Errorf("[SubmitNextStateRootProposal]Try to submit new state root proposal: %s, proposalID: %d", err.Error(), newStateRootProposal.ProposalID) } voteAddress := ctx.B2NodeConfig.Address err = confirmSubmitStateRootProposal(ctx, newStateRootProposal.ProposalID, voteAddress) @@ -178,7 +179,7 @@ func ProcessStateRootCommittingStates(ctx *svc.ServiceContext, lastProposal op.O return fmt.Errorf("[ProcessStateRootCommittingStates][IsVotedOnSubmitBitcoinTxPhase] is failed : %s", err) } if isVotedBtcTx { - return fmt.Errorf("[ProcessStateRootCommittingStates] address already voted btc tx in committing status: %s, proposalID: %s", voteAddress, lastProposal.ProposalID) + return fmt.Errorf("[ProcessStateRootCommittingStates] address already voted btc tx in committing status: %s, proposalID: %d", voteAddress, lastProposal.ProposalID) } if lastProposal.Winner == common.HexToAddress(ctx.B2NodeConfig.Address) { err = ProcessStateRootCommittingWinner(ctx, lastProposal, voteAddress) @@ -216,11 +217,11 @@ func ProcessStateRootCommittingWinner(ctx *svc.ServiceContext, lastProposal op.O rs, err := inscribe.Inscribe(ctx.BTCConfig.PrivateKey, content, ctx.BTCConfig.DestinationAddress, btcapi.ChainParams(ctx.BTCConfig.NetworkName)) if err != nil { - return fmt.Errorf("[ProcessStateRootCommittingWinner] Inscribe state root err: %s\n", errors.WithStack(err).Error()) + return fmt.Errorf("[ProcessStateRootCommittingWinner] Inscribe state root err: %s", errors.WithStack(err).Error()) } str, err := json.Marshal(rs) if err != nil { - return fmt.Errorf("[ProcessStateRootCommittingWinner] Marshal result err: %s\n", errors.WithStack(err).Error()) + return fmt.Errorf("[ProcessStateRootCommittingWinner] Marshal result err: %s", errors.WithStack(err).Error()) } log.Infof("[ProcessStateRootCommittingWinner] inscribe result: %s", str) bitcoinTxHash := rs.RevealTxHashList[0].String() @@ -279,10 +280,10 @@ func ProcessStateRootCommittingVoter(ctx *svc.ServiceContext, lastProposal op.Op } func confirmBitcoinTxHashPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { - var times uint64 = 0 + var times uint64 for { if times > 60 { - return fmt.Errorf("[confirmBitcoinTxHashPhase] confirmBitcoinTxHashPhase fail, proposalID: %s, voteAddress: %s", lastProposal.ProposalID, voteAddress) + return fmt.Errorf("[confirmBitcoinTxHashPhase] confirmBitcoinTxHashPhase fail, proposalID: %d, voteAddress: %s", lastProposal.ProposalID, voteAddress) } confirmBTCTx, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnSubmitBitcoinTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { @@ -301,10 +302,10 @@ func confirmBitcoinTxHashPhase(ctx *svc.ServiceContext, lastProposal op.OpPropos } func confirmStateRootDSTxPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalStateRootProposal, voteAddress string) error { - var times uint64 = 0 + var times uint64 for { if times > 60 { - return fmt.Errorf("[confirmDSTxPhase] confirmDSTxPhase fail, proposalID: %s, voteAddress: %s", lastProposal.ProposalID, voteAddress) + return fmt.Errorf("[confirmDSTxPhase] confirmDSTxPhase fail, proposalID: %d, voteAddress: %s", lastProposal.ProposalID, voteAddress) } res, err := ctx.OpCommitterClient.ProposalManager.IsVotedOnStateRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { @@ -323,7 +324,7 @@ func confirmStateRootDSTxPhase(ctx *svc.ServiceContext, lastProposal op.OpPropos } func confirmSubmitStateRootProposal(ctx *svc.ServiceContext, proposalID uint64, voteAddress string) error { - var times uint64 = 0 + var times uint64 for { if times > 60 { return fmt.Errorf("[confirmSubmitStateRootProposal] confirm SubmitStateRoot fail") diff --git a/internal/handler/txs_committer.go b/internal/handler/txs_committer.go index 066d606..069e3b4 100644 --- a/internal/handler/txs_committer.go +++ b/internal/handler/txs_committer.go @@ -3,6 +3,8 @@ package handler import ( "encoding/json" "fmt" + "time" + "github.com/b2network/b2committer/internal/schema" "github.com/b2network/b2committer/internal/svc" "github.com/b2network/b2committer/internal/types" @@ -12,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/pkg/errors" - "time" ) func SubmitNextTxsProposal(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal, latestProposalID uint64) (*ethTypes.Transaction, *types.TxsRootProposal, error) { @@ -134,7 +135,6 @@ func ProcessTxsPendingWinner(ctx *svc.ServiceContext, lastProposal op.OpProposal blobs, err := GetBlobsByBlockListFromDB(ctx, lastProposal.BlockList) if err != nil { return fmt.Errorf("[ProcessPendingWinner][GetBlobsByBlockListFromDB] Try to get blobs from db: %s", err.Error()) - } blobMerkleRoot, err := GetBlobsMerkleRoot(blobs) if err != nil { @@ -158,7 +158,6 @@ func ProcessTxsPendingWinner(ctx *svc.ServiceContext, lastProposal op.OpProposal _, err = ctx.OpCommitterClient.DsHash(lastProposal.ProposalID, schema.ProposalTypeTxsRoot, schema.DsTypeArWeave, dsTxID) if err != nil { return fmt.Errorf("[OpCommitterClient.DsHash] Try to send ds proposal: %s", err.Error()) - } err = confirmTxsDSTxPhase(ctx, lastProposal, voteAddress) if err != nil { @@ -169,7 +168,7 @@ func ProcessTxsPendingWinner(ctx *svc.ServiceContext, lastProposal op.OpProposal } func confirmSubmitTxsProposal(ctx *svc.ServiceContext, proposalID uint64, voteAddress string) error { - var times uint64 = 0 + var times uint64 for { if times > 60 { return fmt.Errorf("[confirmSubmitTxsProposal] confirm submitTxsRoot fail") @@ -190,10 +189,10 @@ func confirmSubmitTxsProposal(ctx *svc.ServiceContext, proposalID uint64, voteAd } func confirmTxsDSTxPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsRootProposal, voteAddress string) error { - var times uint64 = 0 + var times uint64 for { if times > 60 { - return fmt.Errorf("[confirmDSTxPhase] confirmDSTxPhase fail, proposalID: %s, voteAddress: %s", lastProposal.ProposalID, voteAddress) + return fmt.Errorf("[confirmDSTxPhase] confirmDSTxPhase fail, proposalID: %d, voteAddress: %s", lastProposal.ProposalID, voteAddress) } res, err := ctx.OpCommitterClient.ProposalManager.IsVotedOntxsRootDSTxPhase(&bind.CallOpts{}, lastProposal.ProposalID, common.HexToAddress(voteAddress)) if err != nil { @@ -212,7 +211,7 @@ func confirmTxsDSTxPhase(ctx *svc.ServiceContext, lastProposal op.OpProposalTxsR } func confirmDSTransaction(ctx *svc.ServiceContext, dsTxID string) error { - var times uint64 = 0 + var times uint64 for { if times > 60 { return fmt.Errorf("[confirmDSTransaction] confirmDSTransaction fail, dsTxID: %s", dsTxID) diff --git a/internal/types/proposal.go b/internal/types/proposal.go index d1c7307..65fe68b 100644 --- a/internal/types/proposal.go +++ b/internal/types/proposal.go @@ -2,9 +2,10 @@ package types import ( "encoding/json" - "github.com/b2network/b2committer/internal/schema" "strconv" "strings" + + "github.com/b2network/b2committer/internal/schema" ) type TxsRootProposal struct { From 47bb32da088e96675b86b8db11fe582ab56362cc Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Thu, 23 May 2024 10:28:37 +0800 Subject: [PATCH 26/29] change file name --- internal/svc/svc.go | 6 +++--- pkg/{ds/ds.go => store/arweave.go} | 6 +----- pkg/{ds/ds_test.go => store/arweave_test.go} | 2 +- pkg/store/store.go | 6 ++++++ 4 files changed, 11 insertions(+), 9 deletions(-) rename pkg/{ds/ds.go => store/arweave.go} (84%) rename pkg/{ds/ds_test.go => store/arweave_test.go} (98%) create mode 100644 pkg/store/store.go diff --git a/internal/svc/svc.go b/internal/svc/svc.go index 312c823..d0e134d 100644 --- a/internal/svc/svc.go +++ b/internal/svc/svc.go @@ -9,8 +9,8 @@ import ( "github.com/b2network/b2committer/pkg/beacon" "github.com/b2network/b2committer/pkg/client" "github.com/b2network/b2committer/pkg/contract/op" - "github.com/b2network/b2committer/pkg/ds" "github.com/b2network/b2committer/pkg/log" + "github.com/b2network/b2committer/pkg/store" "github.com/b2network/b2committer/pkg/unisat" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" @@ -38,7 +38,7 @@ type ServiceContext struct { SyncedBlobBlockNumber int64 SyncedBlobBlockHash common.Hash OpCommitterClient *b2node.OpCommitterClient - DecentralizedStore ds.DecentralizedStore + DecentralizedStore store.DecentralizedStore UnisatHTTPClient *unisat.UstHTTPClient } @@ -121,7 +121,7 @@ func NewServiceContext(cfg *types.Config, bitcoinCfg *types.BitcoinRPCConfig, b2 log.Panicf("[svc] init arweave wallet panic: %s\n", err) } - svc.DecentralizedStore = ds.NewArWeave(w, arClient) + svc.DecentralizedStore = store.NewArWeave(w, arClient) } return svc diff --git a/pkg/ds/ds.go b/pkg/store/arweave.go similarity index 84% rename from pkg/ds/ds.go rename to pkg/store/arweave.go index 763e0e1..b26c0ed 100644 --- a/pkg/ds/ds.go +++ b/pkg/store/arweave.go @@ -1,4 +1,4 @@ -package ds +package store import ( "strconv" @@ -7,10 +7,6 @@ import ( "github.com/everFinance/goar/types" ) -type DecentralizedStore interface { - StoreDetailsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) - QueryDetailsByTxID(txID string) ([]byte, error) -} type ArWeave struct { Client *goar.Client Wallet *goar.Wallet diff --git a/pkg/ds/ds_test.go b/pkg/store/arweave_test.go similarity index 98% rename from pkg/ds/ds_test.go rename to pkg/store/arweave_test.go index 01e0353..5af8ad4 100644 --- a/pkg/ds/ds_test.go +++ b/pkg/store/arweave_test.go @@ -1,4 +1,4 @@ -package ds +package store import ( "fmt" diff --git a/pkg/store/store.go b/pkg/store/store.go new file mode 100644 index 0000000..d7f119f --- /dev/null +++ b/pkg/store/store.go @@ -0,0 +1,6 @@ +package store + +type DecentralizedStore interface { + StoreDetailsOnChain(txs []byte, chainID int64, proposalID uint64) (string, error) + QueryDetailsByTxID(txID string) ([]byte, error) +} From 7f06c6d04b40be496bd031c30e147dd5bf9c907c Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Thu, 23 May 2024 13:39:27 +0800 Subject: [PATCH 27/29] fix README.md --- README.md | 114 ++++++++++++++++----------------------- img_1.png | Bin 0 -> 75007 bytes img_2.png | Bin 0 -> 102566 bytes internal/types/config.go | 2 - 4 files changed, 45 insertions(+), 71 deletions(-) create mode 100644 img_1.png create mode 100644 img_2.png diff --git a/README.md b/README.md index 157b78f..ca2c30f 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,55 @@ # b2-committer -## Introduction - -![img.png](img.png) -## Details -https://github.com/b2network/b2-node/issues/93 - -## Description - -Step1:Rollup Aggregator invoke method verifyBatchesTrustedAggregator in PolygonZkEVM.sol -Step2: b2-committer listen for events (verifyBatchesTrustedAggregator) and store data in Mysql -Step3: b2-committer submit proposal to b2-node (send a transaction) -``` -transaction { - "proposalId": getLastProposalId() from b2-node api, - "stateRoot": rootHash from a merkle tree which contains all the stateRoots of the batch, which are range of startBatchNum and endBatchNum, - "rootHash" from a merkle tree which contains all the proofs of the batch, which are range of startBatchNum and endBatchNum, - "startBatchNum": getFinalBatch() from b2-node rpc or rest interface, - "endBatchNum": startBatchNum + 10 (defined a constant) -``` - -Generate a proposal in b2-node depends on this transaction. -``` -proposal { - "transaction": transaction from above describe, - "currentBlockNum": the current b2-node block number, - "voteMax": how many b2-committer node need to vote, - "txVoteNum": voteNums Step3, - "resultVoteNum": voteNums Step8, - "winAddress": which address has the entitlement to execute submitter to submit data(stateRoot and proof) to btc network - "btcTxId": btc tx id which contains the stateRoot and proof - "voteAdressList": already vote address list, - "state": (PENDING, SUCCESS, TIMEOUT), -} -``` -simple algorithm about winAddressIndex -``` - winAddressIndex = tx_id% voteAdressList - winAddress = voteAdressList[winAddressIndex] -``` -you can get winAddress using api of b2-node. - -after generated a proposal, put proposalId to channel[proposalId] - -Step4: get proposalId from channel[proposalId]] and search proposal state from b2-node api. -if state is PENDING, and check winAddress equal local b2-committer address, then execute submitter to submit data(stateRoot and proof) to btc network -Step5: get the btcTxId from Step4, and put it in channel[btcTxId], and then update finalBatchNum in b2-node -Step6: go service loop channel[btcTxId] and get the btcTxId, and query the blockNum of btc network by btcTxId. If blockNum is confirmed, then execute Step7. -Step7: the b2-committer which execute btc transaction and get the btcTxId update the proposal btcTxId. -Step8: every b2-committer node loop their channel[proposalId] to check btcTxId is null or not. If not, then check the btcTxId blockHeight and submit a transaction to b2-node to vote. -resultVoteNum++. if resultVoteNum > 50%, then update state to SUCCESS. -Step9: loop check proposal by proposalId from channel[proposalId]. if the state of proposal is still PENDING and (currentBlockNum - proposal.currentBlockNum)> 10000, than update state to TIMEOUT and go to Step 3 again. - +# Introduce +Submit op txs to decentralized store(e.g arweave) +![img_1.png](img_1.png) +Submit op l2 state roots to decentralized store(e.g arweave) +![img_2.png](img_2.png) ## environment Variables -| env | value | description | remarks | -|------------|----------------------------------------------------------------------------------------------------------|------------------------|--------------------| -| LOG_LEVEL | info | | warn、error、panic、fatal | -| LOG_FORMAT | text | | options: text、json | -| MYSQL_DATA_SOURCE | root:root@tcp(127.0.0.1:3306)/b2_committer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true | | | -| MYSQL_MAX_IDLE_CONNS | 10 | | | -| MYSQL_MAX_OPEN_CONNS | 20 | | | -| MYSQL_CONN_MAX_LIFETIME | 3600 | | | -| RPC_URL | https://b2-nodes.bsquared.network | B2NODE-RPC | | -| BLOCKCHAIN | B2-NODE | | | -| INIT_BLOCK_NUMBER | 0 | block-height | | -| INIT_BLOCK_HASH | 0xfbecff3c9ca93f097d243d01d027d28f9bdcdebfb3208977246504ef4dddfc08 | block-hash | | | -| POLYGON_ZKEVM_ADDRESS | 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 | | | -| NETWORK_NAME | testnet3 | btc-network type | | -| BITCOIN_PRIVATE_KEY | | privateKey | | -| COMMITTER_DESTINATION_ADDRESS | 0xB50109D57ae713388dc404eb2e8311bd9A8125a9 | btc commit destination | | | - +| env | value | description | remarks | +| ---------------------------------- | ------------------------------------------------------------ | ---------------------------------------- | ------------------------- | +| LOG_LEVEL | info | | warn、error、panic、fatal | +| LOG_FORMAT | text | | options: text、json | +| MYSQL_DATA_SOURCE | root:root@tcp(127.0.0.1:3306)/b2_committer?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true | | | +| MYSQL_MAX_IDLE_CONNS | 10 | | | +| MYSQL_MAX_OPEN_CONNS | 20 | | | +| MYSQL_CONN_MAX_LIFETIME | 3600 | | | +| RPC_URL | https://b2-nodes.bsquared.network | B2NODE-RPC | | +| BEACON_CHAIN_ID | 11155111 | | | +| BEACON_CHAIN_RPC_URL | 3600 | | | +| BLOCKCHAIN | B2-NODE | | | +| INIT_BLOCK_NUMBER | 0 | for begainning to sync block to local db | | +| INIT_BLOCK_HASH | 0x9612534dc810c9c51211c77def2db781d7cc7979b0cb076a47c9fc6fb6dc475c | Init block hash | | +| INIT_BLOB_BLOCK_NUMBER | 5687501 | | | +| INIT_BLOB_BLOCK_HASH | 0x6218666b40fce4153e8f5349ab2f9d2590a601e5a178e4b6d4580094d5c0c2ee | | | +| BLOB_INTERVAL_TIME | 3600 | btc-network type | | +| OUTPUT_INTERVAL_TIME | 3600 | btc-network type | | +| L2_OUTPUT_ORACLE_PROXY_CONTRACT | 0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F | btc-network type | | +| BATCHER_INBOX | 0xff00000000000000000000000000000011155420 (op batcher inbox) | btc-network type | | +| BATCHER_SENDER | 0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c (op batcher inbox) | btc-network type | | +| DSTYPE | arweave (DecentralizedStore type) | btc-network type | | +| B2NODE_ARWEAVE_WALLET | /tmp/wallet/account.json | btc-network type | | +| B2NODE_ARWEAVE_RPC | https://arweave.net | btc-network type | | +| UNISAT_URL | https://open-api-testnet.unisat.io/ | privateKey | | +| UNISAT_PRIVATE_KEY | | btc commit destination | | +| B2NODE_CHAIN_ID | 11155111 | btc commit destination | | +| B2NODE_RPC_URL | 11155111 | btc commit destination | | +| B2NODE_OP_COMMITTER_ADDRESS | 0x270794Fc3ca753CDE033D2AeF9D00EAf71EbC386 | btc commit destination | | +| B2NODE_OP_PROPOSERS_ADDRESS | 0x837596C1Aa783E3B06C7Efb10a51Fe6699208D1D | btc commit destination | | +| B2NODE_OP_PROPOSAL_MANAGER_ADDRESS | 0x837596C1Aa783E3B06C7Efb10a51Fe6699208D1D | btc commit destination | | +| B2NODE_CREATOR_ADDRESS | 0xb634434CA448c39b05b460dEC51f458EaC1e2759 | btc commit destination | | +| B2NODE_CREATOR_PRIVATE_KEY | 0a81baab0ca0b65d406d68c79945054b092cbe77499ca55c57b3ecfd33f1d551 | btc commit destination | | +| BITCOIN_NETWORK_NAME | testnet3 | btc commit destination | | +| BITCOIN_PRIVATE_KEY | | btc commit destination | | +| COMMITTER_DESTINATION_ADDRESS | tb1q6t5py7fqml8patll2jzfc26q7987xqthslyvj4 | btc commit destination | | + +Reference environment params + +`B2NODE_CHAIN_ID=11155111;B2NODE_OP_COMMITTER_ADDRESS=0xE3DA42426AdEABC1c8d1ac28e79ef0bccbb6311e;B2NODE_OP_PROPOSAL_MANAGER_ADDRESS=0x16Bb9b79187B8d6C6Ad3ADe6dfA650070AA831c7;B2NODE_OP_PROPOSERS_ADDRESS=0x53bf2212Df41130F68Dfdf3f985105534C37e3E2;B2NODE_RPC_URL=https://quaint-white-season.ethereum-sepolia.quiknode.pro/b5c30cbb548d8743f08dd175fe50e3e923259d30;BATCHER_INBOX=0xfF000000000000000000000000000000000000FF;BATCHER_SENDER=0x4D0ca19b3c317DdB3c67FCC2C033ff0c25787BEe;BEACON_CHAIN_ID=213;BEACON_CHAIN_RPC_URL=https://hub-cl-rpc.bsquared.network;INIT_BLOB_BLOCK_HASH=0x35db0d9c50e33120690f50d2a50001be60c8c6b6871e03c2b8a1d39235b52d2d;INIT_BLOB_BLOCK_NUMBER=124543;INIT_BLOCK_HASH=0x0ade6a25acf1c5fa0f2b683584a2ea12a4913751b306549f5a740a39e2e38ec1;INIT_BLOCK_NUMBER=0;L2_OUTPUT_ORACLE_PROXY_CONTRACT=0x7893392346c2D73730733002718F278b4301dF83;RPC_URL=https://hub-rpc.bsquared.network` ### Run diff --git a/img_1.png b/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..97fba4b5428d72e2865ce50a7b65c9a6df1e8bdb GIT binary patch literal 75007 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 literal 0 HcmV?d00001 diff --git a/img_2.png b/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbfe063894d267f83a88cd0f0272d167c9549d9 GIT binary patch literal 102566 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 literal 0 HcmV?d00001 diff --git a/internal/types/config.go b/internal/types/config.go index 0879ee6..dd41dcd 100644 --- a/internal/types/config.go +++ b/internal/types/config.go @@ -27,8 +27,6 @@ type Config struct { L2OutputOracleProxyContract string `env:"L2_OUTPUT_ORACLE_PROXY_CONTRACT" envDefault:"0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"` BatcherInbox string `env:"BATCHER_INBOX" envDefault:"0xff00000000000000000000000000000011155420"` BatcherSender string `env:"BATCHER_SENDER" envDefault:"0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c"` - LimitNum int `evn:"PROPOSAL_BATCHES_LIMITNUM" envDefault:"10"` - InitProposalID uint64 `evn:"INIT_PROPOSAL_ID" envDefault:"1"` DSType string `env:"DSTYPE" envDefault:"arweave"` ArweaveWallet string `env:"B2NODE_ARWEAVE_WALLET" envDefault:"/tmp/wallet/account.json"` ArweaveRPC string `env:"B2NODE_ARWEAVE_RPC" envDefault:"https://arweave.net"` From 36088cc6247f7d229fcb864a74bd9ac88c8200e6 Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Thu, 23 May 2024 13:45:00 +0800 Subject: [PATCH 28/29] format --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ca2c30f..ff42b9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # b2-committer # Introduce + Submit op txs to decentralized store(e.g arweave) ![img_1.png](img_1.png) @@ -9,7 +10,6 @@ Submit op l2 state roots to decentralized store(e.g arweave) ## environment Variables - | env | value | description | remarks | | ---------------------------------- | ------------------------------------------------------------ | ---------------------------------------- | ------------------------- | | LOG_LEVEL | info | | warn、error、panic、fatal | From 2c70172190ff3b6ead5811fcea0a41212626e18a Mon Sep 17 00:00:00 2001 From: zhouop0 <11733741+zhouop0@users.noreply.github.com> Date: Thu, 23 May 2024 13:49:07 +0800 Subject: [PATCH 29/29] format --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff42b9d..634eea5 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ Submit op txs to decentralized store(e.g arweave) Submit op l2 state roots to decentralized store(e.g arweave) ![img_2.png](img_2.png) - ## environment Variables + | env | value | description | remarks | | ---------------------------------- | ------------------------------------------------------------ | ---------------------------------------- | ------------------------- | | LOG_LEVEL | info | | warn、error、panic、fatal |