From ce76e66f8751629d5267ccf9f8e3317a24e881d3 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 20 Sep 2024 10:08:02 +0800 Subject: [PATCH 01/38] refactor(protocol): remove unused code post Ontake fork (#18072) Co-authored-by: dantaik Co-authored-by: gavin Co-authored-by: David Co-authored-by: Bernat Canal Garceran Co-authored-by: taiko-bot <160625009+taiko-kitty@users.noreply.github.com> Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> Co-authored-by: maskpp Co-authored-by: smtmfft <99081233+smtmfft@users.noreply.github.com> Co-authored-by: Ivan Lagunovsky Co-authored-by: jeff <113397187+cyberhorsey@users.noreply.github.com> Co-authored-by: Karim Co-authored-by: Karim <162329697+kimo-ice@users.noreply.github.com> --- packages/protocol/.gitignore | 3 + .../contracts/layer1/based/ITaikoL1.sol | 35 +- .../contracts/layer1/based/LibBonds.sol | 83 +- .../contracts/layer1/based/LibData.sol | 77 +- .../contracts/layer1/based/LibProposing.sol | 133 +- .../contracts/layer1/based/LibProving.sol | 195 +- .../contracts/layer1/based/LibUtils.sol | 67 +- .../contracts/layer1/based/LibVerifying.sol | 41 +- .../contracts/layer1/based/TaikoData.sol | 48 +- .../contracts/layer1/based/TaikoEvents.sol | 8 +- .../contracts/layer1/based/TaikoL1.sol | 28 +- .../layer1/provers/GuardianProver.sol | 63 +- .../contracts/layer1/provers/ProverSet.sol | 12 - .../contracts/layer1/tiers/ITierProvider.sol | 1 - .../layer1/tiers/TierProviderBase.sol | 3 +- .../contracts/layer2/based/LibL2Config.sol | 1 + .../contracts/layer2/based/TaikoL2.sol | 21 +- .../contracts/layer2/devnet/DevnetTaikoL2.sol | 2 +- .../protocol/test/genesis/data/genesis.json | 242 - .../test/genesis/data/genesis_alloc.json | 217 - .../genesis/data/genesis_storage_layout.json | 4667 ----------------- .../protocol/test/layer1/based/TaikoL1.t.sol | 27 +- .../based/TaikoL1LibProvingWithTiers.t.sol | 43 +- .../test/layer1/based/TaikoL1TestBase.sol | 23 +- .../test/layer1/based/TaikoL1TestGroup1.t.sol | 77 +- .../layer1/based/TaikoL1TestGroup10.t.sol | 2 +- .../test/layer1/based/TaikoL1TestGroup2.t.sol | 20 +- .../test/layer1/based/TaikoL1TestGroup3.t.sol | 20 +- .../test/layer1/based/TaikoL1TestGroup4.t.sol | 15 +- .../test/layer1/based/TaikoL1TestGroup5.t.sol | 32 +- .../test/layer1/based/TaikoL1TestGroup6.t.sol | 8 +- .../test/layer1/based/TaikoL1TestGroup7.t.sol | 4 +- .../test/layer1/based/TaikoL1TestGroup8.t.sol | 6 +- .../test/layer1/based/TaikoL1TestGroup9.t.sol | 34 +- .../layer1/based/TaikoL1TestGroupBase.sol | 34 +- .../layer1/based/TaikoL1testGroupA1.t.sol | 101 - .../layer1/based/TaikoL1testGroupA2.t.sol | 182 - .../test/layer1/based/TestTierProvider.sol | 15 +- packages/protocol/test/layer2/TaikoL2.t.sol | 59 +- .../layer2/TaikoL2EIP1559Configurable.sol | 50 - .../test/layer2/TaikoL2NoFeeCheck.t.sol | 201 - packages/protocol/test/layer2/TaikoL2Test.sol | 2 +- 42 files changed, 496 insertions(+), 6406 deletions(-) delete mode 100644 packages/protocol/test/genesis/data/genesis.json delete mode 100644 packages/protocol/test/genesis/data/genesis_alloc.json delete mode 100644 packages/protocol/test/genesis/data/genesis_storage_layout.json delete mode 100644 packages/protocol/test/layer1/based/TaikoL1testGroupA1.t.sol delete mode 100644 packages/protocol/test/layer1/based/TaikoL1testGroupA2.t.sol delete mode 100644 packages/protocol/test/layer2/TaikoL2EIP1559Configurable.sol delete mode 100644 packages/protocol/test/layer2/TaikoL2NoFeeCheck.t.sol diff --git a/packages/protocol/.gitignore b/packages/protocol/.gitignore index 610554964aa..d413d569ab2 100644 --- a/packages/protocol/.gitignore +++ b/packages/protocol/.gitignore @@ -34,6 +34,9 @@ broadcast lcov.info simulation/out/ +test/genesis/data/genesis.json +test/genesis/data/genesis_alloc.json +test/genesis/data/genesis_storage_layout.json # Serverless directories .serverless diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol index 1c97592fb46..5f9d8b70c74 100644 --- a/packages/protocol/contracts/layer1/based/ITaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -6,19 +6,6 @@ import "./TaikoData.sol"; /// @title ITaikoL1 /// @custom:security-contact security@taiko.xyz interface ITaikoL1 { - /// @notice Proposes a Taiko L2 block. - /// @param _params Block parameters, currently an encoded BlockParams object. - /// @param _txList txList data if calldata is used for DA. - /// @return meta_ The metadata of the proposed L2 block. - /// @return deposits_ The Ether deposits processed. - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_); - /// @notice Proposes a Taiko L2 block (version 2) /// @param _params Block parameters, an encoded BlockParamsV2 object. /// @param _txList txList data if calldata is used for DA. @@ -42,9 +29,9 @@ interface ITaikoL1 { returns (TaikoData.BlockMetadataV2[] memory metaArr_); /// @notice Proves or contests a block transition. - /// @param _blockId The index of the block to prove. This is also used to + /// @param _blockId Index of the block to prove. This is also used to /// select the right implementation version. - /// @param _input An abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// @param _input ABI-encoded (TaikoData.BlockMetadata, TaikoData.Transition, /// TaikoData.TierProof) tuple. function proveBlock(uint64 _blockId, bytes calldata _input) external; @@ -61,24 +48,24 @@ interface ITaikoL1 { ) external; - /// @notice Verifies up to a certain number of blocks. - /// @param _maxBlocksToVerify Max number of blocks to verify. + /// @notice Verifies up to a specified number of blocks. + /// @param _maxBlocksToVerify Maximum number of blocks to verify. function verifyBlocks(uint64 _maxBlocksToVerify) external; - /// @notice Pause block proving. - /// @param _pause True if paused. + /// @notice Pauses or unpauses block proving. + /// @param _pause True to pause, false to unpause. function pauseProving(bool _pause) external; - /// @notice Deposits Taiko token to be used as bonds. - /// @param _amount The amount of Taiko token to deposit. + /// @notice Deposits Taiko tokens to be used as bonds. + /// @param _amount Amount of Taiko tokens to deposit. function depositBond(uint256 _amount) external; - /// @notice Withdraws Taiko token. - /// @param _amount The amount of Taiko token to withdraw. + /// @notice Withdraws Taiko tokens. + /// @param _amount Amount of Taiko tokens to withdraw. function withdrawBond(uint256 _amount) external; /// @notice Gets the prover that actually proved a verified block. - /// @param _blockId The index of the block. + /// @param _blockId Index of the block. /// @return The prover's address. If the block is not verified yet, address(0) will be returned. function getVerifiedBlockProver(uint64 _blockId) external view returns (address); diff --git a/packages/protocol/contracts/layer1/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol index e80da12b8e9..c47874d62c5 100644 --- a/packages/protocol/contracts/layer1/based/LibBonds.sol +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -11,16 +11,22 @@ import "./TaikoData.sol"; /// @notice A library that offers helper functions to handle bonds. /// @custom:security-contact security@taiko.xyz library LibBonds { - /// @dev Emitted when token is credited back to a user's bond balance. - event BondCredited(address indexed user, uint256 amount); + /// @dev Emitted when a token is credited back to a user's bond balance. + /// @param user The address of the user whose bond balance is credited. + /// @param blockId The ID of the block to credit for. + /// @param amount The amount of tokens credited. + event BondCredited(address indexed user, uint256 blockId, uint256 amount); - /// @dev Emitted when token is debited from a user's bond balance. - event BondDebited(address indexed user, uint256 amount); + /// @dev Emitted when a token is debited from a user's bond balance. + /// @param user The address of the user whose bond balance is debited. + /// @param blockId The ID of the block to debit for. + /// @param amount The amount of tokens debited. + event BondDebited(address indexed user, uint256 blockId, uint256 amount); - /// @dev Deposits Taiko token to be used as bonds. - /// @param _state Current TaikoData.State. - /// @param _resolver Address resolver interface. - /// @param _amount The amount of token to deposit. + /// @dev Deposits TAIKO tokens to be used as bonds. + /// @param _state The current state of TaikoData. + /// @param _resolver The address resolver interface. + /// @param _amount The amount of tokens to deposit. function depositBond( TaikoData.State storage _state, IAddressResolver _resolver, @@ -32,10 +38,10 @@ library LibBonds { _tko(_resolver).transferFrom(msg.sender, address(this), _amount); } - /// @dev Withdraws Taiko token. - /// @param _state Current TaikoData.State. - /// @param _resolver Address resolver interface. - /// @param _amount The amount of token to withdraw. + /// @dev Withdraws TAIKO tokens. + /// @param _state The current state of TaikoData. + /// @param _resolver The address resolver interface. + /// @param _amount The amount of tokens to withdraw. function withdrawBond( TaikoData.State storage _state, IAddressResolver _resolver, @@ -47,44 +53,58 @@ library LibBonds { _tko(_resolver).transfer(msg.sender, _amount); } - /// @dev Debits Taiko tokens as bonds. - /// @param _state Current TaikoData.State. - /// @param _resolver Address resolver interface. - /// @param _user The user address to debit. - /// @param _amount The amount of token to debit. + /// @dev Debits TAIKO tokens as bonds. + /// @param _state The current state of TaikoData. + /// @param _resolver The address resolver interface. + /// @param _user The address of the user to debit. + /// @param _blockId The ID of the block to debit for. + /// @param _amount The amount of tokens to debit. function debitBond( TaikoData.State storage _state, IAddressResolver _resolver, address _user, + uint256 _blockId, uint256 _amount ) internal { - uint256 balance = _state.bondBalance[_user]; + if (_amount == 0) return; + uint256 balance = _state.bondBalance[_user]; if (balance >= _amount) { unchecked { _state.bondBalance[_user] = balance - _amount; } - emit BondDebited(_user, _amount); } else { _tko(_resolver).transferFrom(_user, address(this), _amount); } + emit BondDebited(_user, _blockId, _amount); } - /// @dev Credits Taiko tokens to user's bond balance. - /// @param _state Current TaikoData.State. - /// @param _user The user address to credit. - /// @param _amount The amount of token to credit. - function creditBond(TaikoData.State storage _state, address _user, uint256 _amount) internal { - _state.bondBalance[_user] += _amount; - emit BondCredited(_user, _amount); + /// @dev Credits TAIKO tokens to a user's bond balance. + /// @param _state The current state of TaikoData. + /// @param _user The address of the user to credit. + /// @param _blockId The ID of the block to credit for. + /// @param _amount The amount of tokens to credit. + function creditBond( + TaikoData.State storage _state, + address _user, + uint256 _blockId, + uint256 _amount + ) + internal + { + if (_amount == 0) return; + unchecked { + _state.bondBalance[_user] += _amount; + } + emit BondCredited(_user, _blockId, _amount); } - /// @dev Gets a user's current Taiko token bond balance. - /// @param _state Current TaikoData.State. - /// @param _user The user address to credit. - /// @return The current token balance. + /// @dev Gets a user's current TAIKO token bond balance. + /// @param _state The current state of TaikoData. + /// @param _user The address of the user. + /// @return The current token balance. function bondBalanceOf( TaikoData.State storage _state, address _user @@ -96,6 +116,9 @@ library LibBonds { return _state.bondBalance[_user]; } + /// @dev Resolves the TAIKO token address using the address resolver. + /// @param _resolver The address resolver interface. + /// @return tko_ The IERC20 interface of the TAIKO token. function _tko(IAddressResolver _resolver) private view returns (IERC20) { return IERC20(_resolver.resolve(LibStrings.B_TAIKO_TOKEN, false)); } diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol index 242c1417904..3a7d80be281 100644 --- a/packages/protocol/contracts/layer1/based/LibData.sol +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -8,79 +8,6 @@ import "./TaikoData.sol"; /// @notice A library that offers helper functions. /// @custom:security-contact security@taiko.xyz library LibData { - // = keccak256(abi.encode(new TaikoData.EthDeposit[](0))) - bytes32 internal constant EMPTY_ETH_DEPOSIT_HASH = - 0x569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd; - - function blockParamsV1ToV2(TaikoData.BlockParams memory _v1) - internal - pure - returns (TaikoData.BlockParamsV2 memory) - { - return TaikoData.BlockParamsV2({ - proposer: address(0), - coinbase: _v1.coinbase, - parentMetaHash: _v1.parentMetaHash, - anchorBlockId: 0, - timestamp: 0, - blobTxListOffset: 0, - blobTxListLength: 0, - blobIndex: 0 - }); - } - - function blockMetadataV2toV1(TaikoData.BlockMetadataV2 memory _v2) - internal - pure - returns (TaikoData.BlockMetadata memory) - { - return TaikoData.BlockMetadata({ - l1Hash: _v2.anchorBlockHash, - difficulty: _v2.difficulty, - blobHash: _v2.blobHash, - extraData: _v2.extraData, - depositsHash: EMPTY_ETH_DEPOSIT_HASH, - coinbase: _v2.coinbase, - id: _v2.id, - gasLimit: _v2.gasLimit, - timestamp: _v2.timestamp, - l1Height: _v2.anchorBlockId, - minTier: _v2.minTier, - blobUsed: _v2.blobUsed, - parentMetaHash: _v2.parentMetaHash, - sender: _v2.proposer - }); - } - - function blockMetadataV1toV2(TaikoData.BlockMetadata memory _v1) - internal - pure - returns (TaikoData.BlockMetadataV2 memory) - { - return TaikoData.BlockMetadataV2({ - anchorBlockHash: _v1.l1Hash, - difficulty: _v1.difficulty, - blobHash: _v1.blobHash, - extraData: _v1.extraData, - coinbase: _v1.coinbase, - id: _v1.id, - gasLimit: _v1.gasLimit, - timestamp: _v1.timestamp, - anchorBlockId: _v1.l1Height, - minTier: _v1.minTier, - blobUsed: _v1.blobUsed, - parentMetaHash: _v1.parentMetaHash, - proposer: _v1.sender, - livenessBond: 0, - proposedAt: 0, - proposedIn: 0, - blobTxListOffset: 0, - blobTxListLength: 0, - blobIndex: 0, - baseFeeConfig: LibSharedData.BaseFeeConfig(0, 0, 0, 0, 0) - }); - } - function blockV2toV1(TaikoData.BlockV2 memory _v2) internal pure @@ -88,8 +15,8 @@ library LibData { { return TaikoData.Block({ metaHash: _v2.metaHash, - assignedProver: _v2.assignedProver, - livenessBond: _v2.livenessBond, + assignedProver: address(0), // assigned prover is now meta.proposer. + livenessBond: 0, // liveness bond is now meta.livenessBond blockId: _v2.blockId, proposedAt: _v2.proposedAt, proposedIn: _v2.proposedIn, diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index dab7077aba4..2a9c5cc95b4 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -19,26 +19,9 @@ library LibProposing { TaikoData.BlockParamsV2 params; ITierProvider tierProvider; bytes32 parentMetaHash; - bool postFork; bool allowCustomProposer; - bytes32 extraData; } - /// @notice Emitted when a block is proposed. - /// @param blockId The ID of the proposed block. - /// @param assignedProver The address of the assigned prover. - /// @param livenessBond The liveness bond of the proposed block. - /// @param meta The metadata of the proposed block. - /// @param depositsProcessed The EthDeposit array about processed deposits in this proposed - /// block. - event BlockProposed( - uint256 indexed blockId, - address indexed assignedProver, - uint96 livenessBond, - TaikoData.BlockMetadata meta, - TaikoData.EthDeposit[] depositsProcessed - ); - /// @notice Emitted when a block is proposed. /// @param blockId The ID of the proposed block. /// @param meta The metadata of the proposed block. @@ -56,7 +39,6 @@ library LibProposing { error L1_INVALID_PARAMS(); error L1_INVALID_PROPOSER(); error L1_INVALID_TIMESTAMP(); - error L1_LIVENESS_BOND_NOT_RECEIVED(); error L1_TOO_MANY_BLOCKS(); error L1_UNEXPECTED_PARENT(); @@ -66,7 +48,6 @@ library LibProposing { /// @param _resolver The address resolver interface. /// @param _paramsArr An array of encoded data bytes containing the block parameters. /// @param _txListArr An array of transaction list bytes (if not blob). - /// @return metaV1s_ An array of metadata objects for the proposed L2 blocks (version 1). /// @return metas_ An array of metadata objects for the proposed L2 blocks (version 2). function proposeBlocks( TaikoData.State storage _state, @@ -76,21 +57,16 @@ library LibProposing { bytes[] calldata _txListArr ) public - returns ( - TaikoData.BlockMetadata[] memory metaV1s_, - TaikoData.BlockMetadataV2[] memory metas_ - ) + returns (TaikoData.BlockMetadataV2[] memory metas_) { if (_paramsArr.length == 0 || _paramsArr.length != _txListArr.length) { revert L1_INVALID_PARAMS(); } - metaV1s_ = new TaikoData.BlockMetadata[](_paramsArr.length); metas_ = new TaikoData.BlockMetadataV2[](_paramsArr.length); for (uint256 i; i < _paramsArr.length; ++i) { - (metaV1s_[i], metas_[i]) = - _proposeBlock(_state, _config, _resolver, _paramsArr[i], _txListArr[i]); + metas_[i] = _proposeBlock(_state, _config, _resolver, _paramsArr[i], _txListArr[i]); } if (!_state.slotB.provingPaused) { @@ -108,7 +84,6 @@ library LibProposing { /// @param _resolver The address resolver interface. /// @param _params Encoded data bytes containing the block parameters. /// @param _txList Transaction list bytes (if not blob). - /// @return metaV1_ The metadata of the proposed block (version 1). /// @return meta_ The metadata of the proposed block (version 2). function proposeBlock( TaikoData.State storage _state, @@ -118,9 +93,9 @@ library LibProposing { bytes calldata _txList ) public - returns (TaikoData.BlockMetadata memory metaV1_, TaikoData.BlockMetadataV2 memory meta_) + returns (TaikoData.BlockMetadataV2 memory meta_) { - (metaV1_, meta_) = _proposeBlock(_state, _config, _resolver, _params, _txList); + meta_ = _proposeBlock(_state, _config, _resolver, _params, _txList); if (!_state.slotB.provingPaused) { if (LibUtils.shouldVerifyBlocks(_config, meta_.id, false)) { @@ -137,12 +112,11 @@ library LibProposing { bytes calldata _txList ) private - returns (TaikoData.BlockMetadata memory metaV1_, TaikoData.BlockMetadataV2 memory meta_) + returns (TaikoData.BlockMetadataV2 memory meta_) { // Checks proposer access. Local memory local; local.b = _state.slotB; - local.postFork = local.b.numBlocks >= _config.ontakeForkHeight; // It's essential to ensure that the ring buffer for proposed blocks // still has space for at least one more block. @@ -156,14 +130,8 @@ library LibProposing { local.allowCustomProposer = true; } - if (local.postFork) { - if (_params.length != 0) { - local.params = abi.decode(_params, (TaikoData.BlockParamsV2)); - } - } else { - TaikoData.BlockParams memory paramsV1 = abi.decode(_params, (TaikoData.BlockParams)); - local.params = LibData.blockParamsV1ToV2(paramsV1); - local.extraData = paramsV1.extraData; + if (_params.length != 0) { + local.params = abi.decode(_params, (TaikoData.BlockParamsV2)); } if (local.params.proposer == address(0)) { @@ -178,11 +146,11 @@ library LibProposing { local.params.coinbase = local.params.proposer; } - if (!local.postFork || local.params.anchorBlockId == 0) { + if (local.params.anchorBlockId == 0) { local.params.anchorBlockId = uint64(block.number - 1); } - if (!local.postFork || local.params.timestamp == 0) { + if (local.params.timestamp == 0) { local.params.timestamp = uint64(block.timestamp); } @@ -190,30 +158,28 @@ library LibProposing { TaikoData.BlockV2 storage parentBlk = _state.blocks[(local.b.numBlocks - 1) % _config.blockRingBufferSize]; - if (local.postFork) { - // Verify the passed in L1 state block number. - // We only allow the L1 block to be 2 epochs old. - // The other constraint is that the L1 block number needs to be larger than or equal - // the one in the previous L2 block. - if ( - local.params.anchorBlockId + _config.maxAnchorHeightOffset < block.number // - || local.params.anchorBlockId >= block.number - || local.params.anchorBlockId < parentBlk.proposedIn - ) { - revert L1_INVALID_ANCHOR_BLOCK(); - } + // Verify the passed in L1 state block number. + // We only allow the L1 block to be 2 epochs old. + // The other constraint is that the L1 block number needs to be larger than or equal + // the one in the previous L2 block. + if ( + local.params.anchorBlockId + _config.maxAnchorHeightOffset < block.number // + || local.params.anchorBlockId >= block.number + || local.params.anchorBlockId < parentBlk.proposedIn + ) { + revert L1_INVALID_ANCHOR_BLOCK(); + } - // Verify the passed in timestamp. - // We only allow the timestamp to be 2 epochs old. - // The other constraint is that the timestamp needs to be larger than or equal the - // one in the previous L2 block. - if ( - local.params.timestamp + _config.maxAnchorHeightOffset * 12 < block.timestamp - || local.params.timestamp > block.timestamp - || local.params.timestamp < parentBlk.proposedAt - ) { - revert L1_INVALID_TIMESTAMP(); - } + // Verify the passed in timestamp. + // We only allow the timestamp to be 2 epochs old. + // The other constraint is that the timestamp needs to be larger than or equal the + // one in the previous L2 block. + if ( + local.params.timestamp + _config.maxAnchorHeightOffset * 12 < block.timestamp + || local.params.timestamp > block.timestamp + || local.params.timestamp < parentBlk.proposedAt + ) { + revert L1_INVALID_TIMESTAMP(); } // Check if parent block has the right meta hash. This is to allow the proposer to make @@ -236,9 +202,7 @@ library LibProposing { // To make sure each L2 block can be exexucated deterministiclly by the client // without referering to its metadata on Ethereum, we need to encode // config.sharingPctg into the extraData. - extraData: local.postFork - ? _encodeBaseFeeConfig(_config.baseFeeConfig) - : local.extraData, + extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), coinbase: local.params.coinbase, id: local.b.numBlocks, gasLimit: _config.blockMaxGasLimit, @@ -282,20 +246,15 @@ library LibProposing { // Use the difficulty as a random number meta_.minTier = local.tierProvider.getMinTier(meta_.proposer, uint256(meta_.difficulty)); - if (!local.postFork) { - metaV1_ = LibData.blockMetadataV2toV1(meta_); - } - // Create the block that will be stored onchain TaikoData.BlockV2 memory blk = TaikoData.BlockV2({ - metaHash: local.postFork ? keccak256(abi.encode(meta_)) : keccak256(abi.encode(metaV1_)), + metaHash: keccak256(abi.encode(meta_)), assignedProver: address(0), - livenessBond: local.postFork ? 0 : meta_.livenessBond, + livenessBond: 0, blockId: local.b.numBlocks, - proposedAt: local.postFork ? local.params.timestamp : uint64(block.timestamp), - proposedIn: local.postFork ? local.params.anchorBlockId : uint64(block.number), - // For a new block, the next transition ID is always 1, not 0. - nextTransitionId: 1, + proposedAt: local.params.timestamp, // name kept but used differently + proposedIn: local.params.anchorBlockId, // name kept but used differently + nextTransitionId: 1, // For a new block, the next transition ID is always 1, not 0. livenessBondReturned: false, // For unverified block, its verifiedTransitionId is always 0. verifiedTransitionId: 0 @@ -309,25 +268,9 @@ library LibProposing { ++_state.slotB.numBlocks; } - LibBonds.debitBond(_state, _resolver, local.params.proposer, _config.livenessBond); - - // Bribe the block builder. Unlike 1559-tips, this tip is only made - // if this transaction succeeds. - if (msg.value != 0 && block.coinbase != address(0)) { - address(block.coinbase).sendEtherAndVerify(msg.value); - } + LibBonds.debitBond(_state, _resolver, local.params.proposer, meta_.id, _config.livenessBond); - if (local.postFork) { - emit BlockProposedV2(meta_.id, meta_); - } else { - emit BlockProposed({ - blockId: metaV1_.id, - assignedProver: local.params.proposer, - livenessBond: _config.livenessBond, - meta: metaV1_, - depositsProcessed: new TaikoData.EthDeposit[](0) - }); - } + emit BlockProposedV2(meta_.id, meta_); } function _encodeBaseFeeConfig(LibSharedData.BaseFeeConfig memory _baseFeeConfig) diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index 0c96335ec8d..da2bb7a5bdc 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -8,8 +8,7 @@ import "./LibUtils.sol"; import "./LibVerifying.sol"; /// @title LibProving -/// @notice A library for handling block contestation and proving in the Taiko -/// protocol. +/// @notice A library that offers helper functions for the Taiko protocol. /// @custom:security-contact security@taiko.xyz library LibProving { using LibMath for uint256; @@ -22,9 +21,7 @@ library LibProving { TaikoData.BlockMetadataV2 meta; TaikoData.TierProof proof; bytes32 metaHash; - address assignedProver; bytes32 stateRoot; - uint96 livenessBond; uint64 slot; uint64 blockId; uint24 tid; @@ -32,24 +29,8 @@ library LibProving { bool isTopTier; bool inProvingWindow; bool sameTransition; - bool postFork; - uint64 proposedAt; } - /// @notice Emitted when a transition is proved. - /// @param blockId The block ID. - /// @param tran The transition data. - /// @param prover The prover's address. - /// @param validityBond The validity bond amount. - /// @param tier The tier of the proof. - event TransitionProved( - uint256 indexed blockId, - TaikoData.Transition tran, - address prover, - uint96 validityBond, - uint16 tier - ); - /// @notice Emitted when a transition is proved. /// @param blockId The block ID. /// @param tran The transition data. @@ -66,20 +47,6 @@ library LibProving { uint64 proposedIn ); - /// @notice Emitted when a transition is contested. - /// @param blockId The block ID. - /// @param tran The transition data. - /// @param contester The contester's address. - /// @param contestBond The contest bond amount. - /// @param tier The tier of the proof. - event TransitionContested( - uint256 indexed blockId, - TaikoData.Transition tran, - address contester, - uint96 contestBond, - uint16 tier - ); - /// @notice Emitted when a transition is contested. /// @param blockId The block ID. /// @param tran The transition data. @@ -220,26 +187,17 @@ library LibProving { Local memory local; local.b = _state.slotB; local.blockId = _blockId; - local.postFork = _blockId >= _config.ontakeForkHeight; - if (local.postFork) { - if (_batchProof.tier == 0) { - // No batch proof is available, each transition is proving using a separate proof. - (local.meta, ctx_.tran, local.proof) = abi.decode( - _input, (TaikoData.BlockMetadataV2, TaikoData.Transition, TaikoData.TierProof) - ); - } else { - // All transitions are proving using the batch proof. - (local.meta, ctx_.tran) = - abi.decode(_input, (TaikoData.BlockMetadataV2, TaikoData.Transition)); - local.proof = _batchProof; - } - } else { - TaikoData.BlockMetadata memory metaV1; - (metaV1, ctx_.tran, local.proof) = abi.decode( - _input, (TaikoData.BlockMetadata, TaikoData.Transition, TaikoData.TierProof) + if (_batchProof.tier == 0) { + // No batch proof is available, each transition is proving using a separate proof. + (local.meta, ctx_.tran, local.proof) = abi.decode( + _input, (TaikoData.BlockMetadataV2, TaikoData.Transition, TaikoData.TierProof) ); - local.meta = LibData.blockMetadataV1toV2(metaV1); + } else { + // All transitions are proving using the batch proof. + (local.meta, ctx_.tran) = + abi.decode(_input, (TaikoData.BlockMetadataV2, TaikoData.Transition)); + local.proof = _batchProof; } if (_blockId != local.meta.id) revert LibUtils.L1_INVALID_BLOCK_ID(); @@ -259,31 +217,17 @@ library LibProving { local.slot = local.meta.id % _config.blockRingBufferSize; TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; - local.proposedAt = local.postFork ? local.meta.proposedAt : blk.proposedAt; - if (LibUtils.shouldSyncStateRoot(_config.stateRootSyncInternal, local.blockId)) { local.stateRoot = ctx_.tran.stateRoot; } - local.assignedProver = blk.assignedProver; - if (local.assignedProver == address(0)) { - local.assignedProver = local.meta.proposer; - } - - if (!blk.livenessBondReturned) { - local.livenessBond = - local.meta.livenessBond == 0 ? blk.livenessBond : local.meta.livenessBond; - } local.metaHash = blk.metaHash; // Check the integrity of the block data. It's worth noting that in // theory, this check may be skipped, but it's included for added // caution. { - bytes32 metaHash = local.postFork - ? keccak256(abi.encode(local.meta)) - : keccak256(abi.encode(LibData.blockMetadataV2toV1(local.meta))); - + bytes32 metaHash = keccak256(abi.encode(local.meta)); if (local.metaHash != metaHash) revert L1_BLOCK_MISMATCH(); } @@ -326,7 +270,7 @@ library LibProving { local.tier.contestBond != 0 && ts.contester == address(0) && local.tid == 1 && ts.tier == 0 && local.inProvingWindow ) { - if (msg.sender != local.assignedProver) revert L1_NOT_ASSIGNED_PROVER(); + if (msg.sender != local.meta.proposer) revert L1_NOT_ASSIGNED_PROVER(); } // We must verify the proof, and any failure in proof verification will // result in a revert. @@ -376,24 +320,14 @@ library LibProving { // (L1_ALREADY_PROVED). _overrideWithHigherProof(_state, _resolver, blk, ts, ctx_.tran, local.proof, local); - if (local.postFork) { - emit TransitionProvedV2({ - blockId: local.blockId, - tran: ctx_.tran, - prover: msg.sender, - validityBond: local.tier.validityBond, - tier: local.proof.tier, - proposedIn: local.meta.proposedIn - }); - } else { - emit TransitionProved({ - blockId: local.blockId, - tran: ctx_.tran, - prover: msg.sender, - validityBond: local.tier.validityBond, - tier: local.proof.tier - }); - } + emit TransitionProvedV2({ + blockId: local.blockId, + tran: ctx_.tran, + prover: msg.sender, + validityBond: local.tier.validityBond, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); } else { // New transition and old transition on the same tier - and if this transaction tries to // prove the same, it reverts @@ -408,24 +342,14 @@ library LibProving { ts.blockHash = ctx_.tran.blockHash; ts.stateRoot = local.stateRoot; - if (local.postFork) { - emit TransitionProvedV2({ - blockId: local.blockId, - tran: ctx_.tran, - prover: msg.sender, - validityBond: 0, - tier: local.proof.tier, - proposedIn: local.meta.proposedIn - }); - } else { - emit TransitionProved({ - blockId: local.blockId, - tran: ctx_.tran, - prover: msg.sender, - validityBond: 0, - tier: local.proof.tier - }); - } + emit TransitionProvedV2({ + blockId: local.blockId, + tran: ctx_.tran, + prover: msg.sender, + validityBond: 0, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); } else { // Contesting but not on the highest tier if (ts.contester != address(0)) revert L1_ALREADY_CONTESTED(); @@ -442,7 +366,9 @@ library LibProving { // _checkIfContestable(/*_state,*/ tier.cooldownWindow, ts.timestamp); // Burn the contest bond from the prover. - LibBonds.debitBond(_state, _resolver, msg.sender, local.tier.contestBond); + LibBonds.debitBond( + _state, _resolver, msg.sender, local.blockId, local.tier.contestBond + ); // We retain the contest bond within the transition, just in // case this configuration is altered to a different value @@ -453,24 +379,14 @@ library LibProving { ts.contestBond = local.tier.contestBond; ts.contester = msg.sender; - if (local.postFork) { - emit TransitionContestedV2({ - blockId: local.blockId, - tran: ctx_.tran, - contester: msg.sender, - contestBond: local.tier.contestBond, - tier: local.proof.tier, - proposedIn: local.meta.proposedIn - }); - } else { - emit TransitionContested({ - blockId: local.blockId, - tran: ctx_.tran, - contester: msg.sender, - contestBond: local.tier.contestBond, - tier: local.proof.tier - }); - } + emit TransitionContestedV2({ + blockId: local.blockId, + tran: ctx_.tran, + contester: msg.sender, + contestBond: local.tier.contestBond, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); } } @@ -515,7 +431,7 @@ library LibProving { // Keep in mind that state.transitions are also reusable storage // slots, so it's necessary to reinitialize all transition fields // below. - ts_.timestamp = _local.proposedAt; + ts_.timestamp = _local.meta.proposedAt; if (tid_ == 1) { // This approach serves as a cost-saving technique for the @@ -535,7 +451,7 @@ library LibProving { // // While alternative implementations are possible, introducing // such changes would require additional if-else logic. - ts_.prover = _local.assignedProver; + ts_.prover = _local.meta.proposer; } else { // Furthermore, we index the transition for future retrieval. // It's worth emphasizing that this mapping for indexing is not @@ -583,13 +499,15 @@ library LibProving { reward = _rewardAfterFriction(_ts.contestBond); // We return the validity bond back, but the original prover doesn't get any reward. - LibBonds.creditBond(_state, _ts.prover, _ts.validityBond); + LibBonds.creditBond(_state, _ts.prover, _local.blockId, _ts.validityBond); } else { // The contested transition is proven to be invalid, contester wins the game. // Contester gets 3/4 of reward, the new prover gets 1/4. reward = _rewardAfterFriction(_ts.validityBond) >> 2; unchecked { - LibBonds.creditBond(_state, _ts.contester, _ts.contestBond + reward * 3); + LibBonds.creditBond( + _state, _ts.contester, _local.blockId, _ts.contestBond + reward * 3 + ); } } } else { @@ -600,24 +518,23 @@ library LibProving { // - 2) the transition is contested. reward = _rewardAfterFriction(_ts.validityBond); - if (_local.livenessBond != 0) { - // After the first proof, the block's liveness bond will always be reset to 0. - // This means liveness bond will be handled only once for any given block. - _blk.livenessBond = 0; + if (!_blk.livenessBondReturned) { _blk.livenessBondReturned = true; if (_returnLivenessBond(_local, _proof.data)) { - if (_local.assignedProver == msg.sender) { + if (_local.meta.proposer == msg.sender) { unchecked { - reward += _local.livenessBond; + reward += _local.meta.livenessBond; } } else { - LibBonds.creditBond(_state, _local.assignedProver, _local.livenessBond); + LibBonds.creditBond( + _state, _local.meta.proposer, _local.blockId, _local.meta.livenessBond + ); } } else { // Reward a majority of liveness bond to the actual prover unchecked { - reward += _rewardAfterFriction(_local.livenessBond); + reward += _rewardAfterFriction(_local.meta.livenessBond); } } } @@ -625,9 +542,13 @@ library LibProving { unchecked { if (reward > _local.tier.validityBond) { - LibBonds.creditBond(_state, msg.sender, reward - _local.tier.validityBond); + LibBonds.creditBond( + _state, msg.sender, _local.blockId, reward - _local.tier.validityBond + ); } else if (reward < _local.tier.validityBond) { - LibBonds.debitBond(_state, _resolver, msg.sender, _local.tier.validityBond - reward); + LibBonds.debitBond( + _state, _resolver, msg.sender, _local.blockId, _local.tier.validityBond - reward + ); } } diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index d302a7b31d6..35eb8ddfb64 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -16,21 +16,6 @@ import "./TaikoData.sol"; library LibUtils { using LibMath for uint256; - /// @dev Emitted when a block is verified. - /// @param blockId The ID of the verified block. - /// @param prover The prover whose transition is used for verifying the - /// block. - /// @param blockHash The hash of the verified block. - /// @param stateRoot Deprecated and is always zero. - /// @param tier The tier ID of the proof. - event BlockVerified( - uint256 indexed blockId, - address indexed prover, - bytes32 blockHash, - bytes32 stateRoot, - uint16 tier - ); - /// @dev Emitted when a block is verified. /// @param blockId The ID of the verified block. /// @param prover The prover whose transition is used for verifying the @@ -50,13 +35,7 @@ library LibUtils { /// @notice Initializes the Taiko protocol state. /// @param _state The state to initialize. /// @param _genesisBlockHash The block hash of the genesis block. - function init( - TaikoData.State storage _state, - TaikoData.Config memory _config, - bytes32 _genesisBlockHash - ) - internal - { + function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) internal { if (_genesisBlockHash == 0) revert L1_INVALID_GENESIS_HASH(); // Init state _state.slotA.genesisHeight = uint64(block.number); @@ -76,22 +55,12 @@ library LibUtils { ts.prover = address(0); ts.timestamp = uint64(block.timestamp); - if (_config.ontakeForkHeight == 0) { - emit BlockVerifiedV2({ - blockId: 0, - prover: address(0), - blockHash: _genesisBlockHash, - tier: 0 - }); - } else { - emit BlockVerified({ - blockId: 0, - prover: address(0), - blockHash: _genesisBlockHash, - stateRoot: 0, - tier: 0 - }); - } + emit BlockVerifiedV2({ + blockId: 0, + prover: address(0), + blockHash: _genesisBlockHash, + tier: 0 + }); } /// @dev Retrieves a block based on its ID. @@ -189,8 +158,13 @@ library LibUtils { return _state.transitions[slot][tid]; } - /// @dev Retrieves the ID of the transition with a given parentHash. + /// @dev Retrieves the ID of the transition with a given parent hash. /// This function will return 0 if the transition is not found. + /// @param _state Current TaikoData.State. + /// @param _blk The block storage pointer. + /// @param _slot The slot value. + /// @param _parentHash The parent hash of the block. + /// @return tid_ The transition ID. function getTransitionId( TaikoData.State storage _state, TaikoData.BlockV2 storage _blk, @@ -210,6 +184,11 @@ library LibUtils { } } + /// @dev Checks if the current timestamp is past the deadline. + /// @param _tsTimestamp The timestamp to check. + /// @param _lastUnpausedAt The last unpaused timestamp. + /// @param _windowMinutes The window in minutes. + /// @return True if the current timestamp is past the deadline, false otherwise. function isPostDeadline( uint256 _tsTimestamp, uint256 _lastUnpausedAt, @@ -225,6 +204,11 @@ library LibUtils { } } + /// @dev Determines if blocks should be verified based on the configuration and block ID. + /// @param _config The TaikoData.Config. + /// @param _blockId The ID of the block. + /// @param _isBlockProposed Whether the block is proposed. + /// @return True if blocks should be verified, false otherwise. function shouldVerifyBlocks( TaikoData.Config memory _config, uint64 _blockId, @@ -254,6 +238,11 @@ library LibUtils { return _blockId % segmentSize == (_isBlockProposed ? 0 : segmentSize >> 1); } + /// @dev Determines if the state root should be synchronized based on the configuration and + /// block ID. + /// @param _stateRootSyncInternal The state root sync interval. + /// @param _blockId The ID of the block. + /// @return True if the state root should be synchronized, false otherwise. function shouldSyncStateRoot( uint256 _stateRootSyncInternal, uint256 _blockId diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 0c744c249d1..323a01991d3 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -24,16 +24,17 @@ library LibVerifying { uint64 syncBlockId; uint24 syncTransitionId; address prover; - bool postFork; ITierRouter tierRouter; } error L1_BLOCK_MISMATCH(); - error L1_INVALID_CONFIG(); error L1_TRANSITION_ID_ZERO(); - error L1_TOO_LATE(); - /// @dev Verifies up to N blocks. + /// @notice Verifies up to N blocks. + /// @param _state The current state of TaikoData. + /// @param _config The configuration of TaikoData. + /// @param _resolver The address resolver interface. + /// @param _maxBlocksToVerify The maximum number of blocks to verify. function verifyBlocks( TaikoData.State storage _state, TaikoData.Config memory _config, @@ -68,7 +69,7 @@ library LibVerifying { // Unchecked is safe: // - assignment is within ranges // - blockId and numBlocksVerified values incremented will still be OK in the - // next 584K years if we verifying one block per every second + // next 584K years if we verify one block per every second unchecked { ++local.blockId; @@ -77,7 +78,6 @@ library LibVerifying { local.blockId < local.b.numBlocks && local.numBlocksVerified < _maxBlocksToVerify ) { local.slot = local.blockId % _config.blockRingBufferSize; - local.postFork = local.blockId >= _config.ontakeForkHeight; blk = _state.blocks[local.slot]; if (blk.blockId != local.blockId) revert L1_BLOCK_MISMATCH(); @@ -119,7 +119,7 @@ library LibVerifying { local.blockHash = ts.blockHash; local.prover = ts.prover; - LibBonds.creditBond(_state, local.prover, ts.validityBond); + LibBonds.creditBond(_state, local.prover, local.blockId, ts.validityBond); // Note: We exclusively address the bonds linked to the // transition used for verification. While there may exist @@ -128,22 +128,12 @@ library LibVerifying { // either when the transitions are generated or proven. In such cases, both the // provers and contesters of those transitions forfeit their bonds. - if (local.postFork) { - emit LibUtils.BlockVerifiedV2({ - blockId: local.blockId, - prover: local.prover, - blockHash: local.blockHash, - tier: local.tier - }); - } else { - emit LibUtils.BlockVerified({ - blockId: local.blockId, - prover: local.prover, - blockHash: local.blockHash, - stateRoot: 0, // DEPRECATED and is always zero. - tier: local.tier - }); - } + emit LibUtils.BlockVerifiedV2({ + blockId: local.blockId, + prover: local.prover, + blockHash: local.blockHash, + tier: local.tier + }); if (LibUtils.shouldSyncStateRoot(_config.stateRootSyncInternal, local.blockId)) { bytes32 stateRoot = ts.stateRoot; @@ -188,6 +178,11 @@ library LibVerifying { } } + /// @notice Retrieves the prover of a verified block. + /// @param _state The current state of TaikoData. + /// @param _config The configuration of TaikoData. + /// @param _blockId The ID of the block. + /// @return The address of the prover. function getVerifiedBlockProver( TaikoData.State storage _state, TaikoData.Config memory _config, diff --git a/packages/protocol/contracts/layer1/based/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol index 895a8d841cf..10ac2d11c5d 100644 --- a/packages/protocol/contracts/layer1/based/TaikoData.sol +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -4,8 +4,7 @@ pragma solidity ^0.8.24; import "../../shared/data/LibSharedData.sol"; /// @title TaikoData -/// @notice This library defines various data structures used in the Taiko -/// protocol. +/// @notice This library defines various data structures used in the Taiko protocol. /// @custom:security-contact security@taiko.xyz library TaikoData { /// @dev Struct holding Taiko configuration parameters. See {TaikoConfig}. @@ -18,7 +17,7 @@ library TaikoData { // --------------------------------------------------------------------- // Group 2: Block level configs // --------------------------------------------------------------------- - // The maximum number of proposals allowed in a single block. + // The maximum number of verifications allowed when a block is proposed or proved. uint64 blockMaxProposals; // Size of the block ring buffer, allowing extra space for proposals. uint64 blockRingBufferSize; @@ -30,7 +29,7 @@ library TaikoData { // --------------------------------------------------------------------- // Group 3: Proof related configs // --------------------------------------------------------------------- - // The amount of Taiko token as a prover liveness bond + // The amount of Taiko token as a prover liveness bond. uint96 livenessBond; // --------------------------------------------------------------------- // Group 4: Cross-chain sync @@ -48,18 +47,21 @@ library TaikoData { uint64 ontakeForkHeight; } - /// @dev A proof and the tier of proof it belongs to + /// @dev DEPRECATED but used by node/client for syncing old blocks + /// @dev A proof and the tier of proof it belongs to. struct TierProof { uint16 tier; bytes data; } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @dev Hook and it's data (currently used only during proposeBlock) struct HookCall { address hook; bytes data; } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @dev Represents proposeBlock's _data input parameter struct BlockParams { address assignedProver; // DEPRECATED, value ignored. @@ -81,6 +83,7 @@ library TaikoData { uint8 blobIndex; // NEW } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @dev Struct containing data only required for proving a block /// Note: On L2, `block.difficulty` is the pseudo name of /// `block.prevrandao`, which returns a random number provided by the layer @@ -117,10 +120,8 @@ library TaikoData { bytes32 parentMetaHash; address proposer; uint96 livenessBond; - // Time this block is proposed at, used to check proving window and cooldown window. - uint64 proposedAt; - // L1 block number, required/used by node/client. - uint64 proposedIn; + uint64 proposedAt; // Used by node/client post block proposal. + uint64 proposedIn; // Used by node/client post block proposal. uint32 blobTxListOffset; uint32 blobTxListLength; uint8 blobIndex; @@ -150,15 +151,16 @@ library TaikoData { uint8 __reserved1; } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @dev Struct containing data required for verifying a block. /// 3 slots used. struct Block { bytes32 metaHash; // slot 1 - address assignedProver; // slot 2 + address assignedProver; uint96 livenessBond; uint64 blockId; // slot 3 - uint64 proposedAt; // timestamp - uint64 proposedIn; // L1 block number, required/used by node/client. + uint64 proposedAt; + uint64 proposedIn; uint32 nextTransitionId; // The ID of the transaction that is used to verify this block. However, if // this block is not verified as the last block in a batch, verifiedTransitionId @@ -170,25 +172,19 @@ library TaikoData { /// 3 slots used. struct BlockV2 { bytes32 metaHash; // slot 1 - address assignedProver; // slot 2 - uint96 livenessBond; + address assignedProver; // DEPRECATED!!! + uint96 livenessBond; // DEPRECATED!!! uint64 blockId; // slot 3 - // Before the fork, this field is the L1 timestamp when this block is proposed. - // After the fork, this is the timestamp of the L2 block. - // In a later fork, we an rename this field to `timestamp`. - uint64 proposedAt; - // Before the fork, this field is the L1 block number where this block is proposed. - // After the fork, this is the L1 block number input for the anchor transaction. - // In a later fork, we an rename this field to `anchorBlockId`. - uint64 proposedIn; + uint64 proposedAt; // Now represents L2 block's timestamp + uint64 proposedIn; // Now represents L2 block's anchorBlockId uint24 nextTransitionId; bool livenessBondReturned; - // The ID of the transaction that is used to verify this block. However, if - // this block is not verified as the last block in a batch, verifiedTransitionId - // will remain zero. + // The ID of the transaction that is used to verify this block. However, if this block is + // not verified as the last block in a batch, verifiedTransitionId will remain zero. uint24 verifiedTransitionId; } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @dev Struct representing an Ethereum deposit. /// 2 slot used. Currently removed from protocol, but to be backwards compatible, the struct and /// return values stayed for now. @@ -207,7 +203,7 @@ library TaikoData { uint64 genesisHeight; uint64 genesisTimestamp; uint64 lastSyncedBlockId; - uint64 lastSynecdAt; // typo! + uint64 lastSynecdAt; // known typo (lastSyncedAt) } struct SlotB { diff --git a/packages/protocol/contracts/layer1/based/TaikoEvents.sol b/packages/protocol/contracts/layer1/based/TaikoEvents.sol index 32bae8634b4..72a7ed589bf 100644 --- a/packages/protocol/contracts/layer1/based/TaikoEvents.sol +++ b/packages/protocol/contracts/layer1/based/TaikoEvents.sol @@ -12,11 +12,12 @@ import "./TaikoData.sol"; /// @custom:security-contact security@taiko.xyz abstract contract TaikoEvents { /// @dev Emitted when token is credited back to a user's bond balance. - event BondCredited(address indexed user, uint256 amount); + event BondCredited(address indexed user, uint256 blockId, uint256 amount); /// @dev Emitted when token is debited from a user's bond balance. - event BondDebited(address indexed user, uint256 amount); + event BondDebited(address indexed user, uint256 blockId, uint256 amount); + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @notice Emitted when a block is proposed. /// @param blockId The ID of the proposed block. /// @param assignedProver The address of the assigned prover. @@ -42,6 +43,7 @@ abstract contract TaikoEvents { /// @param txList The txList. event CalldataTxList(uint256 indexed blockId, bytes txList); + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @notice Emitted when a transition is proved. /// @param blockId The block ID. /// @param tran The transition data. @@ -72,6 +74,7 @@ abstract contract TaikoEvents { uint64 proposedIn ); + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @notice Emitted when a transition is contested. /// @param blockId The block ID. /// @param tran The transition data. @@ -106,6 +109,7 @@ abstract contract TaikoEvents { /// @param paused The pause status. event ProvingPaused(bool paused); + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @dev Emitted when a block is verified. /// @param blockId The ID of the verified block. /// @param prover The prover whose transition is used for verifying the diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index d15f655cf79..96399ffad80 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -24,7 +24,6 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { uint256[50] private __gap; - error L1_FORK_ERROR(); error L1_INVALID_PARAMS(); modifier whenProvingNotPaused() { @@ -52,7 +51,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { initializer { __Essential_init(_owner, _rollupAddressManager); - LibUtils.init(state, getConfig(), _genesisBlockHash); + LibUtils.init(state, _genesisBlockHash); if (_toPause) _pause(); } @@ -65,23 +64,6 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { } /// @inheritdoc ITaikoL1 - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - whenNotPaused - nonReentrant - emitEventForClient - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_) - { - TaikoData.Config memory config = getConfig(); - (meta_,) = LibProposing.proposeBlock(state, config, this, _params, _txList); - if (meta_.id >= config.ontakeForkHeight) revert L1_FORK_ERROR(); - deposits_ = new TaikoData.EthDeposit[](0); - } - function proposeBlockV2( bytes calldata _params, bytes calldata _txList @@ -93,8 +75,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { returns (TaikoData.BlockMetadataV2 memory meta_) { TaikoData.Config memory config = getConfig(); - (, meta_) = LibProposing.proposeBlock(state, config, this, _params, _txList); - if (meta_.id < config.ontakeForkHeight) revert L1_FORK_ERROR(); + return LibProposing.proposeBlock(state, config, this, _params, _txList); } /// @inheritdoc ITaikoL1 @@ -109,10 +90,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { returns (TaikoData.BlockMetadataV2[] memory metaArr_) { TaikoData.Config memory config = getConfig(); - (, metaArr_) = LibProposing.proposeBlocks(state, config, this, _paramsArr, _txListArr); - for (uint256 i; i < metaArr_.length; ++i) { - if (metaArr_[i].id < config.ontakeForkHeight) revert L1_FORK_ERROR(); - } + return LibProposing.proposeBlocks(state, config, this, _paramsArr, _txListArr); } /// @inheritdoc ITaikoL1 diff --git a/packages/protocol/contracts/layer1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol index aa21dd9b294..75deeb3a913 100644 --- a/packages/protocol/contracts/layer1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/layer1/provers/GuardianProver.sol @@ -54,22 +54,22 @@ contract GuardianProver is IVerifier, EssentialContract { bytes proofData ); - /// @notice Emitted when the set of guardians is updated - /// @param version The new version - /// @param guardians The new set of guardians + /// @notice Emitted when the set of guardians is updated. + /// @param version The new version. + /// @param guardians The new set of guardians. event GuardiansUpdated(uint32 version, address[] guardians); - /// @notice Emitted when an approval is made - /// @param operationId The operation ID - /// @param approvalBits The new approval bits - /// @param minGuardiansReached If the proof was submitted + /// @notice Emitted when an approval is made. + /// @param operationId The operation ID. + /// @param approvalBits The new approval bits. + /// @param minGuardiansReached If the proof was submitted. event Approved(uint256 indexed operationId, uint256 approvalBits, bool minGuardiansReached); - /// @notice Emitted when a guardian prover submit a different proof for the same block - /// @param blockId The block ID - /// @param guardian The guardian prover address - /// @param currentProofHash The existing proof hash - /// @param newProofHash The new and different proof hash + /// @notice Emitted when a guardian prover submits a different proof for the same block. + /// @param blockId The block ID. + /// @param guardian The guardian prover address. + /// @param currentProofHash The existing proof hash. + /// @param newProofHash The new and different proof hash. /// @param provingPaused True if TaikoL1's proving is paused. event ConflictingProofs( uint256 indexed blockId, @@ -97,10 +97,10 @@ contract GuardianProver is IVerifier, EssentialContract { __Essential_init(_owner, _rollupAddressManager); } - /// @notice Set the set of guardians - /// @param _newGuardians The new set of guardians - /// @param _minGuardians The minimum required to sign - /// @param _clearData true to invalidate all existing data. + /// @notice Sets the set of guardians. + /// @param _newGuardians The new set of guardians. + /// @param _minGuardians The minimum required to sign. + /// @param _clearData True to invalidate all existing data. function setGuardians( address[] memory _newGuardians, uint8 _minGuardians, @@ -144,8 +144,8 @@ contract GuardianProver is IVerifier, EssentialContract { emit GuardiansUpdated(version, _newGuardians); } - /// @dev Enables or disables proving auto pause. - /// @param _enable true to enable, false to disable. + /// @notice Enables or disables proving auto pause. + /// @param _enable True to enable, false to disable. function enableProvingAutoPause(bool _enable) external onlyOwner { if (provingAutoPauseEnabled == _enable) revert GP_INVALID_STATUS(); provingAutoPauseEnabled = _enable; @@ -154,14 +154,14 @@ contract GuardianProver is IVerifier, EssentialContract { } /// @notice Enables unlimited allowance for Taiko L1 contract. - /// param _enable true if unlimited allowance is approved, false to set the allowance to 0. + /// @param _enable True if unlimited allowance is approved, false to set the allowance to 0. function enableTaikoTokenAllowance(bool _enable) external onlyOwner { address tko = resolve(LibStrings.B_TAIKO_TOKEN, false); address taiko = resolve(LibStrings.B_TAIKO, false); IERC20(tko).approve(taiko, _enable ? type(uint256).max : 0); } - /// @dev Withdraws Taiko Token to a given address. + /// @notice Withdraws Taiko Token to a given address. /// @param _to The recipient address. /// @param _amount The amount of Taiko token to withdraw. Use 0 for all balance. function withdrawTaikoToken(address _to, uint256 _amount) external onlyOwner { @@ -196,6 +196,11 @@ contract GuardianProver is IVerifier, EssentialContract { }); } + /// @notice Called by guardians to approve a guardian proof (version 2). + /// @param _metaV2 The block's metadata (version 2). + /// @param _tran The valid transition. + /// @param _proof The tier proof. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. function approveV2( TaikoData.BlockMetadataV2 calldata _metaV2, TaikoData.Transition calldata _tran, @@ -251,12 +256,19 @@ contract GuardianProver is IVerifier, EssentialContract { } } - /// @notice Returns the number of guardians - /// @return The number of guardians + /// @notice Returns the number of guardians. + /// @return The number of guardians. function numGuardians() public view returns (uint256) { return guardians.length; } + /// @notice Internal function to handle the approval process. + /// @param _blockId The block ID. + /// @param _proofHash The proof hash. + /// @param _blockHash The block hash. + /// @param _data The encoded data. + /// @param _proofData The proof data. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. function _approve( uint64 _blockId, bytes32 _proofHash, @@ -299,6 +311,10 @@ contract GuardianProver is IVerifier, EssentialContract { } } + /// @notice Internal function to save the approval. + /// @param _blockId The block ID. + /// @param _proofHash The proof hash. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. function _saveApproval( uint256 _blockId, bytes32 _proofHash @@ -320,6 +336,9 @@ contract GuardianProver is IVerifier, EssentialContract { emit Approved(_blockId, _approval, approved_); } + /// @notice Internal function to check if the minimum number of approvals is reached. + /// @param _approvalBits The approval bits. + /// @return True if the minimum number of approvals is reached, false otherwise. function _isApproved(uint256 _approvalBits) private view returns (bool) { uint256 count; uint256 bits = _approvalBits; diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol index dd6e4ea06c1..88817329a00 100644 --- a/packages/protocol/contracts/layer1/provers/ProverSet.sol +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -83,18 +83,6 @@ contract ProverSet is EssentialContract, IERC1271 { LibAddress.sendEtherAndVerify(admin, _amount); } - /// @notice Propose a Taiko block. - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - onlyProver - { - ITaikoL1(taikoL1()).proposeBlock(_params, _txList); - } - /// @notice Propose a Taiko block. function proposeBlockV2( bytes calldata _params, diff --git a/packages/protocol/contracts/layer1/tiers/ITierProvider.sol b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol index 1e74dbcf25d..ca0f540e6cf 100644 --- a/packages/protocol/contracts/layer1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol @@ -11,7 +11,6 @@ interface ITierProvider { uint96 contestBond; uint24 cooldownWindow; // in minutes uint16 provingWindow; // in minutes - uint8 maxBlocksToVerifyPerProof; // DEPRECATED } error TIER_NOT_FOUND(); diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol index c6d4f6baa32..110ccaad734 100644 --- a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -96,8 +96,7 @@ abstract contract TierProviderBase is ITierProvider { validityBond: _validityBond, contestBond: _validityBond / 10_000 * 65_625, cooldownWindow: _cooldownWindow, - provingWindow: GRACE_PERIOD + _provingWindow, - maxBlocksToVerifyPerProof: 0 + provingWindow: GRACE_PERIOD + _provingWindow }); } } diff --git a/packages/protocol/contracts/layer2/based/LibL2Config.sol b/packages/protocol/contracts/layer2/based/LibL2Config.sol index e4ad74e2cc9..f1a7586d7f7 100644 --- a/packages/protocol/contracts/layer2/based/LibL2Config.sol +++ b/packages/protocol/contracts/layer2/based/LibL2Config.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @dev DEPRECATED but used by node/client for syncing old blocks /// @title LibL2Config library LibL2Config { struct Config { diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol index 8740b50a1b5..e734e47593f 100644 --- a/packages/protocol/contracts/layer2/based/TaikoL2.sol +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -106,6 +106,7 @@ contract TaikoL2 is EssentialContract, IBlockHash { (publicInputHash,) = _calcPublicInputHash(block.number); } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @notice Anchors the latest L1 block details to L2 for cross-layer /// message verification. /// @dev This function can be called freely as the golden touch private key is publicly known, @@ -238,11 +239,11 @@ contract TaikoL2 is EssentialContract, IBlockHash { address _to ) external + nonZeroAddr(_to) whenNotPaused onlyFromOwnerOrNamed(LibStrings.B_WITHDRAWER) nonReentrant { - if (_to == address(0)) revert L2_INVALID_PARAM(); if (_token == address(0)) { _to.sendEtherAndVerify(address(this).balance); } else { @@ -250,10 +251,9 @@ contract TaikoL2 is EssentialContract, IBlockHash { } } + /// @dev DEPRECATED but used by node/client for syncing old blocks /// @notice Gets the basefee and gas excess using EIP-1559 configuration for /// the given parameters. - /// @dev This function will deprecate after Ontake fork, node/client shall use calculateBaseFee - /// instead for base fee prediction. /// @param _anchorBlockId The synced L1 height in the next Taiko block /// @param _parentGasUsed Gas used in the parent block. /// @return basefee_ The calculated EIP-1559 base fee per gas. @@ -266,7 +266,7 @@ contract TaikoL2 is EssentialContract, IBlockHash { view returns (uint256 basefee_, uint64 parentGasExcess_) { - LibL2Config.Config memory config = getConfig(); + LibL2Config.Config memory config = LibL2Config.get(); (basefee_, parentGasExcess_) = Lib1559Math.calc1559BaseFee( uint256(config.gasTargetPerL1Block) * config.basefeeAdjustmentQuotient, @@ -284,12 +284,6 @@ contract TaikoL2 is EssentialContract, IBlockHash { return _blockhashes[_blockId]; } - /// @notice Returns EIP1559 related configurations. - /// @return config_ struct containing configuration parameters. - function getConfig() public view virtual returns (LibL2Config.Config memory) { - return LibL2Config.get(); - } - /// @notice Returns the new gas excess that will keep the basefee the same. /// @param _currGasExcess The current gas excess value. /// @param _currGasTarget The current gas target. @@ -351,6 +345,13 @@ contract TaikoL2 is EssentialContract, IBlockHash { ); } + /// @notice Calculates the public input hash for the given block ID. + /// @dev This function computes two public input hashes: one for the previous state and one for + /// the new state. + /// It uses a ring buffer to store the previous 255 block hashes and the current chain ID. + /// @param _blockId The ID of the block for which the public input hash is calculated. + /// @return publicInputHashOld The public input hash for the previous state. + /// @return publicInputHashNew The public input hash for the new state. function _calcPublicInputHash(uint256 _blockId) private view diff --git a/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol b/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol index bf3328a15cb..129438bc756 100644 --- a/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol +++ b/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol @@ -7,6 +7,6 @@ import "../based/TaikoL2.sol"; /// @custom:security-contact security@taiko.xyz contract DevnetTaikoL2 is TaikoL2 { function ontakeForkHeight() public pure override returns (uint64) { - return 2; + return 0; } } diff --git a/packages/protocol/test/genesis/data/genesis.json b/packages/protocol/test/genesis/data/genesis.json deleted file mode 100644 index dd2018cf98e..00000000000 --- a/packages/protocol/test/genesis/data/genesis.json +++ /dev/null @@ -1,242 +0,0 @@ - -{ - "config": { - "chainId": 167, - "homesteadBlock": 0, - "eip150Block": 0, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "muirGlacierBlock": 0, - "berlinBlock": 0, - "clique": { - "period": 0, - "epoch": 30000 - } - }, - "gasLimit": "30000000", - "difficulty": "1", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "alloc": - -{ - "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": { - "balance": "0x3635c9adc5dea00000" - }, - "0x79fcdef22feed20eddacbb2587640e45491b757f": { - "balance": "0x3635c9adc5dea00000" - }, - "0x0167000000000000000000000000000000000006": { - "contractName": "SharedAddressManagerImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x608060405260043610610126575f3560e01c80635c975abb116100a85780638da5cb5b1161006d5780638da5cb5b14610301578063a86f9d9e1461031e578063d8f4648f1461033d578063e07baba61461035c578063e30c39781461039b578063f2fde38b146103b8575f5ffd5b80635c975abb14610291578063715018a6146102b157806379ba5097146102c55780638456cb59146102d95780638abf6077146102ed575f5ffd5b80633ab76e9f116100ee5780633ab76e9f1461020a5780633eb6b8cf146102295780633f4ba83a146102485780634f1ef2861461025c57806352d1902d1461026f575f5ffd5b8063069489a21461012a57806319ab453c1461014057806328f713cc1461015f5780633075db56146101c75780633659cfe6146101eb575b5f5ffd5b348015610135575f5ffd5b5061013e6103d7565b005b34801561014b575f5ffd5b5061013e61015a36600461110e565b610487565b34801561016a575f5ffd5b506101aa610179366004611145565b67ffffffffffffffff919091165f90815260fb6020908152604080832093835292905220546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d2575f5ffd5b506101db61055f565b60405190151581526020016101be565b3480156101f6575f5ffd5b5061013e61020536600461110e565b610577565b348015610215575f5ffd5b506097546101aa906001600160a01b031681565b348015610234575f5ffd5b506101aa61024336600461117c565b61063e565b348015610253575f5ffd5b5061013e610654565b61013e61026a3660046111c9565b610668565b34801561027a575f5ffd5b5061028361071d565b6040519081526020016101be565b34801561029c575f5ffd5b506101db60c954610100900460ff1660021490565b3480156102bc575f5ffd5b5061013e6107ce565b3480156102d0575f5ffd5b5061013e6107df565b3480156102e4575f5ffd5b5061013e610856565b3480156102f8575f5ffd5b506101aa610869565b34801561030c575f5ffd5b506033546001600160a01b03166101aa565b348015610329575f5ffd5b506101aa61033836600461128f565b610877565b348015610348575f5ffd5b5061013e6103573660046112b9565b610883565b348015610367575f5ffd5b5060c9546103829062010000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101be565b3480156103a6575f5ffd5b506065546001600160a01b03166101aa565b3480156103c3575f5ffd5b5061013e6103d236600461110e565b610961565b6103df6109d2565b5f54600290610100900460ff161580156103ff57505f5460ff8083169116105b6104245760405162461bcd60e51b815260040161041b906112f6565b60405180910390fd5b5f8054609780546001600160a01b0319163017905561ffff191660ff83169081176101001761ff0019169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b5f54610100900460ff16158080156104a557505f54600160ff909116105b806104be5750303b1580156104be57505f5460ff166001145b6104da5760405162461bcd60e51b815260040161041b906112f6565b5f805460ff1916600117905580156104fb575f805461ff0019166101001790555b61050482610a2c565b609780546001600160a01b03191630179055801561055b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f600261056e60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000061630036105bf5760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000000066001600160a01b03166105f1610a8a565b6001600160a01b0316146106175760405162461bcd60e51b815260040161041b90611390565b61062081610aa5565b604080515f8082526020820190925261063b91839190610aad565b50565b5f61064a848484610c1c565b90505b9392505050565b61065c610c6f565b610666335f610d00565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000061630036106b05760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000000066001600160a01b03166106e2610a8a565b6001600160a01b0316146107085760405162461bcd60e51b815260040161041b90611390565b61071182610aa5565b61055b82826001610aad565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000000000616146107bc5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161041b565b505f5160206114c95f395f51905f5290565b6107d66109d2565b6106665f610d19565b60655433906001600160a01b0316811461084d5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161041b565b61063b81610d19565b61085e610d32565b610666336001610d00565b5f610872610a8a565b905090565b5f61064d468484610c1c565b61088b6109d2565b67ffffffffffffffff83165f90815260fb602090815260408083208584529091529020546001600160a01b039081169082168190036108dd5760405163a883089360e01b815260040160405180910390fd5b67ffffffffffffffff84165f81815260fb6020908152604080832087845282529182902080546001600160a01b0319166001600160a01b038781169182179092558351908152908516918101919091528592917f500dcd607a98daece9bccc2511bf6032471252929de73caf507aae0e082f8453910160405180910390a350505050565b6109696109d2565b606580546001600160a01b0383166001600160a01b0319909116811790915561099a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b031633146106665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161041b565b5f54610100900460ff16610a525760405162461bcd60e51b815260040161041b906113dc565b610a5a610da3565b610a786001600160a01b03821615610a725781610d19565b33610d19565b5060c9805461ff001916610100179055565b5f5160206114c95f395f51905f52546001600160a01b031690565b61063b6109d2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610ae557610ae083610dc9565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610b3f575060408051601f3d908101601f19168201909252610b3c91810190611427565b60015b610ba25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161041b565b5f5160206114c95f395f51905f528114610c105760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161041b565b50610ae0838383610e64565b5f610c278484610e8e565b905081158015610c3e57506001600160a01b038116155b1561064d57604051632b0d65db60e01b815267ffffffffffffffff851660048201526024810184905260440161041b565b610c8360c954610100900460ff1660021490565b610ca05760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff0019909116620100004267ffffffffffffffff1602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b604051630c2b8f8f60e11b815260040160405180910390fd5b606580546001600160a01b031916905561063b81610f39565b610d4660c954610100900460ff1660021490565b15610d645760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610cf6565b5f54610100900460ff166106665760405162461bcd60e51b815260040161041b906113dc565b6001600160a01b0381163b610e365760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161041b565b5f5160206114c95f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b610e6d83610f8a565b5f82511180610e795750805b15610ae057610e888383610fc9565b50505050565b6097545f906001600160a01b031680610eba57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b815267ffffffffffffffff85166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610f0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f31919061143e565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610f9381610dc9565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061064d83836040518060600160405280602781526020016114e96027913960605f5f856001600160a01b031685604051611005919061147b565b5f60405180830381855af49150503d805f811461103d576040519150601f19603f3d011682016040523d82523d5f602084013e611042565b606091505b50915091506110538683838761105d565b9695505050505050565b606083156110cb5782515f036110c4576001600160a01b0385163b6110c45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161041b565b5081610f31565b610f3183838151156110e05781518083602001fd5b8060405162461bcd60e51b815260040161041b9190611496565b6001600160a01b038116811461063b575f5ffd5b5f6020828403121561111e575f5ffd5b813561064d816110fa565b803567ffffffffffffffff81168114611140575f5ffd5b919050565b5f5f60408385031215611156575f5ffd5b61115f83611129565b946020939093013593505050565b80358015158114611140575f5ffd5b5f5f5f6060848603121561118e575f5ffd5b61119784611129565b9250602084013591506111ac6040850161116d565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156111da575f5ffd5b82356111e5816110fa565b9150602083013567ffffffffffffffff811115611200575f5ffd5b8301601f81018513611210575f5ffd5b803567ffffffffffffffff81111561122a5761122a6111b5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611259576112596111b5565b604052818152828201602001871015611270575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f604083850312156112a0575f5ffd5b823591506112b06020840161116d565b90509250929050565b5f5f5f606084860312156112cb575f5ffd5b6112d484611129565b92506020840135915060408401356112eb816110fa565b809150509250925092565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215611437575f5ffd5b5051919050565b5f6020828403121561144e575f5ffd5b815161064d816110fa565b5f5b8381101561147357818101518382015260200161145b565b50505f910152565b5f825161148c818460208701611459565b9190910192915050565b602081525f82518060208401526114b4816040850160208701611459565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220086d22e71c4d170ad7ce74f948ce47f2f39076babb18c7b950d99c756006877464736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000006": { - "contractName": "SharedAddressManager", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0xee78643889fcb54c297d0ecf866d9df7d829a8c978e52394d135cdb40a501e38": "0x0000000000000000000000001670000000000000000000000000000000000001", - "0x1b59c5b714a9474274d08839cd27e78ebbcde0eb67d55f88e6a8162fdf746fb6": "0x0000000000000000000000001670000000000000000000000000000000000002", - "0x86f2835ec2a9687ca2e2a16b9bca18cc21a3eb0801913c2c1024c94dae29a56f": "0x0000000000000000000000001670000000000000000000000000000000000003", - "0xceda61f04213e952bfa0631c1d6a46e0243feddef01b15830df6d44a883942ef": "0x0000000000000000000000001670000000000000000000000000000000000004", - "0xd724ebf31fb7ffa376a4d5d51b51967009df0c86a4dfef5f55507cde2eb36739": "0x0000000000000000000000001670000000000000000000000000000000000005", - "0x7c370492eefc4caa8cbb896169c5fc4597f28c57333bb43e31066f4f66652c55": "0x0000000000000000000000000167000000000000000000000000000000010096", - "0xe6965834a21a9e0a0de81d5e0ea99e149f660508a785a52be0ad77b96b5b1c5c": "0x0000000000000000000000000167000000000000000000000000000000010097", - "0x83e96d9214b47c6368e642dca9daced8ea339555eb83dac20d7cbfb0cc0f5c7b": "0x0000000000000000000000000167000000000000000000000000000000010098", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000006" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000001": { - "contractName": "BridgeImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x60806040526004361061021d575f3560e01c806382b5e8891161011e578063b8acae0e116100a8578063e07baba61161006d578063e07baba61461066b578063e30c3978146106a8578063eefbf17e146106c5578063f09a4016146106eb578063f2fde38b1461070a575f5ffd5b8063b8acae0e146105af578063be880c81146105ce578063c012fa77146105e4578063d0496d6a14610603578063d1aaa5df1461064b575f5ffd5b80638e3881a9116100ee5780638e3881a9146104fe578063913b16cb1461053c5780639efc7a2e1461055b578063a730cdfb1461057a578063a86f9d9e14610590575f5ffd5b806382b5e8891461049a5780638456cb59146104b95780638abf6077146104cd5780638da5cb5b146104e1575f5ffd5b80633f4ba83a116101aa5780635c975abb1161016f5780635c975abb146103ff57806360620c6b1461041f578063715018a61461043e57806379ba5097146104525780637cbadfaa14610466575f5ffd5b80633f4ba83a14610381578063422770fa146103955780634f1ef286146103b957806352d1902d146103cc5780635862f6e1146103e0575f5ffd5b80633075db56116101f05780633075db56146102ad5780633659cfe6146102d15780633ab76e9f146102f05780633c6cf473146103275780633eb6b8cf14610362575f5ffd5b80630432873c14610221578063069489a2146102425780631bdb0037146102565780632035065e14610280575b5f5ffd5b34801561022c575f5ffd5b5061024061023b366004612f67565b610729565b005b34801561024d575f5ffd5b50610240610a27565b610269610264366004612fb5565b610ade565b604051610277929190613141565b60405180910390f35b34801561028b575f5ffd5b5061029f61029a366004613159565b610e94565b604051610277929190613216565b3480156102b8575f5ffd5b506102c1611344565b6040519015158152602001610277565b3480156102dc575f5ffd5b506102406102eb366004613265565b61135c565b3480156102fb575f5ffd5b5060975461030f906001600160a01b031681565b6040516001600160a01b039091168152602001610277565b348015610332575f5ffd5b50610355610341366004613280565b60fc6020525f908152604090205460ff1681565b6040516102779190613297565b34801561036d575f5ffd5b5061030f61037c3660046132bb565b611423565b34801561038c575f5ffd5b50610240611439565b3480156103a0575f5ffd5b506103ab62030d4081565b604051908152602001610277565b6102406103c73660046133be565b61144d565b3480156103d7575f5ffd5b506103ab611506565b3480156103eb575f5ffd5b506102c16103fa366004613159565b6115b8565b34801561040a575f5ffd5b506102c160c954610100900460ff1660021490565b34801561042a575f5ffd5b506102c1610439366004612fb5565b611623565b348015610449575f5ffd5b506102406116f1565b34801561045d575f5ffd5b50610240611702565b348015610471575f5ffd5b50610485610480366004613280565b611779565b60405163ffffffff9091168152602001610277565b3480156104a5575f5ffd5b506102406104b4366004613265565b611791565b3480156104c4575f5ffd5b50610240611811565b3480156104d8575f5ffd5b5061030f611824565b3480156104ec575f5ffd5b506033546001600160a01b031661030f565b348015610509575f5ffd5b5061051d61051836600461340a565b611832565b6040805192151583526001600160a01b03909116602083015201610277565b348015610547575f5ffd5b50610240610556366004612fb5565b61185e565b348015610566575f5ffd5b50610240610575366004613159565b611a4d565b348015610585575f5ffd5b506104856201d4c081565b34801561059b575f5ffd5b5061030f6105aa366004613423565b611d51565b3480156105ba575f5ffd5b506102c16105c9366004613159565b611d5d565b3480156105d9575f5ffd5b50610485620c350081565b3480156105ef575f5ffd5b506103ab6105fe366004613546565b611dbe565b34801561060e575f5ffd5b50610617611ded565b60408051825181526020808401516001600160a01b031690820152918101516001600160401b031690820152606001610277565b348015610656575f5ffd5b506103ab610665366004613280565b60031890565b348015610676575f5ffd5b5060c954610690906201000090046001600160401b031681565b6040516001600160401b039091168152602001610277565b3480156106b3575f5ffd5b506065546001600160a01b031661030f565b3480156106d0575f5ffd5b5060fb5461069090600160401b90046001600160401b031681565b3480156106f6575f5ffd5b50610240610705366004613577565b611e94565b348015610715575f5ffd5b50610240610724366004613265565b611f5b565b61073960e0830160c0840161340a565b46816001600160401b03161461076257604051631c6c777560e31b815260040160405180910390fd5b61077260a084016080850161340a565b6001600160401b0381161580610790575046816001600160401b0316145b156107ae57604051631c6c777560e31b815260040160405180910390fd5b6107c260c954610100900460ff1660021490565b156107e05760405163bae6e2a960e01b815260040160405180910390fd5b60026107ee60c95460ff1690565b60ff160361080f5760405163dfc60d8560e01b815260040160405180910390fd5b6108196002611fcc565b5f6108266105fe866135a3565b9050610833816001611fe2565b610841856101200135612034565b61085e576040516335856fbd60e21b815260040160405180910390fd5b5f6108838661087e6d7369676e616c5f7365727669636560901b5f611d51565b6120d5565b156108ce576108c78661012001356188b860405180602001604052805f8152508960e00160208101906108b69190613265565b6001600160a01b03169291906121cc565b9050610948565b6108de60608701604088016135ae565b63ffffffff1615806108ed5750845b801561091b5750610905610100870160e08801613265565b6001600160a01b0316336001600160a01b031614155b15610939576040516372b6e1c360e11b815260040160405180910390fd5b61094586835a5f612209565b90505b801561095e5761095982600261232d565b610a15565b84156109fc5761096f82600361232d565b61098a6d7369676e616c5f7365727669636560901b5f611d51565b60405163019b28af60e61b81526003841860048201526001600160a01b0391909116906366ca2bc0906024016020604051808303815f875af11580156109d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f691906135c7565b50610a15565b60405163161e3ead60e01b815260040160405180910390fd5b5050610a216001611fcc565b50505050565b610a2f6123ea565b5f54600290610100900460ff16158015610a4f57505f5460ff8083169116105b610a745760405162461bcd60e51b8152600401610a6b906135de565b60405180910390fd5b5f805460fb805467ffffffffffffffff1916905560ff82815561010083815561ff001991851661ffff19909316831717169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201839052610140820152610b4460c0840160a08501613265565b6001600160a01b038116610b6b5760405163538ba4f960e01b815260040160405180910390fd5b610b7c610100850160e08601613265565b6001600160a01b038116610ba35760405163538ba4f960e01b815260040160405180910390fd5b610bb360e0860160c0870161340a565b6001600160401b0381161580610bd1575046816001600160401b0316145b15610bef57604051631c6c777560e31b815260040160405180910390fd5b610c0360c954610100900460ff1660021490565b15610c215760405163bae6e2a960e01b815260040160405180910390fd5b6002610c2f60c95460ff1690565b60ff1603610c505760405163dfc60d8560e01b815260040160405180910390fd5b610c5a6002611fcc565b610c6a60608701604088016135ae565b63ffffffff165f03610cb257610c86604087016020880161340a565b6001600160401b031615610cad5760405163c9f5178760e01b815260040160405180910390fd5b610cda565b610cbb86612444565b5f03610cda576040516308c2ad5360e01b815260040160405180910390fd5b5f610cee61051860e0890160c08a0161340a565b50905080610d0f57604051631c6c777560e31b815260040160405180910390fd5b34610d206040890160208a0161340a565b610d38906001600160401b03166101208a0135613640565b14610d5657604051634ac2abdf60e11b815260040160405180910390fd5b610d5f876135a3565b60fb8054919650600160401b9091046001600160401b0316906008610d8383613653565b82546101009290920a6001600160401b03818102199093169183160217909155908116865233606087015246166080860152610dbe85611dbe565b9550857fe33fd33b4f45b95b1c196242240c5b5233129d724b578f95b66ce8d8aae9351786604051610df0919061367d565b60405180910390a2610e136d7369676e616c5f7365727669636560901b5f611d51565b6001600160a01b03166366ca2bc0876040518263ffffffff1660e01b8152600401610e4091815260200190565b6020604051808303815f875af1158015610e5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8091906135c7565b5050610e8c6001611fcc565b505050915091565b5f5f610eaa60c954610100900460ff1660021490565b15610ec85760405163bae6e2a960e01b815260040160405180910390fd5b6002610ed660c95460ff1690565b60ff1603610ef75760405163dfc60d8560e01b815260040160405180910390fd5b610f016002611fcc565b5f5a905046610f1660e0880160c0890161340a565b6001600160401b031614610f3d57604051631c6c777560e31b815260040160405180910390fd5b610f4d60a087016080880161340a565b6001600160401b03161580610f79575046610f6e60a088016080890161340a565b6001600160401b0316145b15610f9757604051631c6c777560e31b815260040160405180910390fd5b604080516080810182525f808252602082018190529181018290526060810191909152610fcb610100880160e08901613265565b6001600160a01b031633148015606083015261103a57610ff160608801604089016135ae565b63ffffffff165f03611016576040516372b6e1c360e11b815260040160405180910390fd5b62030d4085111561103a57604051631e3b03c960e01b815260040160405180910390fd5b5f6110476105fe896135a3565b9050611053815f611fe2565b5f61106f6d7369676e616c5f7365727669636560901b5f611d51565b63ffffffff881660208501529050611099818361109260a08d0160808e0161340a565b8b8b612497565b63ffffffff166040808501919091526110d8906110bb908b0160208c0161340a565b6110d3906001600160401b03166101208c0135613640565b612034565b6110f5576040516335856fbd60e21b815260040160405180910390fd5b5f6111008a836120d5565b1561111957506002955060019450610120890135611160565b5f8460600151611129575a611132565b6111328b612444565b90506111448b85838860600151612209565b1561115557600297505f965061115e565b60019750600296505b505b61117060408b0160208c0161340a565b6001600160401b0316156112c15761118e60408b0160208c0161340a565b6111a1906001600160401b031682613640565b9050836060015180156111c857506111bf60608b0160408c016135ae565b63ffffffff1615155b156112c157604084015163ffffffff16614e20025a6111f56111ee6101408e018e61368f565b9050612542565b63ffffffff9081168801919091036201d4c00181168087525f91839161121e9183919061256a16565b0390505f61123260608e0160408f016135ae565b63ffffffff168d602001602081019061124b919061340a565b6001600160401b0316830281611263576112636136d8565b0490505f48830290505f6112a78f6020016020810190611283919061340a565b6001600160401b03168484101561129f5784840160011c6112a1565b845b9061257f565b958690039590506112bb33826188b8612593565b50505050505b6112e9816188b86112d96101008e0160e08f01613265565b6001600160a01b03169190612593565b6112f3838861232d565b827f8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d8b86604051611325929190613870565b60405180910390a2505050505061133c6001611fcc565b935093915050565b5f600261135360c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000011630036113a45760405162461bcd60e51b8152600401610a6b906138c4565b7f00000000000000000000000001670000000000000000000000000000000000016001600160a01b03166113d66125d6565b6001600160a01b0316146113fc5760405162461bcd60e51b8152600401610a6b90613910565b611405816125f1565b604080515f80825260208201909252611420918391906125f9565b50565b5f61142f848484612763565b90505b9392505050565b6114416127b5565b61144b335f612845565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000011630036114955760405162461bcd60e51b8152600401610a6b906138c4565b7f00000000000000000000000001670000000000000000000000000000000000016001600160a01b03166114c76125d6565b6001600160a01b0316146114ed5760405162461bcd60e51b8152600401610a6b90613910565b6114f6826125f1565b611502828260016125f9565b5050565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000000000116146115a55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a6b565b505f516020613b2a5f395f51905f525b90565b5f466115ca60a086016080870161340a565b6001600160401b0316146115df57505f611432565b61142f6115fd6d7369676e616c5f7365727669636560901b5f611d51565b61160c6106656105fe886135a3565b61161c60e0880160c0890161340a565b86866128f2565b5f4661163560a084016080850161340a565b6001600160401b03161461164a57505f919050565b6116656d7369676e616c5f7365727669636560901b5f611d51565b6001600160a01b03166332676bc6306116806105fe866135a3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156116c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116eb919061395c565b92915050565b6116f96123ea565b61144b5f612974565b60655433906001600160a01b031681146117705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610a6b565b61142081612974565b5f620c350061178783612542565b6116eb9190613977565b806001600160a01b0381166117b95760405163538ba4f960e01b815260040160405180910390fd5b6040516317066a5760e21b81523060048201526001600160a01b03831690635c19a95c906024015f604051808303815f87803b1580156117f7575f5ffd5b505af1158015611809573d5f5f3e3d5ffd5b505050505050565b61181961298d565b61144b336001612845565b5f61182d6125d6565b905090565b5f5f611849836562726964676560d01b6001611423565b6001600160a01b038116151594909350915050565b61186e60e0820160c0830161340a565b46816001600160401b03161461189757604051631c6c777560e31b815260040160405180910390fd5b6118a760a083016080840161340a565b6001600160401b03811615806118c5575046816001600160401b0316145b156118e357604051631c6c777560e31b815260040160405180910390fd5b6118f760c954610100900460ff1660021490565b156119155760405163bae6e2a960e01b815260040160405180910390fd5b600261192360c95460ff1690565b60ff16036119445760405163dfc60d8560e01b815260040160405180910390fd5b61194e6002611fcc565b61195f610100840160e08501613265565b6001600160a01b0316336001600160a01b031614611990576040516372b6e1c360e11b815260040160405180910390fd5b5f61199d6105fe856135a3565b90506119aa816001611fe2565b6119b581600361232d565b6119d06d7369676e616c5f7365727669636560901b5f611d51565b60405163019b28af60e61b81526003831860048201526001600160a01b0391909116906366ca2bc0906024016020604051808303815f875af1158015611a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3c91906135c7565b5050611a486001611fcc565b505050565b611a5d60a084016080850161340a565b46816001600160401b031614611a8657604051631c6c777560e31b815260040160405180910390fd5b611a9660e0850160c0860161340a565b6001600160401b0381161580611ab4575046816001600160401b0316145b15611ad257604051631c6c777560e31b815260040160405180910390fd5b611ae660c954610100900460ff1660021490565b15611b045760405163bae6e2a960e01b815260040160405180910390fd5b6002611b1260c95460ff1690565b60ff1603611b335760405163dfc60d8560e01b815260040160405180910390fd5b611b3d6002611fcc565b5f611b4a6105fe876135a3565b9050611b56815f611fe2565b5f611b726d7369676e616c5f7365727669636560901b5f611d51565b604051631933b5e360e11b8152306004820152602481018490529091506001600160a01b038216906332676bc690604401602060405180830381865afa158015611bbe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be2919061395c565b611bff5760405163ab035ad560e01b815260040160405180910390fd5b611c1e8160038418611c1760e08b0160c08c0161340a565b8989612497565b50611c2a82600461232d565b611c38876101200135612034565b611c55576040516335856fbd60e21b815260040160405180910390fd5b611c7e62bc399d60e11b611c6f60808a0160608b01613265565b6001600160a01b0316906129fe565b15611d2257611c9d8230611c9860a08b0160808c0161340a565b612a8b565b611cad6080880160608901613265565b6001600160a01b0316630178733a88610120013589856040518463ffffffff1660e01b8152600401611ce0929190613993565b5f604051808303818588803b158015611cf7575f5ffd5b505af1158015611d09573d5f5f3e3d5ffd5b5050505050611d1d5f195f1b5f1980612a8b565b611d3e565b611d3e6101208801356188b86112d960c08b0160a08c01613265565b5050611d4a6001611fcc565b5050505050565b5f611432468484612763565b5f46611d6f60e0860160c0870161340a565b6001600160401b031614611d8457505f611432565b61142f611da26d7369676e616c5f7365727669636560901b5f611d51565b611dae6105fe876135a3565b61161c60a088016080890161340a565b5f81604051602001611dd091906139b4565b604051602081830303815290604052805190602001209050919050565b604080516060810182525f8082526020820181905291810191909152611e64604080516060810182525f8082526020820181905291810191909152506040805160608101825260fd54815260fe546001600160a01b0381166020830152600160a01b90046001600160401b03169181019190915290565b80519091501580611e76575080515f19145b156115b557604051635ceed17360e01b815260040160405180910390fd5b5f54610100900460ff1615808015611eb257505f54600160ff909116105b80611ecb5750303b158015611ecb57505f5460ff166001145b611ee75760405162461bcd60e51b8152600401610a6b906135de565b5f805460ff191660011790558015611f08575f805461ff0019166101001790555b611f128383612ae0565b8015611a48575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b611f636123ea565b606580546001600160a01b0383166001600160a01b03199091168117909155611f946033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b806004811115611ff457611ff46131ee565b5f83815260fc602052604090205460ff166004811115612016576120166131ee565b14611502576040516319d893ad60e21b815260040160405180910390fd5b5f5f6120516c38bab7ba30afb6b0b730b3b2b960991b6001611d51565b90506001600160a01b03811661206a5750600192915050565b6040516315c638fb60e31b81525f6004820152602481018490526001600160a01b0382169063ae31c7d8906044015f604051808303815f87803b1580156120af575f5ffd5b505af19250505080156120c0575060015b6120cc57505f92915050565b50600192915050565b5f806120e961012085016101008601613265565b6001600160a01b0316036120ff575060016116eb565b3061211261012085016101008601613265565b6001600160a01b031603612128575060016116eb565b6001600160a01b03821661214461012085016101008601613265565b6001600160a01b03160361215a575060016116eb565b600461216a61014085018561368f565b9050101580156121a15750637f07c94760e01b61218b61014085018561368f565b612194916139ea565b6001600160e01b03191614155b801561143257506114326121bd61012085016101008601613265565b6001600160a01b03163b151590565b5f6001600160a01b0385166121f457604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b5f3061221b6080870160608801613265565b6001600160a01b03160361223157612231613a22565b610120850135158015612251575061224d61014086018661368f565b1590505b1561225e57506001612325565b825f0361226c57505f612325565b612290846122806080880160608901613265565b611c9860a0890160808a0161340a565b5f6122a361012087016101008801613265565b90506101208601355f6122ba61014089018961368f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525084519495509384935083925090506020850186888cf194505a90508515612314576123148188612b1a565b6123205f198080612a8b565b505050505b949350505050565b80600481111561233f5761233f6131ee565b5f83815260fc602052604090205460ff166004811115612361576123616131ee565b0361237f576040516319d893ad60e21b815260040160405180910390fd5b5f82815260fc60205260409020805482919060ff191660018360048111156123a9576123a96131ee565b0217905550817f6c51882bc2ed67617f77a1e9b9a25d2caad8448647ecb093b357a603b2575634826040516123de9190613297565b60405180910390a25050565b6033546001600160a01b0316331461144b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6b565b5f8061245e61245761014085018561368f565b9050611779565b63ffffffff1690508061248f61247a60608601604087016135ae565b63ffffffff168361256a90919063ffffffff16565b039392505050565b5f856001600160a01b031663910af6ed856124bc876562726964676560d01b5f611423565b8887876040518663ffffffff1660e01b81526004016124df959493929190613a36565b6020604051808303815f875af1925050508015612519575060408051601f3d908101601f19168201909252612516918101906135c7565b60015b612536576040516314504c7360e31b815260040160405180910390fd5b90505b95945050505050565b5f815f0361255157505f919050565b60046020601f8401046020026101a001901b9050919050565b5f8183116125785781611432565b5090919050565b5f81831161258d5782611432565b50919050565b815f0361259f57505050565b6125b983838360405180602001604052805f8152506121cc565b611a4857604051634c67134d60e11b815260040160405180910390fd5b5f516020613b2a5f395f51905f52546001600160a01b031690565b6114206123ea565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561262c57611a4883612b2e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612686575060408051601f3d908101601f19168201909252612683918101906135c7565b60015b6126e95760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a6b565b5f516020613b2a5f395f51905f5281146127575760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a6b565b50611a48838383612bc9565b5f61276e8484612bed565b90508115801561278557506001600160a01b038116155b1561143257604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610a6b565b6127c960c954610100900460ff1660021490565b6127e65760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6033546001600160a01b038381169116148061288d57506128786d636861696e5f7761746368646f6760901b6001611d51565b6001600160a01b0316826001600160a01b0316145b15612896575050565b8080156128d057506128bb6e6272696467655f7761746368646f6760881b6001611d51565b6001600160a01b0316826001600160a01b0316145b156128d9575050565b604051630d85cccf60e11b815260040160405180910390fd5b5f856001600160a01b031663ce9d082085612917876562726964676560d01b5f611423565b8887876040518663ffffffff1660e01b815260040161293a959493929190613a36565b5f6040518083038186803b158015612950575f5ffd5b505afa925050508015612961575060015b61296c57505f612539565b506001612539565b606580546001600160a01b031916905561142081612c8f565b6129a160c954610100900460ff1660021490565b156129bf5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161283b565b5f6001600160a01b0383163b612a1557505f6116eb565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa925050508015612a7f575060408051601f3d908101601f19168201909252612a7c9181019061395c565b60015b156116eb579392505050565b604080516060810182528481526001600160a01b03909316602084018190526001600160401b03909216920182905260fd9290925560fe8054600160a01b9092026001600160e01b0319909216909217179055565b806001600160a01b038116612b085760405163538ba4f960e01b815260040160405180910390fd5b612b1183612ce0565b611a4882612d3e565b612b25603f82613a77565b82101561150257fe5b6001600160a01b0381163b612b9b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a6b565b5f516020613b2a5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b612bd283612dae565b5f82511180612bde5750805b15611a4857610a218383612ded565b6097545f906001600160a01b031680612c1957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015612c6b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123259190613a96565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16612d065760405162461bcd60e51b8152600401610a6b90613ab1565b612d0e612e12565b612d2c6001600160a01b03821615612d265781612974565b33612974565b5060c9805461ff001916610100179055565b5f54610100900460ff16612d645760405162461bcd60e51b8152600401610a6b90613ab1565b6001600160401b03461115612d8c5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b612db781612b2e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606114328383604051806060016040528060278152602001613b4a60279139612e38565b5f54610100900460ff1661144b5760405162461bcd60e51b8152600401610a6b90613ab1565b60605f5f856001600160a01b031685604051612e549190613afc565b5f60405180830381855af49150503d805f8114612e8c576040519150601f19603f3d011682016040523d82523d5f602084013e612e91565b606091505b5091509150612ea286838387612eac565b9695505050505050565b60608315612f1a5782515f03612f13576001600160a01b0385163b612f135760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a6b565b5081612325565b6123258383815115612f2f5781518083602001fd5b8060405162461bcd60e51b8152600401610a6b9190613b17565b5f610160828403121561258d575f5ffd5b8015158114611420575f5ffd5b5f5f60408385031215612f78575f5ffd5b82356001600160401b03811115612f8d575f5ffd5b612f9985828601612f49565b9250506020830135612faa81612f5a565b809150509250929050565b5f60208284031215612fc5575f5ffd5b81356001600160401b03811115612fda575f5ffd5b61232584828501612f49565b5f5b83811015613000578181015183820152602001612fe8565b50505f910152565b5f815180845261301f816020860160208601612fe6565b601f01601f19169290920160200192915050565b80516001600160401b031682525f602082015161305b60208501826001600160401b03169052565b506040820151613073604085018263ffffffff169052565b50606082015161308e60608501826001600160a01b03169052565b5060808201516130a960808501826001600160401b03169052565b5060a08201516130c460a08501826001600160a01b03169052565b5060c08201516130df60c08501826001600160401b03169052565b5060e08201516130fa60e08501826001600160a01b03169052565b506101008201516131176101008501826001600160a01b03169052565b50610120820151610120840152610140820151610160610140850152612325610160850182613008565b828152604060208201525f61142f6040830184613033565b5f5f5f6040848603121561316b575f5ffd5b83356001600160401b03811115613180575f5ffd5b61318c86828701612f49565b93505060208401356001600160401b038111156131a7575f5ffd5b8401601f810186136131b7575f5ffd5b80356001600160401b038111156131cc575f5ffd5b8660208284010111156131dd575f5ffd5b939660209190910195509293505050565b634e487b7160e01b5f52602160045260245ffd5b60058110613212576132126131ee565b9052565b604081016132248285613202565b60048310613234576132346131ee565b8260208301529392505050565b6001600160a01b0381168114611420575f5ffd5b803561326081613241565b919050565b5f60208284031215613275575f5ffd5b813561143281613241565b5f60208284031215613290575f5ffd5b5035919050565b602081016116eb8284613202565b80356001600160401b0381168114613260575f5ffd5b5f5f5f606084860312156132cd575f5ffd5b6132d6846132a5565b92506020840135915060408401356132ed81612f5a565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b038111828210171561332f5761332f6132f8565b60405290565b5f82601f830112613344575f5ffd5b81356001600160401b0381111561335d5761335d6132f8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561338b5761338b6132f8565b6040528181528382016020018510156133a2575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156133cf575f5ffd5b82356133da81613241565b915060208301356001600160401b038111156133f4575f5ffd5b61340085828601613335565b9150509250929050565b5f6020828403121561341a575f5ffd5b611432826132a5565b5f5f60408385031215613434575f5ffd5b823591506020830135612faa81612f5a565b803563ffffffff81168114613260575f5ffd5b5f610160828403121561346a575f5ffd5b61347261330c565b905061347d826132a5565b815261348b602083016132a5565b602082015261349c60408301613446565b60408201526134ad60608301613255565b60608201526134be608083016132a5565b60808201526134cf60a08301613255565b60a08201526134e060c083016132a5565b60c08201526134f160e08301613255565b60e08201526135036101008301613255565b61010082015261012082810135908201526101408201356001600160401b0381111561352d575f5ffd5b61353984828501613335565b6101408301525092915050565b5f60208284031215613556575f5ffd5b81356001600160401b0381111561356b575f5ffd5b61232584828501613459565b5f5f60408385031215613588575f5ffd5b823561359381613241565b91506020830135612faa81613241565b5f6116eb3683613459565b5f602082840312156135be575f5ffd5b61143282613446565b5f602082840312156135d7575f5ffd5b5051919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156116eb576116eb61362c565b5f6001600160401b0382166001600160401b0381036136745761367461362c565b60010192915050565b602081525f6114326020830184613033565b5f5f8335601e198436030181126136a4575f5ffd5b8301803591506001600160401b038211156136bd575f5ffd5b6020019150368190038213156136d1575f5ffd5b9250929050565b634e487b7160e01b5f52601260045260245ffd5b5f5f8335601e19843603018112613701575f5ffd5b83016020810192503590506001600160401b0381111561371f575f5ffd5b8036038213156136d1575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61376f82613762836132a5565b6001600160401b03169052565b5f61377c602083016132a5565b6001600160401b0316602084015261379660408301613446565b63ffffffff1660408401526137ad60608301613255565b6001600160a01b031660608401526137c7608083016132a5565b6001600160401b031660808401526137e160a08301613255565b6001600160a01b031660a08401526137fb60c083016132a5565b6001600160401b031660c084015261381560e08301613255565b6001600160a01b031660e08401526138306101008301613255565b6001600160a01b031661010084015261012082810135908401526138586101408301836136ec565b6101606101408601526125396101608601828461372d565b60a081525f61388260a0830185613755565b905063ffffffff835116602083015263ffffffff602084015116604083015263ffffffff60408401511660608301526060830151151560808301529392505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b5f6020828403121561396c575f5ffd5b815161143281612f5a565b63ffffffff81811683821601908111156116eb576116eb61362c565b604081525f6139a56040830185613755565b90508260208301529392505050565b60408152600d60408201526c5441494b4f5f4d45535341474560981b6060820152608060208201525f6114326080830184613033565b80356001600160e01b03198116906004841015613a1b576001600160e01b0319600485900360031b81901b82161691505b5092915050565b634e487b7160e01b5f52600160045260245ffd5b6001600160401b038616815260018060a01b0385166020820152836040820152608060608201525f613a6c60808301848661372d565b979650505050505050565b5f82613a9157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613aa6575f5ffd5b815161143281613241565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251613b0d818460208701612fe6565b9190910192915050565b602081525f611432602083018461300856fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206ccb67f04aaf63488576bbb651d54656794e2eac08c3401a79a0cda25cd7f6e664736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000001": { - "contractName": "Bridge", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000001" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x033b2dc55cae685664a00000" - }, - "0x0167000000000000000000000000000000000002": { - "contractName": "ERC20VaultImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x6080604052600436106101ba575f3560e01c806367090ccf116100f25780639aa8605c11610092578063e07baba611610062578063e07baba6146104e3578063e30c397814610520578063f09a40161461053d578063f2fde38b1461055c575f5ffd5b80639aa8605c1461045e578063a86f9d9e1461048e578063b84d9ffe146104ad578063d56ad7ac146104cd575f5ffd5b80637f07c947116100cd5780637f07c947146104065780638456cb59146104195780638abf60771461042d5780638da5cb5b14610441575f5ffd5b806367090ccf1461039e578063715018a6146103de57806379ba5097146103f2575f5ffd5b80633659cfe61161015d5780633f4ba83a116101385780633f4ba83a146103435780634f1ef2861461035757806352d1902d1461036a5780635c975abb1461037e575f5ffd5b80633659cfe6146102e65780633ab76e9f146103055780633eb6b8cf14610324575f5ffd5b806306fdde031161019857806306fdde031461024c5780630e7eeb791461026c5780630ecd8be91461029b5780633075db56146102d2575f5ffd5b80630178733a146101be57806301ffc9a7146101d3578063066fe7b414610207575b5f5ffd5b6101d16101cc36600461330a565b61057b565b005b3480156101de575f5ffd5b506101f26101ed366004613350565b610709565b60405190151581526020015b60405180910390f35b348015610212575f5ffd5b5061023e61022136600461338b565b61013060209081525f928352604080842090915290825290205481565b6040519081526020016101fe565b348015610257575f5ffd5b506a195c98cc8c17dd985d5b1d60aa1b61023e565b348015610277575f5ffd5b506101f26102863660046133b9565b61012f6020525f908152604090205460ff1681565b3480156102a6575f5ffd5b506102ba6102b53660046133d4565b610759565b6040516001600160a01b0390911681526020016101fe565b3480156102dd575f5ffd5b506101f2610e67565b3480156102f1575f5ffd5b506101d16103003660046133b9565b610e7f565b348015610310575f5ffd5b506097546102ba906001600160a01b031681565b34801561032f575f5ffd5b506102ba61033e36600461343c565b610f4f565b34801561034e575f5ffd5b506101d1610f65565b6101d1610365366004613584565b610f79565b348015610375575f5ffd5b5061023e61102e565b348015610389575f5ffd5b506101f260c954610100900460ff1660021490565b3480156103a9575f5ffd5b506102ba6103b836600461338b565b61012e60209081525f92835260408084209091529082529020546001600160a01b031681565b3480156103e9575f5ffd5b506101d16110df565b3480156103fd575f5ffd5b506101d16110f0565b6101d16104143660046135d0565b611167565b348015610424575f5ffd5b506101d16112b7565b348015610438575f5ffd5b506102ba6112ca565b34801561044c575f5ffd5b506033546001600160a01b03166102ba565b348015610469575f5ffd5b5061047d6104783660046133b9565b6112d8565b6040516101fe959493929190613689565b348015610499575f5ffd5b506102ba6104a83660046136e2565b61142d565b6104c06104bb366004613705565b611439565b6040516101fe919061371e565b3480156104d8575f5ffd5b5061023e6276a70081565b3480156104ee575f5ffd5b5060c954610508906201000090046001600160401b031681565b6040516001600160401b0390911681526020016101fe565b34801561052b575f5ffd5b506065546001600160a01b03166102ba565b348015610548575f5ffd5b506101d161055736600461380e565b61187c565b348015610567575f5ffd5b506101d16105763660046133b9565b61198b565b61058f60c954610100900460ff1660021490565b156105ad5760405163bae6e2a960e01b815260040160405180910390fd5b60026105bb60c95460ff1690565b60ff16036105dc5760405163dfc60d8560e01b815260040160405180910390fd5b6105e660026119fc565b6105ee611a12565b505f6105fe61014084018461382a565b61060c916004908290613873565b810190610619919061389a565b90505f5f828060200190518101906106319190613946565b9350505091505f610655838760a001602081019061064f91906133b9565b84611b08565b905061067f61012087013561067060c0890160a08a016133b9565b6001600160a01b031690611bb0565b61068f60c0870160a088016133b9565b6001600160a01b0316857f3dea0f5955b148debf6212261e03bd80eaf8534bee43780452d16637dcc22dd5856020015184866040516106ef939291906001600160a01b039384168152919092166020820152604081019190915260600190565b60405180910390a35050505061070560016119fc565b5050565b5f6001600160e01b0319821662bc399d60e11b148061073857506001600160e01b03198216637f07c94760e01b145b8061075357506001600160e01b031982166301ffc9a760e01b145b92915050565b5f610762611bbb565b600261077060c95460ff1690565b60ff16036107915760405163dfc60d8560e01b815260040160405180910390fd5b61079b60026119fc565b6001600160a01b03821615806107d157506001600160a01b038281165f90815261012d6020526040902054600160401b90041615155b806107e457506001600160a01b0382163b155b156108025760405163dc63f98760e01b815260040160405180910390fd5b5f61081360408501602086016133b9565b6001600160a01b0316148061083c5750466108316020850185613a3a565b6001600160401b0316145b1561085a57604051638257f7f560e01b815260040160405180910390fd5b6001600160a01b0382165f90815261012f602052604090205460ff1615610894576040516375c42fc160e01b815260040160405180910390fd5b5f610130816108a66020870187613a3a565b6001600160401b031681526020019081526020015f205f8560200160208101906108d091906133b9565b6001600160a01b0316815260208101919091526040015f205490506108f86276a70082613a69565b4210156109185760405163231d35fb60e11b815260040160405180910390fd5b61012e5f6109296020870187613a3a565b6001600160401b031681526020019081526020015f205f85602001602081019061095391906133b9565b6001600160a01b03908116825260208201929092526040015f20541691508115610cb9576001600160a01b038281165f90815261012d60209081526040808320815160a08101835281546001600160401b0381168252600160401b810490961693810193909352600160e01b90940460ff1690820152600183018054929391926060840191906109e290613a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90613a7c565b8015610a595780601f10610a3057610100808354040283529160200191610a59565b820191905f5260205f20905b815481529060010190602001808311610a3c57829003601f168201915b50505050508152602001600282018054610a7290613a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9e90613a7c565b8015610ae95780601f10610ac057610100808354040283529160200191610ae9565b820191905f5260205f20905b815481529060010190602001808311610acc57829003601f168201915b505050505081525050905080604051602001610b059190613b13565b6040516020818303038152906040528051906020012085604051602001610b2c9190613b99565b6040516020818303038152906040528051906020012014610b6057604051632f9d1d7b60e11b815260040160405180910390fd5b6001600160a01b0383165f90815261012d6020526040812080546001600160e81b031916815590610b9460018301826132b2565b610ba1600283015f6132b2565b50506001600160a01b0383165f81815261012f60205260409020805460ff19166001179055610bd79063b8f2e0c560e01b611c15565b8015610bf85750610bf86001600160a01b03851663b8f2e0c560e01b611c15565b15610cb75760405163b8f2e0c560e01b81526001600160a01b0385811660048301525f602483015284169063b8f2e0c5906044015f604051808303815f87803b158015610c43575f5ffd5b505af1158015610c55573d5f5f3e3d5ffd5b505060405163b8f2e0c560e01b81526001600160a01b038681166004830152600160248301528716925063b8f2e0c591506044015f604051808303815f87803b158015610ca0575f5ffd5b505af1158015610cb2573d5f5f3e3d5ffd5b505050505b505b6001600160a01b0383165f90815261012d602052604090208490610cdd8282613d3c565b5083905061012e5f610cf26020880188613a3a565b6001600160401b031681526020019081526020015f205f866020016020810190610d1c91906133b9565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550426101305f865f016020810190610d759190613a3a565b6001600160401b031681526020019081526020015f205f866020016020810190610d9f91906133b9565b6001600160a01b03166001600160a01b031681526020019081526020015f2081905550836020016020810190610dd591906133b9565b6001600160a01b0316610deb6020860186613a3a565b6001600160401b03167f031d68e1805917560c34a5f55a7dd91bef98f911190ed02cdbb53caedae6c39d8486610e2460608a018a61382a565b610e3160808c018c61382a565b610e4160608e0160408f01613dfa565b604051610e549796959493929190613e15565b60405180910390a35061075360016119fc565b5f6002610e7660c95460ff1690565b60ff1614905090565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000002163003610ed05760405162461bcd60e51b8152600401610ec790613e6c565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000026001600160a01b0316610f02611ca2565b6001600160a01b031614610f285760405162461bcd60e51b8152600401610ec790613eb8565b610f3181611cbd565b604080515f80825260208201909252610f4c91839190611cc5565b50565b5f610f5b848484611e2f565b90505b9392505050565b610f6d611e81565b610f77335f611f11565b565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000002163003610fc15760405162461bcd60e51b8152600401610ec790613e6c565b7f00000000000000000000000001670000000000000000000000000000000000026001600160a01b0316610ff3611ca2565b6001600160a01b0316146110195760405162461bcd60e51b8152600401610ec790613eb8565b61102282611cbd565b61070582826001611cc5565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000000000216146110cd5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610ec7565b505f5160206149985f395f51905f5290565b6110e7611bbb565b610f775f611f19565b60655433906001600160a01b0316811461115e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610ec7565b610f4c81611f19565b61117b60c954610100900460ff1660021490565b156111995760405163bae6e2a960e01b815260040160405180910390fd5b60026111a760c95460ff1690565b60ff16036111c85760405163dfc60d8560e01b815260040160405180910390fd5b6111d260026119fc565b5f8080806111e285870187613f0f565b93509350935093505f6111f3611f32565b90506111fe83612051565b5f61120a868585611b08565b905061121f6001600160a01b03851634611bb0565b836001600160a01b0316856001600160a01b0316835f01517f75a051823424fc80e92556c41cb0ad977ae1dcb09c68a9c38acab86b11a69f8985604001518a60200151868960405161129f94939291906001600160401b039490941684526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a450505050505061070560016119fc565b6112bf61208d565b610f77336001611f11565b5f6112d3611ca2565b905090565b61012d6020525f9081526040902080546001820180546001600160401b03831693600160401b84046001600160a01b031693600160e01b900460ff1692909161132090613a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461134c90613a7c565b80156113975780601f1061136e57610100808354040283529160200191611397565b820191905f5260205f20905b81548152906001019060200180831161137a57829003601f168201915b5050505050908060020180546113ac90613a7c565b80601f01602080910402602001604051908101604052809291908181526020018280546113d890613a7c565b80156114235780601f106113fa57610100808354040283529160200191611423565b820191905f5260205f20905b81548152906001019060200180831161140657829003601f168201915b5050505050905085565b5f610f5e468484611e2f565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201929092526101408101919091526114a760c954610100900460ff1660021490565b156114c55760405163bae6e2a960e01b815260040160405180910390fd5b60026114d360c95460ff1690565b60ff16036114f45760405163dfc60d8560e01b815260040160405180910390fd5b6114fe60026119fc565b8160c001355f0361152257604051634299323b60e11b815260040160405180910390fd5b5f61153360a08401608085016133b9565b6001600160a01b03160361155a576040516303f8a7d360e01b815260040160405180910390fd5b61012f5f61156e60a08501608086016133b9565b6001600160a01b0316815260208101919091526040015f205460ff16156115a8576040516375c42fc160e01b815260040160405180910390fd5b6115b86080830160608401613a3a565b6001600160401b03163410156115e157604051630178ce0b60e31b815260040160405180910390fd5b5f5f5f6115ed856120fe565b6040805161016081019091525f8082529396509194509250602081016116196080890160608a01613a3a565b6001600160401b0316815260200161163760c0890160a08a01614014565b63ffffffff1681525f6020808301829052604083019190915233606083015260809091019061166890890189613a3a565b6001600160401b031681526020015f6001600160a01b031688602001602081019061169391906133b9565b6001600160a01b0316036116a757336116b7565b6116b76040890160208a016133b9565b6001600160a01b031681526020908101906116ee906116d8908a018a613a3a565b6a195c98cc8c17dd985d5b1d60aa1b5b5f610f4f565b6001600160a01b0316815260200161170c6080890160608a01613a3a565b61171f906001600160401b03163461402f565b815260200185905290505f61173d6562726964676560d01b8261142d565b6001600160a01b0316631bdb003734846040518363ffffffff1660e01b8152600401611769919061371e565b5f6040518083038185885af1158015611784573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f191682016040526117ac919081019061404d565b965090506117c060608801604089016133b9565b6001600160a01b03168660a001516001600160a01b0316827f256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d875f01518b5f01602081019061180f9190613a3a565b89602001518d608001602081019061182791906133b9565b604080516001600160401b0395861681529390941660208401526001600160a01b03918216838501521660608201526080810189905290519081900360a00190a4505050505061187760016119fc565b919050565b5f54610100900460ff161580801561189a57505f54600160ff909116105b806118b35750303b1580156118b357505f5460ff166001145b6119165760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610ec7565b5f805460ff191660011790558015611937575f805461ff0019166101001790555b6119418383612598565b8015611986575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b611993611bbb565b606580546001600160a01b0383166001600160a01b031990911681179091556119c46033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611a4381600161142d565b6001600160a01b0316336001600160a01b031614611a7457604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ab0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ad4919061416d565b60208101519092506001600160a01b03163314611b0457604051632583296b60e01b815260040160405180910390fd5b5090565b5f46845f01516001600160401b031603611b3b57506020830151611b366001600160a01b03821684846125d2565b611ba6565b611b4484612635565b6040516340c10f1960e01b81526001600160a01b03858116600483015260248201859052919250908216906340c10f19906044015f604051808303815f87803b158015611b8f575f5ffd5b505af1158015611ba1573d5f5f3e3d5ffd5b505050505b610f5e8183612677565b61070582825a612706565b6033546001600160a01b03163314610f775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ec7565b5f6001600160a01b0383163b611c2c57505f610753565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa925050508015611c96575060408051601f3d908101601f19168201909252611c93918101906141d5565b60015b15610753579392505050565b5f5160206149985f395f51905f52546001600160a01b031690565b610f4c611bbb565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611cf85761198683612749565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d52575060408051601f3d908101601f19168201909252611d4f918101906141f0565b60015b611db55760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610ec7565b5f5160206149985f395f51905f528114611e235760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610ec7565b506119868383836127e4565b5f611e3a848461280e565b905081158015611e5157506001600160a01b038116155b15610f5e57604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610ec7565b611e9560c954610100900460ff1660021490565b611eb25760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610705611bbb565b606580546001600160a01b0319169055610f4c816128b8565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611f6381600161142d565b6001600160a01b0316336001600160a01b031614611f9457604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611fd0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff4919061416d565b91505f61201483604001516116e86a195c98cc8c17dd985d5b1d60aa1b90565b9050806001600160a01b031683602001516001600160a01b03161461204c57604051632583296b60e01b815260040160405180910390fd5b505090565b6001600160a01b038116158061206f57506001600160a01b03811630145b15610f4c57604051635b50f3f960e01b815260040160405180910390fd5b6120a160c954610100900460ff1660021490565b156120bf5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611f07565b6040805160a0810182525f8082526020820181905291810191909152606081810181905260808201819052905f8061012d8161214060a08801608089016133b9565b6001600160a01b03908116825260208201929092526040015f208054909250600160401b90041615612376576040805160a08101825282546001600160401b0381168252600160401b81046001600160a01b03166020830152600160e01b900460ff1691810191909152600182018054839160608401916121c090613a7c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ec90613a7c565b80156122375780601f1061220e57610100808354040283529160200191612237565b820191905f5260205f20905b81548152906001019060200180831161221a57829003601f168201915b5050505050815260200160028201805461225090613a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461227c90613a7c565b80156122c75780601f1061229e576101008083540402835291602001916122c7565b820191905f5260205f20905b8154815290600101906020018083116122aa57829003601f168201915b505050505081525050925061230033308760c001358860800160208101906122ef91906133b9565b6001600160a01b0316929190612909565b61231060a08601608087016133b9565b604051630852cd8d60e31b815260c087013560048201526001600160a01b0391909116906342966c68906024015f604051808303815f87803b158015612354575f5ffd5b505af1158015612366573d5f5f3e3d5ffd5b505050508460c001359150612518565b6040518060a00160405280466001600160401b031681526020018660800160208101906123a391906133b9565b6001600160a01b031681526020016123c96123c460a0890160808a016133b9565b612941565b60ff1681526020016123e96123e460a0890160808a016133b9565b6129f5565b815260200161240661240160a0890160808a016133b9565b612a9f565b905292505f61241b60a08701608088016133b9565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038316906370a0823190602401602060405180830381865afa158015612462573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248691906141f0565b90506124a16001600160a01b038316333060c08b0135612909565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa1580156124e5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250991906141f0565b612513919061402f565b935050505b30637f07c947843361253060608a0160408b016133b9565b866040516020016125449493929190614207565b60408051601f19818403018152908290526125619160240161423c565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509350509193909250565b806001600160a01b0381166125c05760405163538ba4f960e01b815260040160405180910390fd5b6125c983612ae5565b61198682612b43565b6040516001600160a01b03831660248201526044810182905261198690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bb3565b80516001600160401b03165f90815261012e60209081526040808320828501516001600160a01b03908116855292529091205416806118775761075382612c86565b5f6126936c38bab7ba30afb6b0b730b3b2b960991b600161142d565b90506001600160a01b03811615611986576040516315c638fb60e31b81526001600160a01b0384811660048301526024820184905282169063ae31c7d8906044015f604051808303815f87803b1580156126eb575f5ffd5b505af11580156126fd573d5f5f3e3d5ffd5b50505050505050565b815f0361271257505050565b61272c83838360405180602001604052805f815250612e88565b61198657604051634c67134d60e11b815260040160405180910390fd5b6001600160a01b0381163b6127b65760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610ec7565b5f5160206149985f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6127ed83612ec5565b5f825111806127f95750805b15611986576128088383612f04565b50505050565b6097545f906001600160a01b03168061283a57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa15801561288c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b0919061424e565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526128089085906323b872dd60e01b906084016125fe565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916129869190614269565b5f60405180830381855afa9150503d805f81146129be576040519150601f19603f3d011682016040523d82523d5f602084013e6129c3565b606091505b50915091508180156129d6575080516020145b6129e15760126128b0565b808060200190518101906128b09190614284565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b03861691612a3b9190614269565b5f60405180830381855afa9150503d805f8114612a73576040519150601f19603f3d011682016040523d82523d5f602084013e612a78565b606091505b509150915081612a965760405180602001604052805f8152506128b0565b6128b081612f29565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b03861691612a3b9190614269565b5f54610100900460ff16612b0b5760405162461bcd60e51b8152600401610ec79061429f565b612b13613096565b612b316001600160a01b03821615612b2b5781611f19565b33611f19565b5060c9805461ff001916610100179055565b5f54610100900460ff16612b695760405162461bcd60e51b8152600401610ec79061429f565b6001600160401b03461115612b915760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f612c07826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130bc9092919063ffffffff16565b905080515f1480612c27575080806020019051810190612c2791906141d5565b6119865760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ec7565b5f5f612c9a6033546001600160a01b031690565b60975460208501518551604080880151606089015160808a01519251612cd097966001600160a01b0316959493906024016142ea565b60408051601f198184030181529190526020810180516001600160e01b031663bb86ef9360e01b1790529050612d166c0627269646765645f657263323609c1b5f61142d565b81604051612d23906132e9565b612d2e929190614355565b604051809103905ff080158015612d47573d5f5f3e3d5ffd5b506001600160a01b038082165f90815261012d602090815260409182902087518154928901519389015160ff16600160e01b0260ff60e01b1994909516600160401b026001600160e01b03199093166001600160401b03909116179190911791909116919091178155606085015191935084916001820190612dc99082614378565b5060808201516002820190612dde9082614378565b505083516001600160401b039081165f90815261012e6020908152604080832082890180516001600160a01b039081168652919093529281902080546001600160a01b0319168885169081179091559151885160608a015160808b0151848c01519451959850929095169516937fb6b427556e8cb0ebf9175da4bc48c64c4f56e44cfaf8c3ab5ebf8e2ea130907993612e7a9391929190614432565b60405180910390a450919050565b5f6001600160a01b038516612eb057604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b612ece81612749565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610f5e83836040518060600160405280602781526020016149b8602791396130ca565b60606040825110612f485781806020019051810190610753919061446a565b8151602003613083575f5b60208160ff16108015612f885750828160ff1681518110612f7657612f7661449b565b01602001516001600160f81b03191615155b15612f9f5780612f97816144af565b915050612f53565b5f8160ff166001600160401b03811115612fbb57612fbb61347b565b6040519080825280601f01601f191660200182016040528015612fe5576020820181803683370190505b5090505f91505b60208260ff161080156130215750838260ff168151811061300f5761300f61449b565b01602001516001600160f81b03191615155b15610f5e57838260ff168151811061303b5761303b61449b565b602001015160f81c60f81b818360ff168151811061305b5761305b61449b565b60200101906001600160f81b03191690815f1a9053508161307b816144af565b925050612fec565b505060408051602081019091525f815290565b5f54610100900460ff16610f775760405162461bcd60e51b8152600401610ec79061429f565b6060610f5b84845f8561313e565b60605f5f856001600160a01b0316856040516130e69190614269565b5f60405180830381855af49150503d805f811461311e576040519150601f19603f3d011682016040523d82523d5f602084013e613123565b606091505b509150915061313486838387613215565b9695505050505050565b60608247101561319f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ec7565b5f5f866001600160a01b031685876040516131ba9190614269565b5f6040518083038185875af1925050503d805f81146131f4576040519150601f19603f3d011682016040523d82523d5f602084013e6131f9565b606091505b509150915061320a87838387613215565b979650505050505050565b606083156132835782515f0361327c576001600160a01b0385163b61327c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ec7565b50816128b0565b6128b083838151156132985781518083602001fd5b8060405162461bcd60e51b8152600401610ec7919061423c565b5080546132be90613a7c565b5f825580601f106132cd575050565b601f0160209004905f5260205f2090810190610f4c91906132f6565b6104ca806144ce83390190565b5b80821115611b04575f81556001016132f7565b5f5f6040838503121561331b575f5ffd5b82356001600160401b03811115613330575f5ffd5b83016101608186031215613342575f5ffd5b946020939093013593505050565b5f60208284031215613360575f5ffd5b81356001600160e01b031981168114610f5e575f5ffd5b6001600160a01b0381168114610f4c575f5ffd5b5f5f6040838503121561339c575f5ffd5b8235915060208301356133ae81613377565b809150509250929050565b5f602082840312156133c9575f5ffd5b8135610f5e81613377565b5f5f604083850312156133e5575f5ffd5b82356001600160401b038111156133fa575f5ffd5b830160a0818603121561340b575f5ffd5b915060208301356133ae81613377565b6001600160401b0381168114610f4c575f5ffd5b8015158114610f4c575f5ffd5b5f5f5f6060848603121561344e575f5ffd5b83356134598161341b565b92506020840135915060408401356134708161342f565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b03811182821017156134b1576134b161347b565b60405290565b60405161016081016001600160401b03811182821017156134b1576134b161347b565b604051601f8201601f191681016001600160401b03811182821017156135025761350261347b565b604052919050565b5f6001600160401b038211156135225761352261347b565b50601f01601f191660200190565b5f82601f83011261353f575f5ffd5b8135602083015f6135576135528461350a565b6134da565b905082815285838301111561356a575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f60408385031215613595575f5ffd5b82356135a081613377565b915060208301356001600160401b038111156135ba575f5ffd5b6135c685828601613530565b9150509250929050565b5f5f602083850312156135e1575f5ffd5b82356001600160401b038111156135f6575f5ffd5b8301601f81018513613606575f5ffd5b80356001600160401b0381111561361b575f5ffd5b85602082840101111561362c575f5ffd5b6020919091019590945092505050565b5f5b8381101561365657818101518382015260200161363e565b50505f910152565b5f815180845261367581602086016020860161363c565b601f01601f19169290920160200192915050565b6001600160401b03861681526001600160a01b038516602082015260ff8416604082015260a0606082018190525f906136c49083018561365e565b82810360808401526136d6818561365e565b98975050505050505050565b5f5f604083850312156136f3575f5ffd5b8235915060208301356133ae8161342f565b5f60e0828403128015613716575f5ffd5b509092915050565b602081526137386020820183516001600160401b03169052565b5f602083015161375360408401826001600160401b03169052565b50604083015163ffffffff811660608401525060608301516001600160a01b03811660808401525060808301516001600160401b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160401b03811660e08401525060e08301516001600160a01b038116610100840152506101008301516001600160a01b03811661012084015250610120830151610140830152610140830151610160808401526128b061018084018261365e565b5f5f6040838503121561381f575f5ffd5b823561340b81613377565b5f5f8335601e1984360301811261383f575f5ffd5b8301803591506001600160401b03821115613858575f5ffd5b60200191503681900382131561386c575f5ffd5b9250929050565b5f5f85851115613881575f5ffd5b8386111561388d575f5ffd5b5050820193919092039150565b5f602082840312156138aa575f5ffd5b81356001600160401b038111156138bf575f5ffd5b6128b084828501613530565b80516118778161341b565b805161187781613377565b60ff81168114610f4c575f5ffd5b8051611877816138e1565b5f82601f830112613909575f5ffd5b8151602083015f61391c6135528461350a565b905082815285838301111561392f575f5ffd5b61393d83602083018461363c565b95945050505050565b5f5f5f5f60808587031215613959575f5ffd5b84516001600160401b0381111561396e575f5ffd5b850160a0818803121561397f575f5ffd5b61398761348f565b81516139928161341b565b815260208201516139a281613377565b60208201526139b3604083016138ef565b604082015260608201516001600160401b038111156139d0575f5ffd5b6139dc898285016138fa565b60608301525060808201516001600160401b038111156139fa575f5ffd5b613a06898285016138fa565b6080830152509450613a1c9050602086016138d6565b9250613a2a604086016138d6565b6060959095015193969295505050565b5f60208284031215613a4a575f5ffd5b8135610f5e8161341b565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561075357610753613a55565b600181811c90821680613a9057607f821691505b602082108103613aae57634e487b7160e01b5f52602260045260245ffd5b50919050565b6001600160401b03815116825260018060a01b03602082015116602083015260ff60408201511660408301525f606082015160a06060850152613afa60a085018261365e565b90506080830151848203608086015261393d828261365e565b602081525f610f5e6020830184613ab4565b8035611877816138e1565b5f5f8335601e19843603018112613b45575f5ffd5b83016020810192503590506001600160401b03811115613b63575f5ffd5b80360382131561386c575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f8235613ba98161341b565b6001600160401b0381166020840152506020830135613bc781613377565b6001600160a01b0316604083810191909152830135613be5816138e1565b60ff8116606084015250613bfc6060840184613b30565b60a06080850152613c1160c085018284613b71565b915050613c216080850185613b30565b848303601f190160a0860152613134838284613b71565b601f82111561198657805f5260205f20601f840160051c81016020851015613c5d5750805b601f840160051c820191505b81811015613c7c575f8155600101613c69565b5050505050565b6001600160401b03831115613c9a57613c9a61347b565b613cae83613ca88354613a7c565b83613c38565b5f601f841160018114613cdf575f8515613cc85750838201355b5f19600387901b1c1916600186901b178355613c7c565b5f83815260208120601f198716915b82811015613d0e5786850135825560209485019460019092019101613cee565b5086821015613d2a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135613d478161341b565b6001600160401b03811690508154816001600160401b031982161783556020840135613d7281613377565b6001600160e01b031991909116909117604091821b68010000000000000000600160e01b03161782555f90830135613da9816138e1565b825460ff60e01b191660e09190911b60ff60e01b1617825550613dcf606083018361382a565b613ddd818360018601613c83565b5050613dec608083018361382a565b612808818360028601613c83565b5f60208284031215613e0a575f5ffd5b8135610f5e816138e1565b6001600160a01b0388811682528716602082015260a0604082018190525f90613e419083018789613b71565b8281036060840152613e54818688613b71565b91505060ff8316608083015298975050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b803561187781613377565b5f5f5f5f60808587031215613f22575f5ffd5b84356001600160401b03811115613f37575f5ffd5b850160a08188031215613f48575f5ffd5b613f5061348f565b8135613f5b8161341b565b81526020820135613f6b81613377565b6020820152613f7c60408301613b25565b604082015260608201356001600160401b03811115613f99575f5ffd5b613fa589828501613530565b60608301525060808201356001600160401b03811115613fc3575f5ffd5b613fcf89828501613530565b6080830152509450613fe5905060208601613f04565b9250613ff360408601613f04565b9396929550929360600135925050565b63ffffffff81168114610f4c575f5ffd5b5f60208284031215614024575f5ffd5b8135610f5e81614003565b8181038181111561075357610753613a55565b805161187781614003565b5f5f6040838503121561405e575f5ffd5b825160208401519092506001600160401b0381111561407b575f5ffd5b8301610160818603121561408d575f5ffd5b6140956134b7565b61409e826138cb565b81526140ac602083016138cb565b60208201526140bd60408301614042565b60408201526140ce606083016138d6565b60608201526140df608083016138cb565b60808201526140f060a083016138d6565b60a082015261410160c083016138cb565b60c082015261411260e083016138d6565b60e082015261412461010083016138d6565b61010082015261012082810151908201526101408201516001600160401b0381111561414e575f5ffd5b61415a878285016138fa565b6101408301525080925050509250929050565b5f606082840312801561417e575f5ffd5b50604051606081016001600160401b03811182821017156141a1576141a161347b565b6040528251815260208301516141b681613377565b602082015260408301516141c98161341b565b60408201529392505050565b5f602082840312156141e5575f5ffd5b8151610f5e8161342f565b5f60208284031215614200575f5ffd5b5051919050565b608081525f6142196080830187613ab4565b6001600160a01b0395861660208401529390941660408201526060015292915050565b602081525f610f5e602083018461365e565b5f6020828403121561425e575f5ffd5b8151610f5e81613377565b5f825161427a81846020870161363c565b9190910192915050565b5f60208284031215614294575f5ffd5b8151610f5e816138e1565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0388811682528781166020830152861660408201526001600160401b038516606082015260ff8416608082015260e060a082018190525f906143359083018561365e565b82810360c0840152614347818561365e565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f90610f5b9083018461365e565b81516001600160401b038111156143915761439161347b565b6143a58161439f8454613a7c565b84613c38565b6020601f8211600181146143d7575f83156143c05750848201515b5f19600385901b1c1916600184901b178455613c7c565b5f84815260208120601f198516915b8281101561440657878501518255602094850194600190920191016143e6565b508482101561442357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b606081525f614444606083018661365e565b8281036020840152614456818661365e565b91505060ff83166040830152949350505050565b5f6020828403121561447a575f5ffd5b81516001600160401b0381111561448f575f5ffd5b6128b0848285016138fa565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036144c4576144c4613a55565b6001019291505056fe60806040526040516104ca3803806104ca833981016040819052610022916102d2565b61002d82825f610034565b50506103ed565b61003d8361005f565b5f825111806100495750805b1561005a57610058838361009e565b505b505050565b610068816100ca565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606100c383836040518060600160405280602781526020016104a36027913961017d565b9392505050565b6001600160a01b0381163b61013c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f856001600160a01b03168560405161019991906103a0565b5f60405180830381855af49150503d805f81146101d1576040519150601f19603f3d011682016040523d82523d5f602084013e6101d6565b606091505b5090925090506101e8868383876101f2565b9695505050505050565b606083156102605782515f03610259576001600160a01b0385163b6102595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610133565b508161026a565b61026a8383610272565b949350505050565b8151156102825781518083602001fd5b8060405162461bcd60e51b815260040161013391906103bb565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102ca5781810151838201526020016102b2565b50505f910152565b5f5f604083850312156102e3575f5ffd5b82516001600160a01b03811681146102f9575f5ffd5b60208401519092506001600160401b03811115610314575f5ffd5b8301601f81018513610324575f5ffd5b80516001600160401b0381111561033d5761033d61029c565b604051601f8201601f19908116603f011681016001600160401b038111828210171561036b5761036b61029c565b604052818152828201602001871015610382575f5ffd5b6103938260208301602086016102b0565b8093505050509250929050565b5f82516103b18184602087016102b0565b9190910192915050565b602081525f82518060208401526103d98160408501602087016102b0565b601f01601f19169190910160400192915050565b60aa806103f95f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220b8d385d4f2d6cc75f0553b0f75a9defc23ce602bcb05516f25f5e40cac657bef64736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000002": { - "contractName": "ERC20Vault", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000201", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000002" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000003": { - "contractName": "ERC721VaultImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x60806040526004361061017b575f3560e01c806367090ccf116100cd5780638da5cb5b11610087578063e07baba611610062578063e07baba614610449578063e30c397814610486578063f09a4016146104a3578063f2fde38b146104c2575f5ffd5b80638da5cb5b146103de5780639aa8605c146103fb578063a86f9d9e1461042a575f5ffd5b806367090ccf1461033b578063715018a61461037b57806379ba50971461038f5780637f07c947146103a35780638456cb59146103b65780638abf6077146103ca575f5ffd5b80633659cfe6116101385780633f4ba83a116101135780633f4ba83a146102e05780634f1ef286146102f457806352d1902d146103075780635c975abb1461031b575f5ffd5b80633659cfe61461026b5780633ab76e9f1461028a5780633eb6b8cf146102c1575f5ffd5b80630178733a1461017f57806301ffc9a71461019457806306fdde03146101c8578063150b7a02146101f35780631f59a830146102375780633075db5614610257575b5f5ffd5b61019261018d3660046128ea565b6104e1565b005b34801561019f575f5ffd5b506101b36101ae366004612930565b610694565b60405190151581526020015b60405180910390f35b3480156101d3575f5ffd5b506b195c98cdcc8c57dd985d5b1d60a21b5b6040519081526020016101bf565b3480156101fe575f5ffd5b5061021e61020d3660046129ba565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101bf565b61024a610245366004612a27565b6106e4565b6040516101bf9190612aab565b348015610262575f5ffd5b506101b3610b6a565b348015610276575f5ffd5b50610192610285366004612b9b565b610b82565b348015610295575f5ffd5b506097546102a9906001600160a01b031681565b6040516001600160a01b0390911681526020016101bf565b3480156102cc575f5ffd5b506102a96102db366004612be2565b610c52565b3480156102eb575f5ffd5b50610192610c68565b610192610302366004612d4d565b610c7c565b348015610312575f5ffd5b506101e5610d31565b348015610326575f5ffd5b506101b360c954610100900460ff1660021490565b348015610346575f5ffd5b506102a9610355366004612d99565b61012e60209081525f92835260408084209091529082529020546001600160a01b031681565b348015610386575f5ffd5b50610192610de2565b34801561039a575f5ffd5b50610192610df3565b6101926103b1366004612dc7565b610e6a565b3480156103c1575f5ffd5b50610192610fd3565b3480156103d5575f5ffd5b506102a9610fe6565b3480156103e9575f5ffd5b506033546001600160a01b03166102a9565b348015610406575f5ffd5b5061041a610415366004612b9b565b610ff4565b6040516101bf9493929190612e05565b348015610435575f5ffd5b506102a9610444366004612e54565b61113f565b348015610454575f5ffd5b5060c95461046e906201000090046001600160401b031681565b6040516001600160401b0390911681526020016101bf565b348015610491575f5ffd5b506065546001600160a01b03166102a9565b3480156104ae575f5ffd5b506101926104bd366004612e77565b61114b565b3480156104cd575f5ffd5b506101926104dc366004612b9b565b61125a565b6104f560c954610100900460ff1660021490565b156105135760405163bae6e2a960e01b815260040160405180910390fd5b600261052160c95460ff1690565b60ff16036105425760405163dfc60d8560e01b815260040160405180910390fd5b61054c60026112cb565b6105546112e1565b505f610564610140840184612ea3565b610572916004908290612ee5565b81019061057f9190612f0c565b90505f5f828060200190518101906105979190613026565b9350505091505f6105bb838760a00160208101906105b59190612b9b565b846113d7565b90506105e56101208701356105d660c0890160a08a01612b9b565b6001600160a01b03169061154e565b6105f560c0870160a08801612b9b565b6001600160a01b0316857fe48bef18455e47bca14864ab6e82dffa29df148b051c09de95aec44ecf13598c8560200151848687516001600160401b0381111561064057610640612c21565b604051908082528060200260200182016040528015610669578160200160208202803683370190505b5060405161067a9493929190613165565b60405180910390a35050505061069060016112cb565b5050565b5f6001600160e01b0319821662bc399d60e11b14806106c357506001600160e01b03198216637f07c94760e01b145b806106de57506001600160e01b031982166301ffc9a760e01b145b92915050565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915261075260c954610100900460ff1660021490565b156107705760405163bae6e2a960e01b815260040160405180910390fd5b61077982613219565b8060e00151518160c0015151146107a35760405163196e8a4160e31b815260040160405180910390fd5b60808101516001600160a01b03166107ce576040516303f8a7d360e01b815260040160405180910390fd5b60026107dc60c95460ff1690565b60ff16036107fd5760405163dfc60d8560e01b815260040160405180910390fd5b61080760026112cb565b61081760808401606085016132ec565b6001600160401b031634101561084057604051630178ce0b60e31b815260040160405180910390fd5b5f5b61084f60c0850185613307565b90508110156108a35761086560e0850185613307565b828181106108755761087561334c565b905060200201355f1461089b57604051634299323b60e11b815260040160405180910390fd5b600101610842565b506108ce6380ac58cd60e01b6108bf60a0860160808701612b9b565b6001600160a01b031690611559565b6108eb57604051633ee915f560e11b815260040160405180910390fd5b5f5f6108f6856115e6565b6040805161016081019091525f808252929450909250602081016109206080890160608a016132ec565b6001600160401b0316815260200161093e60c0890160a08a01613360565b63ffffffff1681525f6020808301829052604083019190915233606083015260809091019061096f908901896132ec565b6001600160401b031681526020015f6001600160a01b031688602001602081019061099a9190612b9b565b6001600160a01b0316036109ae57336109be565b6109be6040890160208a01612b9b565b6001600160a01b031681526020908101906109f6906109df908a018a6132ec565b6b195c98cdcc8c57dd985d5b1d60a21b5b5f610c52565b6001600160a01b03168152602001610a146080890160608a016132ec565b610a27906001600160401b03163461338f565b815260200184905290505f610a456562726964676560d01b8261113f565b6001600160a01b0316631bdb003734846040518363ffffffff1660e01b8152600401610a719190612aab565b5f6040518083038185885af1158015610a8c573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052610ab491908101906133ad565b96509050610ac86060880160408901612b9b565b6001600160a01b03168660a001516001600160a01b0316827fabbf62a1459339f9ac59136d313a5ccd83d2706cc6d4c04d90642520169144dc8960c0015187602001518c6080016020810190610b1e9190612b9b565b610b2b60c08f018f613307565b8f8060e00190610b3b9190613307565b604051610b4e97969594939291906134fd565b60405180910390a450505050610b6460016112cb565b50919050565b5f6002610b7960c95460ff1690565b60ff1614905090565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000003163003610bd35760405162461bcd60e51b8152600401610bca90613559565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000036001600160a01b0316610c05611ac8565b6001600160a01b031614610c2b5760405162461bcd60e51b8152600401610bca906135a5565b610c3481611ae3565b604080515f80825260208201909252610c4f91839190611aeb565b50565b5f610c5e848484611c55565b90505b9392505050565b610c70611ca7565b610c7a335f611d37565b565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000003163003610cc45760405162461bcd60e51b8152600401610bca90613559565b7f00000000000000000000000001670000000000000000000000000000000000036001600160a01b0316610cf6611ac8565b6001600160a01b031614610d1c5760405162461bcd60e51b8152600401610bca906135a5565b610d2582611ae3565b61069082826001611aeb565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000000031614610dd05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610bca565b505f516020613ff95f395f51905f5290565b610dea611d3b565b610c7a5f611d95565b60655433906001600160a01b03168114610e615760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610bca565b610c4f81611d95565b610e7e60c954610100900460ff1660021490565b15610e9c5760405163bae6e2a960e01b815260040160405180910390fd5b6002610eaa60c95460ff1690565b60ff1603610ecb5760405163dfc60d8560e01b815260040160405180910390fd5b610ed560026112cb565b5f808080610ee5858701876135f1565b93509350935093505f610ef6611dae565b9050610f0183611ece565b5f610f0d8685856113d7565b9050610f226001600160a01b0385163461154e565b836001600160a01b0316856001600160a01b0316835f01517f895f73e418d1bbbad2a311d085fad00e5d98a960e9f2afa4b942071d39bec43a85604001518a6020015186898a516001600160401b03811115610f8057610f80612c21565b604051908082528060200260200182016040528015610fa9578160200160208202803683370190505b50604051610fbb9594939291906136ea565b60405180910390a450505050505061069060016112cb565b610fdb611f0a565b610c7a336001611d37565b5f610fef611ac8565b905090565b61012d6020525f9081526040902080546001820180546001600160401b03831693600160401b9093046001600160a01b031692919061103290613742565b80601f016020809104026020016040519081016040528092919081815260200182805461105e90613742565b80156110a95780601f10611080576101008083540402835291602001916110a9565b820191905f5260205f20905b81548152906001019060200180831161108c57829003601f168201915b5050505050908060020180546110be90613742565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea90613742565b80156111355780601f1061110c57610100808354040283529160200191611135565b820191905f5260205f20905b81548152906001019060200180831161111857829003601f168201915b5050505050905084565b5f610c61468484611c55565b5f54610100900460ff161580801561116957505f54600160ff909116105b806111825750303b15801561118257505f5460ff166001145b6111e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bca565b5f805460ff191660011790558015611206575f805461ff0019166101001790555b6112108383611f7b565b8015611255575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b611262611d3b565b606580546001600160a01b0383166001600160a01b031990911681179091556112936033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b61131281600161113f565b6001600160a01b0316336001600160a01b03161461134357604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561137f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113a39190613774565b60208101519092506001600160a01b031633146113d357604051632583296b60e01b815260040160405180910390fd5b5090565b5f46845f01516001600160401b03160361149d575060208301515f5b825181101561149757816001600160a01b03166342842e0e308686858151811061141f5761141f61334c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b158015611476575f5ffd5b505af1158015611488573d5f5f3e3d5ffd5b505050508060010190506113f3565b50610c61565b6114a684611fb5565b90505f5b825181101561154657816001600160a01b03166340c10f19858584815181106114d5576114d561334c565b60200260200101516040518363ffffffff1660e01b815260040161150e9291906001600160a01b03929092168252602082015260400190565b5f604051808303815f87803b158015611525575f5ffd5b505af1158015611537573d5f5f3e3d5ffd5b505050508060010190506114aa565b509392505050565b61069082825a611ffc565b5f6001600160a01b0383163b61157057505f6106de565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa9250505080156115da575060408051601f3d908101601f191682019092526115d7918101906137dc565b60015b156106de579392505050565b604080516080810182525f808252602082015260609181018290528082018290525f61012d8161161c60a0870160808801612b9b565b6001600160a01b03908116825260208201929092526040015f208054909250600160401b900416156118fd576040805160808101825282546001600160401b0381168252600160401b90046001600160a01b0316602082015260018301805491928492908401919061168d90613742565b80601f01602080910402602001604051908101604052809291908181526020018280546116b990613742565b80156117045780601f106116db57610100808354040283529160200191611704565b820191905f5260205f20905b8154815290600101906020018083116116e757829003601f168201915b5050505050815260200160028201805461171d90613742565b80601f016020809104026020016040519081016040528092919081815260200182805461174990613742565b80156117945780601f1061176b57610100808354040283529160200191611794565b820191905f5260205f20905b81548152906001019060200180831161177757829003601f168201915b50505050508152505091505f5b6117ae60c0860186613307565b90508110156118f7576117c760a0860160808701612b9b565b6001600160a01b03166342842e0e33306117e460c08a018a613307565b868181106117f4576117f461334c565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015611848575f5ffd5b505af115801561185a573d5f5f3e3d5ffd5b5061186f9250505060a0860160808701612b9b565b6001600160a01b03166342966c6861188a60c0880188613307565b8481811061189a5761189a61334c565b905060200201356040518263ffffffff1660e01b81526004016118bf91815260200190565b5f604051808303815f87803b1580156118d6575f5ffd5b505af11580156118e8573d5f5f3e3d5ffd5b505050508060010190506117a1565b50611a3d565b6040518060800160405280466001600160401b0316815260200185608001602081019061192a9190612b9b565b6001600160a01b0316815260200161195061194b60a0880160808901612b9b565b61203f565b815260200161196d61196860a0880160808901612b9b565b6120f1565b905291505f5b61198060c0860186613307565b9050811015611a3b5761199960a0860160808701612b9b565b6001600160a01b03166342842e0e33306119b660c08a018a613307565b868181106119c6576119c661334c565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015611a1a575f5ffd5b505af1158015611a2c573d5f5f3e3d5ffd5b50505050806001019050611973565b505b5030637f07c9478233611a566060880160408901612b9b565b611a6360c0890189613307565b604051602001611a779594939291906137f7565b60408051601f1981840301815290829052611a9491602401613888565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509150915091565b5f516020613ff95f395f51905f52546001600160a01b031690565b610c4f611d3b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611b1e5761125583612137565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b78575060408051601f3d908101601f19168201909252611b759181019061389a565b60015b611bdb5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bca565b5f516020613ff95f395f51905f528114611c495760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bca565b506112558383836121d2565b5f611c6084846121fc565b905081158015611c7757506001600160a01b038116155b15610c6157604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610bca565b611cbb60c954610100900460ff1660021490565b611cd85760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6106905b6033546001600160a01b03163314610c7a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bca565b606580546001600160a01b0319169055610c4f8161229e565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611ddf81600161113f565b6001600160a01b0316336001600160a01b031614611e1057604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e709190613774565b91505f611e9183604001516109f06b195c98cdcc8c57dd985d5b1d60a21b90565b9050806001600160a01b031683602001516001600160a01b031614611ec957604051632583296b60e01b815260040160405180910390fd5b505090565b6001600160a01b0381161580611eec57506001600160a01b03811630145b15610c4f57604051635b50f3f960e01b815260040160405180910390fd5b611f1e60c954610100900460ff1660021490565b15611f3c5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611d2d565b806001600160a01b038116611fa35760405163538ba4f960e01b815260040160405180910390fd5b611fac836122ef565b6112558261234d565b80516001600160401b03165f90815261012e60209081526040808320828501516001600160a01b0390811685529252909120541680611ff7576106de826123bd565b919050565b815f0361200857505050565b61202283838360405180602001604052805f815250612598565b61125557604051634c67134d60e11b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169161208591906138b1565b5f60405180830381855afa9150503d805f81146120bd576040519150601f19603f3d011682016040523d82523d5f602084013e6120c2565b606091505b5091509150816120e05760405180602001604052805f8152506120e9565b6120e9816125d5565b949350505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169161208591906138b1565b6001600160a01b0381163b6121a45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bca565b5f516020613ff95f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6121db83612742565b5f825111806121e75750805b15611255576121f68383612781565b50505050565b6097545f906001600160a01b03168061222857604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa15801561227a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e991906138cc565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166123155760405162461bcd60e51b8152600401610bca906138e7565b61231d6127a6565b61233b6001600160a01b038216156123355781611d95565b33611d95565b5060c9805461ff001916610100179055565b5f54610100900460ff166123735760405162461bcd60e51b8152600401610bca906138e7565b6001600160401b0346111561239b5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f6123d16033546001600160a01b031690565b609754602085015185516040808801516060890151915161240296956001600160a01b031694939290602401613932565b60408051601f198184030181529190526020810180516001600160e01b03166377c6257360e11b17905290506124496d627269646765645f65726337323160901b5f61113f565b81604051612456906128dd565b612461929190613993565b604051809103905ff08015801561247a573d5f5f3e3d5ffd5b506001600160a01b038082165f90815261012d60209081526040918290208751815492890151909416600160401b026001600160e01b03199092166001600160401b0390941693909317178255850151919350849160018201906124de9082613a01565b50606082015160028201906124f39082613a01565b505083516001600160401b039081165f90815261012e6020908152604080832082890180516001600160a01b039081168652919093529281902080546001600160a01b03191688851690811790915591518851828a015160608b01519351949750919094169493909316927f44977f2d30fe1e3aee2c1476f2f95aaacaf34e44b9359c403da01fcc93fd751b9261258a9290613abb565b60405180910390a450919050565b5f6001600160a01b0385166125c057604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b606060408251106125f457818060200190518101906106de9190613adf565b815160200361272f575f5b60208160ff161080156126345750828160ff16815181106126225761262261334c565b01602001516001600160f81b03191615155b1561264b578061264381613b10565b9150506125ff565b5f8160ff166001600160401b0381111561266757612667612c21565b6040519080825280601f01601f191660200182016040528015612691576020820181803683370190505b5090505f91505b60208260ff161080156126cd5750838260ff16815181106126bb576126bb61334c565b01602001516001600160f81b03191615155b15610c6157838260ff16815181106126e7576126e761334c565b602001015160f81c60f81b818360ff16815181106127075761270761334c565b60200101906001600160f81b03191690815f1a9053508161272781613b10565b925050612698565b505060408051602081019091525f815290565b61274b81612137565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610c618383604051806060016040528060278152602001614019602791396127cc565b5f54610100900460ff16610c7a5760405162461bcd60e51b8152600401610bca906138e7565b60605f5f856001600160a01b0316856040516127e891906138b1565b5f60405180830381855af49150503d805f8114612820576040519150601f19603f3d011682016040523d82523d5f602084013e612825565b606091505b509150915061283686838387612840565b9695505050505050565b606083156128ae5782515f036128a7576001600160a01b0385163b6128a75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bca565b50816120e9565b6120e983838151156128c35781518083602001fd5b8060405162461bcd60e51b8152600401610bca9190613888565b6104ca80613b2f83390190565b5f5f604083850312156128fb575f5ffd5b82356001600160401b03811115612910575f5ffd5b83016101608186031215612922575f5ffd5b946020939093013593505050565b5f60208284031215612940575f5ffd5b81356001600160e01b031981168114610c61575f5ffd5b6001600160a01b0381168114610c4f575f5ffd5b8035611ff781612957565b5f5f83601f840112612986575f5ffd5b5081356001600160401b0381111561299c575f5ffd5b6020830191508360208285010111156129b3575f5ffd5b9250929050565b5f5f5f5f5f608086880312156129ce575f5ffd5b85356129d981612957565b945060208601356129e981612957565b93506040860135925060608601356001600160401b03811115612a0a575f5ffd5b612a1688828901612976565b969995985093965092949392505050565b5f60208284031215612a37575f5ffd5b81356001600160401b03811115612a4c575f5ffd5b82016101008185031215610c61575f5ffd5b5f5b83811015612a78578181015183820152602001612a60565b50505f910152565b5f8151808452612a97816020860160208601612a5e565b601f01601f19169290920160200192915050565b60208152612ac56020820183516001600160401b03169052565b5f6020830151612ae060408401826001600160401b03169052565b50604083015163ffffffff811660608401525060608301516001600160a01b03811660808401525060808301516001600160401b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160401b03811660e08401525060e08301516001600160a01b038116610100840152506101008301516001600160a01b03811661012084015250610120830151610140830152610140830151610160808401526120e9610180840182612a80565b5f60208284031215612bab575f5ffd5b8135610c6181612957565b6001600160401b0381168114610c4f575f5ffd5b8035611ff781612bb6565b8015158114610c4f575f5ffd5b5f5f5f60608486031215612bf4575f5ffd5b8335612bff81612bb6565b9250602084013591506040840135612c1681612bd5565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612c5757612c57612c21565b60405290565b60405161010081016001600160401b0381118282101715612c5757612c57612c21565b60405161016081016001600160401b0381118282101715612c5757612c57612c21565b604051601f8201601f191681016001600160401b0381118282101715612ccb57612ccb612c21565b604052919050565b5f6001600160401b03821115612ceb57612ceb612c21565b50601f01601f191660200190565b5f82601f830112612d08575f5ffd5b8135602083015f612d20612d1b84612cd3565b612ca3565b9050828152858383011115612d33575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f60408385031215612d5e575f5ffd5b8235612d6981612957565b915060208301356001600160401b03811115612d83575f5ffd5b612d8f85828601612cf9565b9150509250929050565b5f5f60408385031215612daa575f5ffd5b823591506020830135612dbc81612957565b809150509250929050565b5f5f60208385031215612dd8575f5ffd5b82356001600160401b03811115612ded575f5ffd5b612df985828601612976565b90969095509350505050565b6001600160401b03851681526001600160a01b03841660208201526080604082018190525f90612e3790830185612a80565b8281036060840152612e498185612a80565b979650505050505050565b5f5f60408385031215612e65575f5ffd5b823591506020830135612dbc81612bd5565b5f5f60408385031215612e88575f5ffd5b8235612e9381612957565b91506020830135612dbc81612957565b5f5f8335601e19843603018112612eb8575f5ffd5b8301803591506001600160401b03821115612ed1575f5ffd5b6020019150368190038213156129b3575f5ffd5b5f5f85851115612ef3575f5ffd5b83861115612eff575f5ffd5b5050820193919092039150565b5f60208284031215612f1c575f5ffd5b81356001600160401b03811115612f31575f5ffd5b6120e984828501612cf9565b8051611ff781612bb6565b8051611ff781612957565b5f82601f830112612f62575f5ffd5b8151602083015f612f75612d1b84612cd3565b9050828152858383011115612f88575f5ffd5b612f96836020830184612a5e565b95945050505050565b5f6001600160401b03821115612fb757612fb7612c21565b5060051b60200190565b5f82601f830112612fd0575f5ffd5b8151612fde612d1b82612f9f565b8082825260208201915060208360051b860101925085831115612fff575f5ffd5b602085015b8381101561301c578051835260209283019201613004565b5095945050505050565b5f5f5f5f60808587031215613039575f5ffd5b84516001600160401b0381111561304e575f5ffd5b85016080818803121561305f575f5ffd5b613067612c35565b815161307281612bb6565b8152602082015161308281612957565b602082015260408201516001600160401b0381111561309f575f5ffd5b6130ab89828501612f53565b60408301525060608201516001600160401b038111156130c9575f5ffd5b6130d589828501612f53565b60608301525094506130eb905060208601612f48565b92506130f960408601612f48565b915060608501516001600160401b03811115613113575f5ffd5b61311f87828801612fc1565b91505092959194509250565b5f8151808452602084019350602083015f5b8281101561315b57815186526020958601959091019060010161313d565b5093949350505050565b6001600160a01b038581168252841660208201526080604082018190525f906131909083018561312b565b8281036060840152612e49818561312b565b63ffffffff81168114610c4f575f5ffd5b8035611ff7816131a2565b5f82601f8301126131cd575f5ffd5b81356131db612d1b82612f9f565b8082825260208201915060208360051b8601019250858311156131fc575f5ffd5b602085015b8381101561301c578035835260209283019201613201565b5f610100823603121561322a575f5ffd5b613232612c5d565b61323b83612bca565b81526132496020840161296b565b602082015261325a6040840161296b565b604082015261326b60608401612bca565b606082015261327c6080840161296b565b608082015261328d60a084016131b3565b60a082015260c08301356001600160401b038111156132aa575f5ffd5b6132b6368286016131be565b60c08301525060e08301356001600160401b038111156132d4575f5ffd5b6132e0368286016131be565b60e08301525092915050565b5f602082840312156132fc575f5ffd5b8135610c6181612bb6565b5f5f8335601e1984360301811261331c575f5ffd5b8301803591506001600160401b03821115613335575f5ffd5b6020019150600581901b36038213156129b3575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613370575f5ffd5b8135610c61816131a2565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106de576106de61337b565b8051611ff7816131a2565b5f5f604083850312156133be575f5ffd5b825160208401519092506001600160401b038111156133db575f5ffd5b830161016081860312156133ed575f5ffd5b6133f5612c80565b6133fe82612f3d565b815261340c60208301612f3d565b602082015261341d604083016133a2565b604082015261342e60608301612f48565b606082015261343f60808301612f3d565b608082015261345060a08301612f48565b60a082015261346160c08301612f3d565b60c082015261347260e08301612f48565b60e08201526134846101008301612f48565b61010082015261012082810151908201526101408201516001600160401b038111156134ae575f5ffd5b6134ba87828501612f53565b6101408301525080925050509250929050565b8183525f6001600160fb1b038311156134e4575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160401b03881681526001600160a01b0387811660208301528616604082015260a0606082018190525f9061353890830186886134cd565b828103608084015261354b8185876134cd565b9a9950505050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b5f5f5f5f60808587031215613604575f5ffd5b84356001600160401b03811115613619575f5ffd5b85016080818803121561362a575f5ffd5b613632612c35565b813561363d81612bb6565b8152602082013561364d81612957565b602082015260408201356001600160401b0381111561366a575f5ffd5b61367689828501612cf9565b60408301525060608201356001600160401b03811115613694575f5ffd5b6136a089828501612cf9565b60608301525094506136b690506020860161296b565b92506136c46040860161296b565b915060608501356001600160401b038111156136de575f5ffd5b61311f878288016131be565b6001600160401b03861681526001600160a01b0385811660208301528416604082015260a0606082018190525f906137249083018561312b565b8281036080840152613736818561312b565b98975050505050505050565b600181811c9082168061375657607f821691505b602082108103610b6457634e487b7160e01b5f52602260045260245ffd5b5f6060828403128015613785575f5ffd5b50604051606081016001600160401b03811182821017156137a8576137a8612c21565b6040528251815260208301516137bd81612957565b602082015260408301516137d081612bb6565b60408201529392505050565b5f602082840312156137ec575f5ffd5b8151610c6181612bd5565b608081526001600160401b03865116608082015260018060a01b0360208701511660a08201525f6040870151608060c0840152613838610100840182612a80565b90506060880151607f198483030160e08501526138558282612a80565b6001600160a01b0389811660208701528816604086015291506138759050565b82810360608401526137368185876134cd565b602081525f610c616020830184612a80565b5f602082840312156138aa575f5ffd5b5051919050565b5f82516138c2818460208701612a5e565b9190910192915050565b5f602082840312156138dc575f5ffd5b8151610c6181612957565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0387811682528681166020830152851660408201526001600160401b038416606082015260c0608082018190525f9061397490830185612a80565b82810360a08401526139868185612a80565b9998505050505050505050565b6001600160a01b03831681526040602082018190525f90610c5e90830184612a80565b601f82111561125557805f5260205f20601f840160051c810160208510156139db5750805b601f840160051c820191505b818110156139fa575f81556001016139e7565b5050505050565b81516001600160401b03811115613a1a57613a1a612c21565b613a2e81613a288454613742565b846139b6565b6020601f821160018114613a60575f8315613a495750848201515b5f19600385901b1c1916600184901b1784556139fa565b5f84815260208120601f198516915b82811015613a8f5787850151825560209485019460019092019101613a6f565b5084821015613aac57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b604081525f613acd6040830185612a80565b8281036020840152612f968185612a80565b5f60208284031215613aef575f5ffd5b81516001600160401b03811115613b04575f5ffd5b6120e984828501612f53565b5f60ff821660ff8103613b2557613b2561337b565b6001019291505056fe60806040526040516104ca3803806104ca833981016040819052610022916102d2565b61002d82825f610034565b50506103ed565b61003d8361005f565b5f825111806100495750805b1561005a57610058838361009e565b505b505050565b610068816100ca565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606100c383836040518060600160405280602781526020016104a36027913961017d565b9392505050565b6001600160a01b0381163b61013c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f856001600160a01b03168560405161019991906103a0565b5f60405180830381855af49150503d805f81146101d1576040519150601f19603f3d011682016040523d82523d5f602084013e6101d6565b606091505b5090925090506101e8868383876101f2565b9695505050505050565b606083156102605782515f03610259576001600160a01b0385163b6102595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610133565b508161026a565b61026a8383610272565b949350505050565b8151156102825781518083602001fd5b8060405162461bcd60e51b815260040161013391906103bb565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102ca5781810151838201526020016102b2565b50505f910152565b5f5f604083850312156102e3575f5ffd5b82516001600160a01b03811681146102f9575f5ffd5b60208401519092506001600160401b03811115610314575f5ffd5b8301601f81018513610324575f5ffd5b80516001600160401b0381111561033d5761033d61029c565b604051601f8201601f19908116603f011681016001600160401b038111828210171561036b5761036b61029c565b604052818152828201602001871015610382575f5ffd5b6103938260208301602086016102b0565b8093505050509250929050565b5f82516103b18184602087016102b0565b9190910192915050565b602081525f82518060208401526103d98160408501602087016102b0565b601f01601f19169190910160400192915050565b60aa806103f95f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055e523a48576516437df6fcf2810806cc0aeefb1755d2891dc02a161b66f632464736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000003": { - "contractName": "ERC721Vault", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000003" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000004": { - "contractName": "ERC1155VaultImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x608060405260043610610195575f3560e01c8063715018a6116100e7578063a86f9d9e11610087578063e30c397811610062578063e30c3978146104a4578063f09a4016146104c1578063f23a6e61146104e0578063f2fde38b1461050c575f5ffd5b8063a86f9d9e14610401578063bc197c8114610420578063e07baba614610467575f5ffd5b80638456cb59116100c25780638456cb591461038d5780638abf6077146103a15780638da5cb5b146103b55780639aa8605c146103d2575f5ffd5b8063715018a61461035257806379ba5097146103665780637f07c9471461037a575f5ffd5b80633ab76e9f116101525780634f1ef2861161012d5780634f1ef286146102cb57806352d1902d146102de5780635c975abb146102f257806367090ccf14610312575f5ffd5b80633ab76e9f146102615780633eb6b8cf146102985780633f4ba83a146102b7575f5ffd5b80630178733a1461019957806301ffc9a7146101ae57806306fdde03146101e25780631f59a8301461020e5780633075db561461022e5780633659cfe614610242575b5f5ffd5b6101ac6101a7366004612861565b61052b565b005b3480156101b9575f5ffd5b506101cd6101c83660046128a7565b6106a1565b60405190151581526020015b60405180910390f35b3480156101ed575f5ffd5b506c195c98cc4c4d4d57dd985d5b1d609a1b5b6040519081526020016101d9565b61022161021c3660046128ce565b6106c0565b6040516101d99190612952565b348015610239575f5ffd5b506101cd610b47565b34801561024d575f5ffd5b506101ac61025c366004612a61565b610b5f565b34801561026c575f5ffd5b50609754610280906001600160a01b031681565b6040516001600160a01b0390911681526020016101d9565b3480156102a3575f5ffd5b506102806102b2366004612aa8565b610c2f565b3480156102c2575f5ffd5b506101ac610c45565b6101ac6102d9366004612c13565b610c59565b3480156102e9575f5ffd5b50610200610d0e565b3480156102fd575f5ffd5b506101cd60c954610100900460ff1660021490565b34801561031d575f5ffd5b5061028061032c366004612c5f565b61012e60209081525f92835260408084209091529082529020546001600160a01b031681565b34801561035d575f5ffd5b506101ac610dbf565b348015610371575f5ffd5b506101ac610dd0565b6101ac610388366004612cd1565b610e47565b348015610398575f5ffd5b506101ac610f73565b3480156103ac575f5ffd5b50610280610f86565b3480156103c0575f5ffd5b506033546001600160a01b0316610280565b3480156103dd575f5ffd5b506103f16103ec366004612a61565b610f94565b6040516101d99493929190612d0f565b34801561040c575f5ffd5b5061028061041b366004612d5e565b6110df565b34801561042b575f5ffd5b5061044e61043a366004612dc1565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b031990911681526020016101d9565b348015610472575f5ffd5b5060c95461048c906201000090046001600160401b031681565b6040516001600160401b0390911681526020016101d9565b3480156104af575f5ffd5b506065546001600160a01b0316610280565b3480156104cc575f5ffd5b506101ac6104db366004612e81565b6110eb565b3480156104eb575f5ffd5b5061044e6104fa366004612ead565b63f23a6e6160e01b9695505050505050565b348015610517575f5ffd5b506101ac610526366004612a61565b611202565b61053f60c954610100900460ff1660021490565b1561055d5760405163bae6e2a960e01b815260040160405180910390fd5b600261056b60c95460ff1690565b60ff160361058c5760405163dfc60d8560e01b815260040160405180910390fd5b6105966002611273565b61059e611289565b505f6105ae610140840184612f23565b6105bc916004908290612f65565b8101906105c99190612f8c565b90505f5f5f838060200190518101906105e291906130a6565b94509450505092505f610609848860a00160208101906106029190612a61565b858561137f565b905061063361012088013561062460c08a0160a08b01612a61565b6001600160a01b03169061146f565b61064360c0880160a08901612a61565b6001600160a01b0316867fe48bef18455e47bca14864ab6e82dffa29df148b051c09de95aec44ecf13598c8660200151848787604051610686949392919061320e565b60405180910390a3505050505061069d6001611273565b5050565b5f6106ab8261147a565b806106ba57506106ba826114c9565b92915050565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915261072e60c954610100900460ff1660021490565b1561074c5760405163bae6e2a960e01b815260040160405180910390fd5b610755826132c2565b8060e00151518160c00151511461077f5760405163196e8a4160e31b815260040160405180910390fd5b60808101516001600160a01b03166107aa576040516303f8a7d360e01b815260040160405180910390fd5b60026107b860c95460ff1690565b60ff16036107d95760405163dfc60d8560e01b815260040160405180910390fd5b6107e36002611273565b6107f36080840160608501613395565b6001600160401b031634101561081c57604051630178ce0b60e31b815260040160405180910390fd5b5f5b61082b60e08501856133b0565b905081101561087f5761084160e08501856133b0565b82818110610851576108516133f5565b905060200201355f0361087757604051634299323b60e11b815260040160405180910390fd5b60010161081e565b506108aa636cdb3d1360e11b61089b60a0860160808701612a61565b6001600160a01b0316906114fd565b6108c757604051633ee915f560e11b815260040160405180910390fd5b5f5f6108d28561158a565b6040805161016081019091525f808252929450909250602081016108fc6080890160608a01613395565b6001600160401b0316815260200161091a60c0890160a08a01613409565b63ffffffff1681525f6020808301829052604083019190915233606083015260809091019061094b90890189613395565b6001600160401b031681526020015f6001600160a01b03168860200160208101906109769190612a61565b6001600160a01b03160361098a573361099a565b61099a6040890160208a01612a61565b6001600160a01b031681526020908101906109d3906109bb908a018a613395565b6c195c98cc4c4d4d57dd985d5b1d609a1b5b5f610c2f565b6001600160a01b031681526020016109f16080890160608a01613395565b610a04906001600160401b031634613438565b815260200184905290505f610a226562726964676560d01b826110df565b6001600160a01b0316631bdb003734846040518363ffffffff1660e01b8152600401610a4e9190612952565b5f6040518083038185885af1158015610a69573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052610a919190810190613456565b96509050610aa56060880160408901612a61565b6001600160a01b03168660a001516001600160a01b0316827fabbf62a1459339f9ac59136d313a5ccd83d2706cc6d4c04d90642520169144dc8960c0015187602001518c6080016020810190610afb9190612a61565b610b0860c08f018f6133b0565b8f8060e00190610b1891906133b0565b604051610b2b97969594939291906135a6565b60405180910390a450505050610b416001611273565b50919050565b5f6002610b5660c95460ff1690565b60ff1614905090565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000004163003610bb05760405162461bcd60e51b8152600401610ba790613602565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000046001600160a01b0316610be2611a4a565b6001600160a01b031614610c085760405162461bcd60e51b8152600401610ba79061364e565b610c1181611a65565b604080515f80825260208201909252610c2c91839190611a6d565b50565b5f610c3b848484611bd7565b90505b9392505050565b610c4d611c29565b610c57335f611cb9565b565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000004163003610ca15760405162461bcd60e51b8152600401610ba790613602565b7f00000000000000000000000001670000000000000000000000000000000000046001600160a01b0316610cd3611a4a565b6001600160a01b031614610cf95760405162461bcd60e51b8152600401610ba79061364e565b610d0282611a65565b61069d82826001611a6d565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000000041614610dad5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610ba7565b505f5160206141d45f395f51905f5290565b610dc7611cbd565b610c575f611d17565b60655433906001600160a01b03168114610e3e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610ba7565b610c2c81611d17565b610e5b60c954610100900460ff1660021490565b15610e795760405163bae6e2a960e01b815260040160405180910390fd5b6002610e8760c95460ff1690565b60ff1603610ea85760405163dfc60d8560e01b815260040160405180910390fd5b610eb26002611273565b5f80808080610ec38688018861369a565b945094509450945094505f610ed6611d30565b9050610ee184611e51565b5f610eee8786868661137f565b9050610f036001600160a01b0386163461146f565b846001600160a01b0316866001600160a01b0316835f01517f895f73e418d1bbbad2a311d085fad00e5d98a960e9f2afa4b942071d39bec43a85604001518b60200151868a8a604051610f5a9594939291906137bb565b60405180910390a45050505050505061069d6001611273565b610f7b611e8d565b610c57336001611cb9565b5f610f8f611a4a565b905090565b61012d6020525f9081526040902080546001820180546001600160401b03831693600160401b9093046001600160a01b0316929190610fd290613813565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe90613813565b80156110495780601f1061102057610100808354040283529160200191611049565b820191905f5260205f20905b81548152906001019060200180831161102c57829003601f168201915b50505050509080600201805461105e90613813565b80601f016020809104026020016040519081016040528092919081815260200182805461108a90613813565b80156110d55780601f106110ac576101008083540402835291602001916110d5565b820191905f5260205f20905b8154815290600101906020018083116110b857829003601f168201915b5050505050905084565b5f610c3e468484611bd7565b5f54610100900460ff161580801561110957505f54600160ff909116105b806111225750303b15801561112257505f5460ff166001145b6111855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610ba7565b5f805460ff1916600117905580156111a6575f805461ff0019166101001790555b6111b08383611efe565b6111b8611f38565b80156111fd575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61120a611cbd565b606580546001600160a01b0383166001600160a01b0319909116811790915561123b6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b6112ba8160016110df565b6001600160a01b0316336001600160a01b0316146112eb57604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611327573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134b9190613845565b60208101519092506001600160a01b0316331461137b57604051632583296b60e01b815260040160405180910390fd5b5090565b5f46855f01516001600160401b0316036113fd57506020840151604051631759616b60e11b81526001600160a01b03821690632eb2c2d6906113cb9030908890889088906004016138ad565b5f604051808303815f87803b1580156113e2575f5ffd5b505af11580156113f4573d5f5f3e3d5ffd5b50505050611467565b61140685611f5e565b60405163d81d0a1560e01b81529091506001600160a01b0382169063d81d0a159061143990879087908790600401613906565b5f604051808303815f87803b158015611450575f5ffd5b505af1158015611462573d5f5f3e3d5ffd5b505050505b949350505050565b61069d82825a611fa5565b5f6001600160e01b0319821662bc399d60e11b14806114a957506001600160e01b03198216637f07c94760e01b145b806106ba57506001600160e01b031982166301ffc9a760e01b1492915050565b5f6001600160e01b03198216630271189760e51b14806106ba57506301ffc9a760e01b6001600160e01b03198316146106ba565b5f6001600160a01b0383163b61151457505f6106ba565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa92505050801561157e575060408051601f3d908101601f1916820190925261157b9181019061393b565b60015b156106ba579392505050565b604080516080810182525f808252602082015260609181018290528082018290525f61012d816115c060a0870160808801612a61565b6001600160a01b03908116825260208201929092526040015f208054909250600160401b900416156118b3576040805160808101825282546001600160401b0381168252600160401b90046001600160a01b0316602082015260018301805491928492908401919061163190613813565b80601f016020809104026020016040519081016040528092919081815260200182805461165d90613813565b80156116a85780601f1061167f576101008083540402835291602001916116a8565b820191905f5260205f20905b81548152906001019060200180831161168b57829003601f168201915b505050505081526020016002820180546116c190613813565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed90613813565b80156117385780601f1061170f57610100808354040283529160200191611738565b820191905f5260205f20905b81548152906001019060200180831161171b57829003601f168201915b50505050508152505091508360800160208101906117569190612a61565b6001600160a01b0316632eb2c2d6333061177360c08901896133b0565b61178060e08b018b6133b0565b6040518763ffffffff1660e01b81526004016117a196959493929190613956565b5f604051808303815f87803b1580156117b8575f5ffd5b505af11580156117ca573d5f5f3e3d5ffd5b505050505f5b6117dd60c08601866133b0565b90508110156118ad576117f660a0860160808701612a61565b6001600160a01b031663b390c0ab61181160c08801886133b0565b84818110611821576118216133f5565b90506020020135878060e0019061183891906133b0565b85818110611848576118486133f5565b905060200201356040518363ffffffff1660e01b8152600401611875929190918252602082015260400190565b5f604051808303815f87803b15801561188c575f5ffd5b505af115801561189e573d5f5f3e3d5ffd5b505050508060010190506117d0565b506119b0565b6040518060800160405280466001600160401b031681526020018560800160208101906118e09190612a61565b6001600160a01b0316815260200161190661190160a0880160808901612a61565b611fe8565b815260200161192361191e60a0880160808901612a61565b612092565b9052915061193760a0850160808601612a61565b6001600160a01b0316632eb2c2d6333061195460c08901896133b0565b61196160e08b018b6133b0565b6040518763ffffffff1660e01b815260040161198296959493929190613956565b5f604051808303815f87803b158015611999575f5ffd5b505af11580156119ab573d5f5f3e3d5ffd5b505050505b5030637f07c94782336119c96060880160408901612a61565b6119d660c08901896133b0565b6119e360e08b018b6133b0565b6040516020016119f997969594939291906139b3565b60408051601f1981840301815290829052611a1691602401613a63565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509150915091565b5f5160206141d45f395f51905f52546001600160a01b031690565b610c2c611cbd565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611aa0576111fd836120d8565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611afa575060408051601f3d908101601f19168201909252611af791810190613a75565b60015b611b5d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610ba7565b5f5160206141d45f395f51905f528114611bcb5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610ba7565b506111fd838383612173565b5f611be2848461219d565b905081158015611bf957506001600160a01b038116155b15610c3e57604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610ba7565b611c3d60c954610100900460ff1660021490565b611c5a5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61069d5b6033546001600160a01b03163314610c575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba7565b606580546001600160a01b0319169055610c2c8161223f565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611d618160016110df565b6001600160a01b0316336001600160a01b031614611d9257604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611dce573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611df29190613845565b91505f611e1483604001516109cd6c195c98cc4c4d4d57dd985d5b1d609a1b90565b9050806001600160a01b031683602001516001600160a01b031614611e4c57604051632583296b60e01b815260040160405180910390fd5b505090565b6001600160a01b0381161580611e6f57506001600160a01b03811630145b15610c2c57604051635b50f3f960e01b815260040160405180910390fd5b611ea160c954610100900460ff1660021490565b15611ebf5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611caf565b806001600160a01b038116611f265760405163538ba4f960e01b815260040160405180910390fd5b611f2f83612290565b6111fd826122ee565b5f54610100900460ff16610c575760405162461bcd60e51b8152600401610ba790613a8c565b80516001600160401b03165f90815261012e60209081526040808320828501516001600160a01b0390811685529252909120541680611fa0576106ba8261235e565b919050565b815f03611fb157505050565b611fcb83838360405180602001604052805f81525061253a565b6111fd57604051634c67134d60e11b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169161202e9190613ad7565b5f60405180830381855afa9150503d805f8114612066576040519150601f19603f3d011682016040523d82523d5f602084013e61206b565b606091505b5091509150816120895760405180602001604052805f815250611467565b61146781612577565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169161202e9190613ad7565b6001600160a01b0381163b6121455760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610ba7565b5f5160206141d45f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b61217c836126e4565b5f825111806121885750805b156111fd576121978383612723565b50505050565b6097545f906001600160a01b0316806121c957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa15801561221b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114679190613af2565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166122b65760405162461bcd60e51b8152600401610ba790613a8c565b6122be611f38565b6122dc6001600160a01b038216156122d65781611d17565b33611d17565b5060c9805461ff001916610100179055565b5f54610100900460ff166123145760405162461bcd60e51b8152600401610ba790613a8c565b6001600160401b0346111561233c5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f6123726033546001600160a01b031690565b60975460208501518551604080880151606089015191516123a396956001600160a01b031694939290602401613b0d565b60408051601f198184030181529190526020810180516001600160e01b03166377c6257360e11b17905290506123eb6e627269646765645f6572633131353560881b5f6110df565b816040516123f890612854565b612403929190613b6e565b604051809103905ff08015801561241c573d5f5f3e3d5ffd5b506001600160a01b038082165f90815261012d60209081526040918290208751815492890151909416600160401b026001600160e01b03199092166001600160401b0390941693909317178255850151919350849160018201906124809082613bdc565b50606082015160028201906124959082613bdc565b505083516001600160401b039081165f90815261012e6020908152604080832082890180516001600160a01b039081168652919093529281902080546001600160a01b03191688851690811790915591518851828a015160608b01519351949750919094169493909316927f44977f2d30fe1e3aee2c1476f2f95aaacaf34e44b9359c403da01fcc93fd751b9261252c9290613c96565b60405180910390a450919050565b5f6001600160a01b03851661256257604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b6060604082511061259657818060200190518101906106ba9190613cba565b81516020036126d1575f5b60208160ff161080156125d65750828160ff16815181106125c4576125c46133f5565b01602001516001600160f81b03191615155b156125ed57806125e581613ceb565b9150506125a1565b5f8160ff166001600160401b0381111561260957612609612ae7565b6040519080825280601f01601f191660200182016040528015612633576020820181803683370190505b5090505f91505b60208260ff1610801561266f5750838260ff168151811061265d5761265d6133f5565b01602001516001600160f81b03191615155b15610c3e57838260ff1681518110612689576126896133f5565b602001015160f81c60f81b818360ff16815181106126a9576126a96133f5565b60200101906001600160f81b03191690815f1a905350816126c981613ceb565b92505061263a565b505060408051602081019091525f815290565b6126ed816120d8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610c3e83836040518060600160405280602781526020016141f46027913960605f5f856001600160a01b03168560405161275f9190613ad7565b5f60405180830381855af49150503d805f8114612797576040519150601f19603f3d011682016040523d82523d5f602084013e61279c565b606091505b50915091506127ad868383876127b7565b9695505050505050565b606083156128255782515f0361281e576001600160a01b0385163b61281e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ba7565b5081611467565b611467838381511561283a5781518083602001fd5b8060405162461bcd60e51b8152600401610ba79190613a63565b6104ca80613d0a83390190565b5f5f60408385031215612872575f5ffd5b82356001600160401b03811115612887575f5ffd5b83016101608186031215612899575f5ffd5b946020939093013593505050565b5f602082840312156128b7575f5ffd5b81356001600160e01b031981168114610c3e575f5ffd5b5f602082840312156128de575f5ffd5b81356001600160401b038111156128f3575f5ffd5b82016101008185031215610c3e575f5ffd5b5f5b8381101561291f578181015183820152602001612907565b50505f910152565b5f815180845261293e816020860160208601612905565b601f01601f19169290920160200192915050565b6020815261296c6020820183516001600160401b03169052565b5f602083015161298760408401826001600160401b03169052565b50604083015163ffffffff811660608401525060608301516001600160a01b03811660808401525060808301516001600160401b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160401b03811660e08401525060e08301516001600160a01b038116610100840152506101008301516001600160a01b0381166101208401525061012083015161014083015261014083015161016080840152611467610180840182612927565b6001600160a01b0381168114610c2c575f5ffd5b8035611fa081612a42565b5f60208284031215612a71575f5ffd5b8135610c3e81612a42565b6001600160401b0381168114610c2c575f5ffd5b8035611fa081612a7c565b8015158114610c2c575f5ffd5b5f5f5f60608486031215612aba575f5ffd5b8335612ac581612a7c565b9250602084013591506040840135612adc81612a9b565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612b1d57612b1d612ae7565b60405290565b60405161010081016001600160401b0381118282101715612b1d57612b1d612ae7565b60405161016081016001600160401b0381118282101715612b1d57612b1d612ae7565b604051601f8201601f191681016001600160401b0381118282101715612b9157612b91612ae7565b604052919050565b5f6001600160401b03821115612bb157612bb1612ae7565b50601f01601f191660200190565b5f82601f830112612bce575f5ffd5b8135602083015f612be6612be184612b99565b612b69565b9050828152858383011115612bf9575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f60408385031215612c24575f5ffd5b8235612c2f81612a42565b915060208301356001600160401b03811115612c49575f5ffd5b612c5585828601612bbf565b9150509250929050565b5f5f60408385031215612c70575f5ffd5b823591506020830135612c8281612a42565b809150509250929050565b5f5f83601f840112612c9d575f5ffd5b5081356001600160401b03811115612cb3575f5ffd5b602083019150836020828501011115612cca575f5ffd5b9250929050565b5f5f60208385031215612ce2575f5ffd5b82356001600160401b03811115612cf7575f5ffd5b612d0385828601612c8d565b90969095509350505050565b6001600160401b03851681526001600160a01b03841660208201526080604082018190525f90612d4190830185612927565b8281036060840152612d538185612927565b979650505050505050565b5f5f60408385031215612d6f575f5ffd5b823591506020830135612c8281612a9b565b5f5f83601f840112612d91575f5ffd5b5081356001600160401b03811115612da7575f5ffd5b6020830191508360208260051b8501011115612cca575f5ffd5b5f5f5f5f5f5f5f5f60a0898b031215612dd8575f5ffd5b8835612de381612a42565b97506020890135612df381612a42565b965060408901356001600160401b03811115612e0d575f5ffd5b612e198b828c01612d81565b90975095505060608901356001600160401b03811115612e37575f5ffd5b612e438b828c01612d81565b90955093505060808901356001600160401b03811115612e61575f5ffd5b612e6d8b828c01612c8d565b999c989b5096995094979396929594505050565b5f5f60408385031215612e92575f5ffd5b8235612e9d81612a42565b91506020830135612c8281612a42565b5f5f5f5f5f5f60a08789031215612ec2575f5ffd5b8635612ecd81612a42565b95506020870135612edd81612a42565b9450604087013593506060870135925060808701356001600160401b03811115612f05575f5ffd5b612f1189828a01612c8d565b979a9699509497509295939492505050565b5f5f8335601e19843603018112612f38575f5ffd5b8301803591506001600160401b03821115612f51575f5ffd5b602001915036819003821315612cca575f5ffd5b5f5f85851115612f73575f5ffd5b83861115612f7f575f5ffd5b5050820193919092039150565b5f60208284031215612f9c575f5ffd5b81356001600160401b03811115612fb1575f5ffd5b61146784828501612bbf565b8051611fa081612a7c565b8051611fa081612a42565b5f82601f830112612fe2575f5ffd5b8151602083015f612ff5612be184612b99565b9050828152858383011115613008575f5ffd5b613016836020830184612905565b95945050505050565b5f6001600160401b0382111561303757613037612ae7565b5060051b60200190565b5f82601f830112613050575f5ffd5b815161305e612be18261301f565b8082825260208201915060208360051b86010192508583111561307f575f5ffd5b602085015b8381101561309c578051835260209283019201613084565b5095945050505050565b5f5f5f5f5f60a086880312156130ba575f5ffd5b85516001600160401b038111156130cf575f5ffd5b8601608081890312156130e0575f5ffd5b6130e8612afb565b81516130f381612a7c565b8152602082015161310381612a42565b602082015260408201516001600160401b03811115613120575f5ffd5b61312c8a828501612fd3565b60408301525060608201516001600160401b0381111561314a575f5ffd5b6131568a828501612fd3565b606083015250955061316c905060208701612fc8565b935061317a60408701612fc8565b925060608601516001600160401b03811115613194575f5ffd5b6131a088828901613041565b92505060808601516001600160401b038111156131bb575f5ffd5b6131c788828901613041565b9150509295509295909350565b5f8151808452602084019350602083015f5b828110156132045781518652602095860195909101906001016131e6565b5093949350505050565b6001600160a01b038581168252841660208201526080604082018190525f90613239908301856131d4565b8281036060840152612d5381856131d4565b63ffffffff81168114610c2c575f5ffd5b8035611fa08161324b565b5f82601f830112613276575f5ffd5b8135613284612be18261301f565b8082825260208201915060208360051b8601019250858311156132a5575f5ffd5b602085015b8381101561309c5780358352602092830192016132aa565b5f61010082360312156132d3575f5ffd5b6132db612b23565b6132e483612a90565b81526132f260208401612a56565b602082015261330360408401612a56565b604082015261331460608401612a90565b606082015261332560808401612a56565b608082015261333660a0840161325c565b60a082015260c08301356001600160401b03811115613353575f5ffd5b61335f36828601613267565b60c08301525060e08301356001600160401b0381111561337d575f5ffd5b61338936828601613267565b60e08301525092915050565b5f602082840312156133a5575f5ffd5b8135610c3e81612a7c565b5f5f8335601e198436030181126133c5575f5ffd5b8301803591506001600160401b038211156133de575f5ffd5b6020019150600581901b3603821315612cca575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613419575f5ffd5b8135610c3e8161324b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106ba576106ba613424565b8051611fa08161324b565b5f5f60408385031215613467575f5ffd5b825160208401519092506001600160401b03811115613484575f5ffd5b83016101608186031215613496575f5ffd5b61349e612b46565b6134a782612fbd565b81526134b560208301612fbd565b60208201526134c66040830161344b565b60408201526134d760608301612fc8565b60608201526134e860808301612fbd565b60808201526134f960a08301612fc8565b60a082015261350a60c08301612fbd565b60c082015261351b60e08301612fc8565b60e082015261352d6101008301612fc8565b61010082015261012082810151908201526101408201516001600160401b03811115613557575f5ffd5b61356387828501612fd3565b6101408301525080925050509250929050565b8183525f6001600160fb1b0383111561358d575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160401b03881681526001600160a01b0387811660208301528616604082015260a0606082018190525f906135e19083018688613576565b82810360808401526135f4818587613576565b9a9950505050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b5f5f5f5f5f60a086880312156136ae575f5ffd5b85356001600160401b038111156136c3575f5ffd5b8601608081890312156136d4575f5ffd5b6136dc612afb565b81356136e781612a7c565b815260208201356136f781612a42565b602082015260408201356001600160401b03811115613714575f5ffd5b6137208a828501612bbf565b60408301525060608201356001600160401b0381111561373e575f5ffd5b61374a8a828501612bbf565b6060830152509550613760905060208701612a56565b935061376e60408701612a56565b925060608601356001600160401b03811115613788575f5ffd5b61379488828901613267565b92505060808601356001600160401b038111156137af575f5ffd5b6131c788828901613267565b6001600160401b03861681526001600160a01b0385811660208301528416604082015260a0606082018190525f906137f5908301856131d4565b828103608084015261380781856131d4565b98975050505050505050565b600181811c9082168061382757607f821691505b602082108103610b4157634e487b7160e01b5f52602260045260245ffd5b5f6060828403128015613856575f5ffd5b50604051606081016001600160401b038111828210171561387957613879612ae7565b60405282518152602083015161388e81612a42565b602082015260408301516138a181612a7c565b60408201529392505050565b6001600160a01b0385811682528416602082015260a0604082018190525f906138d8908301856131d4565b82810360608401526138ea81856131d4565b83810360809094019390935250505f8152602001949350505050565b6001600160a01b03841681526060602082018190525f90613929908301856131d4565b82810360408401526127ad81856131d4565b5f6020828403121561394b575f5ffd5b8151610c3e81612a9b565b6001600160a01b0387811682528616602082015260a0604082018190525f906139829083018688613576565b8281036060840152613995818587613576565b83810360809094019390935250505f81526020019695505050505050565b60a080825288516001600160401b03169082015260208801516001600160a01b031660c08201526040880151608060e08301525f906139f6610120840182612927565b905060608a0151609f1984830301610100850152613a148282612927565b915050613a2c602084018a6001600160a01b03169052565b6001600160a01b03881660408401528281036060840152613a4e818789613576565b905082810360808401526135f4818587613576565b602081525f610c3e6020830184612927565b5f60208284031215613a85575f5ffd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251613ae8818460208701612905565b9190910192915050565b5f60208284031215613b02575f5ffd5b8151610c3e81612a42565b6001600160a01b0387811682528681166020830152851660408201526001600160401b038416606082015260c0608082018190525f90613b4f90830185612927565b82810360a0840152613b618185612927565b9998505050505050505050565b6001600160a01b03831681526040602082018190525f90610c3b90830184612927565b601f8211156111fd57805f5260205f20601f840160051c81016020851015613bb65750805b601f840160051c820191505b81811015613bd5575f8155600101613bc2565b5050505050565b81516001600160401b03811115613bf557613bf5612ae7565b613c0981613c038454613813565b84613b91565b6020601f821160018114613c3b575f8315613c245750848201515b5f19600385901b1c1916600184901b178455613bd5565b5f84815260208120601f198516915b82811015613c6a5787850151825560209485019460019092019101613c4a565b5084821015613c8757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b604081525f613ca86040830185612927565b82810360208401526130168185612927565b5f60208284031215613cca575f5ffd5b81516001600160401b03811115613cdf575f5ffd5b61146784828501612fd3565b5f60ff821660ff8103613d0057613d00613424565b6001019291505056fe60806040526040516104ca3803806104ca833981016040819052610022916102d2565b61002d82825f610034565b50506103ed565b61003d8361005f565b5f825111806100495750805b1561005a57610058838361009e565b505b505050565b610068816100ca565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606100c383836040518060600160405280602781526020016104a36027913961017d565b9392505050565b6001600160a01b0381163b61013c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f856001600160a01b03168560405161019991906103a0565b5f60405180830381855af49150503d805f81146101d1576040519150601f19603f3d011682016040523d82523d5f602084013e6101d6565b606091505b5090925090506101e8868383876101f2565b9695505050505050565b606083156102605782515f03610259576001600160a01b0385163b6102595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610133565b508161026a565b61026a8383610272565b949350505050565b8151156102825781518083602001fd5b8060405162461bcd60e51b815260040161013391906103bb565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102ca5781810151838201526020016102b2565b50505f910152565b5f5f604083850312156102e3575f5ffd5b82516001600160a01b03811681146102f9575f5ffd5b60208401519092506001600160401b03811115610314575f5ffd5b8301601f81018513610324575f5ffd5b80516001600160401b0381111561033d5761033d61029c565b604051601f8201601f19908116603f011681016001600160401b038111828210171561036b5761036b61029c565b604052818152828201602001871015610382575f5ffd5b6103938260208301602086016102b0565b8093505050509250929050565b5f82516103b18184602087016102b0565b9190910192915050565b602081525f82518060208401526103d98160408501602087016102b0565b601f01601f19169190910160400192915050565b60aa806103f95f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e67f8ea00e362cad72cd2e8e61f89b237848f76dd2a93bc34c0064a232f8158c64736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000004": { - "contractName": "ERC1155Vault", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000004" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010096": { - "contractName": "BridgedERC20", - "storage": {}, - "code": "0x608060405260043610610233575f3560e01c806370a0823111610129578063a77f1516116100a8578063dd62ed3e1161006d578063dd62ed3e14610684578063e07baba6146106a3578063e30c3978146106e0578063f12506c1146106fd578063f2fde38b14610711575f5ffd5b8063a77f1516146105e7578063a86f9d9e14610608578063a9059cbb14610627578063b8f2e0c514610646578063bb86ef9314610665575f5ffd5b80638456cb59116100ee5780638456cb591461056f5780638abf6077146105835780638da5cb5b1461059757806395d89b41146105b4578063a457c2d7146105c8575f5ffd5b806370a08231146104d3578063715018a61461050757806379ba50971461051b5780637cf8ed0d1461052f5780637e4746341461054f575f5ffd5b806339509351116101b557806342966c681161017a57806342966c681461045757806349d12605146104765780634f1ef2861461048c57806352d1902d1461049f5780635c975abb146104b3575f5ffd5b806339509351146103af5780633ab76e9f146103ce5780633eb6b8cf146104055780633f4ba83a1461042457806340c10f1914610438575f5ffd5b806323b872dd116101fb57806323b872dd146102ea57806326afaadd146103095780633075db561461034d578063313ce567146103615780633659cfe61461038e575f5ffd5b806301ffc9a71461023757806306fdde031461026b578063095ea7b31461028c5780630ae74548146102ab57806318160ddd146102cc575b5f5ffd5b348015610242575f5ffd5b5061025661025136600461218c565b610730565b60405190151581526020015b60405180910390f35b348015610276575f5ffd5b5061027f6107d2565b60405161026291906121d5565b348015610297575f5ffd5b506102566102a636600461221b565b610862565b3480156102b6575f5ffd5b5061012f5461025690600160a01b900460ff1681565b3480156102d7575f5ffd5b5060fd545b604051908152602001610262565b3480156102f5575f5ffd5b50610256610304366004612245565b610879565b348015610314575f5ffd5b5061032e61012d5461012e546001600160a01b0390911691565b604080516001600160a01b039093168352602083019190915201610262565b348015610358575f5ffd5b5061025661089e565b34801561036c575f5ffd5b5061012d54600160a01b900460ff165b60405160ff9091168152602001610262565b348015610399575f5ffd5b506103ad6103a8366004612283565b6108b6565b005b3480156103ba575f5ffd5b506102566103c936600461221b565b610986565b3480156103d9575f5ffd5b506097546103ed906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b348015610410575f5ffd5b506103ed61041f3660046122b2565b6109a7565b34801561042f575f5ffd5b506103ad6109bb565b348015610443575f5ffd5b506103ad61045236600461221b565b6109cf565b348015610462575f5ffd5b506103ad6104713660046122f8565b610ae9565b348015610481575f5ffd5b506102dc61012e5481565b6103ad61049a366004612323565b610c26565b3480156104aa575f5ffd5b506102dc610cdb565b3480156104be575f5ffd5b5061025660c954610100900460ff1660021490565b3480156104de575f5ffd5b506102dc6104ed366004612283565b6001600160a01b03165f90815260fb602052604090205490565b348015610512575f5ffd5b506103ad610d8c565b348015610526575f5ffd5b506103ad610d9d565b34801561053a575f5ffd5b5061012d546103ed906001600160a01b031681565b34801561055a575f5ffd5b5061012f546103ed906001600160a01b031681565b34801561057a575f5ffd5b506103ad610e14565b34801561058e575f5ffd5b506103ed610e27565b3480156105a2575f5ffd5b506033546001600160a01b03166103ed565b3480156105bf575f5ffd5b5061027f610e35565b3480156105d3575f5ffd5b506102566105e236600461221b565b610e44565b3480156105f2575f5ffd5b5061012d5461037c90600160a01b900460ff1681565b348015610613575f5ffd5b506103ed6106223660046123e6565b610ec9565b348015610632575f5ffd5b5061025661064136600461221b565b610ed5565b348015610651575f5ffd5b506103ad610660366004612410565b610ee2565b348015610670575f5ffd5b506103ad61067f36600461247e565b61105f565b34801561068f575f5ffd5b506102dc61069e366004612544565b61121f565b3480156106ae575f5ffd5b5060c9546106c8906201000090046001600160401b031681565b6040516001600160401b039091168152602001610262565b3480156106eb575f5ffd5b506065546001600160a01b03166103ed565b348015610708575f5ffd5b50610256611249565b34801561071c575f5ffd5b506103ad61072b366004612283565b611274565b5f6001600160e01b0319821663093e326b60e21b148061076057506001600160e01b0319821663bb86ef9360e01b145b8061077b57506001600160e01b0319821663b8f2e0c560e01b145b8061079657506001600160e01b031982166336372b0760e01b145b806107b157506001600160e01b0319821663a219a02560e01b145b806107cc57506001600160e01b031982166301ffc9a760e01b145b92915050565b606060fe80546107e19061257b565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061257b565b80156108585780601f1061082f57610100808354040283529160200191610858565b820191905f5260205f20905b81548152906001019060200180831161083b57829003601f168201915b5050505050905090565b5f3361086f8185856112e5565b5060019392505050565b5f33610886858285611408565b610891858585611480565b60019150505b9392505050565b5f60026108ad60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100961630036109075760405162461bcd60e51b81526004016108fe906125b3565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000100966001600160a01b0316610939611634565b6001600160a01b03161461095f5760405162461bcd60e51b81526004016108fe906125ff565b6109688161164f565b604080515f8082526020820190925261098391839190611657565b50565b5f3361086f818585610998838361121f565b6109a2919061264b565b6112e5565b5f6109b38484846117c1565b949350505050565b6109c3611813565b6109cd335f6118a3565b565b6109e360c954610100900460ff1660021490565b15610a015760405163bae6e2a960e01b815260040160405180910390fd5b6002610a0f60c95460ff1690565b60ff1603610a305760405163dfc60d8560e01b815260040160405180910390fd5b610a3a60026118ab565b610a42611249565b15610a605760405163270bf77560e01b815260040160405180910390fd5b61012f546001600160a01b031633819003610ac757826001600160a01b0316816001600160a01b03167fe502aa3e015149f4b76a0b2b5394e3100903c4af27c3ddc98385395d3f55252684604051610aba91815260200190565b60405180910390a3610ad0565b610ad0336118c1565b610ada838361193d565b50610ae560016118ab565b5050565b610afd60c954610100900460ff1660021490565b15610b1b5760405163bae6e2a960e01b815260040160405180910390fd5b6002610b2960c95460ff1690565b60ff1603610b4a5760405163dfc60d8560e01b815260040160405180910390fd5b610b5460026118ab565b610b5c611249565b15610c095761012f546040518281526001600160a01b0390911690339082907f638edf84937fb2534b47cac985ea84d6ea4f4076315b56ea1c784d26b87e2bcb9060200160405180910390a36040516340c10f1960e01b8152336004820152602481018390526001600160a01b038216906340c10f19906044015f604051808303815f87803b158015610bed575f5ffd5b505af1158015610bff573d5f5f3e3d5ffd5b5050505050610c12565b610c12336118c1565b610c1c3382611a07565b61098360016118ab565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000010096163003610c6e5760405162461bcd60e51b81526004016108fe906125b3565b7f00000000000000000000000001670000000000000000000000000000000100966001600160a01b0316610ca0611634565b6001600160a01b031614610cc65760405162461bcd60e51b81526004016108fe906125ff565b610ccf8261164f565b610ae582826001611657565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000100961614610d7a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108fe565b505f5160206128085f395f51905f5290565b610d94611b44565b6109cd5f611b9e565b60655433906001600160a01b03168114610e0b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016108fe565b61098381611b9e565b610e1c611bb7565b6109cd3360016118a3565b5f610e30611634565b905090565b606060ff80546107e19061257b565b5f3381610e51828661121f565b905083811015610eb15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108fe565b610ebe82868684036112e5565b506001949350505050565b5f6108974684846117c1565b5f3361086f818585611480565b610ef660c954610100900460ff1660021490565b15610f145760405163bae6e2a960e01b815260040160405180910390fd5b6a195c98cc8c17dd985d5b1d60aa1b610f2e816001610ec9565b6001600160a01b0316336001600160a01b031614610f5f57604051630d85cccf60e11b815260040160405180910390fd5b6002610f6d60c95460ff1690565b60ff1603610f8e5760405163dfc60d8560e01b815260040160405180910390fd5b610f9860026118ab565b61012f546001600160a01b038481169116148015610fc9575061012f60149054906101000a900460ff161515821515145b15610fe75760405163c118d2f360e01b815260040160405180910390fd5b61012f80546001600160a01b0385166001600160a81b03199091168117600160a01b851515908102919091179092556040805191825260208201929092527fa6b6f959792843a48d9d03d13595f2de7c86ae0ce12ef0fa759dd911b205e565910160405180910390a161105a60016118ab565b505050565b5f54610100900460ff161580801561107d57505f54600160ff909116105b806110965750303b15801561109657505f5460ff166001145b6110f95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108fe565b5f805460ff19166001179055801561111a575f805461ff0019166101001790555b6111248888611c28565b61112e8a8a611c64565b61119f83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284375f92019190915250611c9e92505050565b61012d805461012e89905560ff8816600160a01b026001600160a81b03199091166001600160a01b038b16171790558015611213575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b039182165f90815260fc6020908152604080832093909416825291909152205490565b61012f545f906001600160a01b031615801590610e3057505061012f54600160a01b900460ff161590565b61127c611b44565b606580546001600160a01b0383166001600160a01b031990911681179091556112ad6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0383166113475760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fe565b6001600160a01b0382166113a85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fe565b6001600160a01b038381165f81815260fc602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f611413848461121f565b90505f19811461147a578181101561146d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fe565b61147a84848484036112e5565b50505050565b6001600160a01b0383166114e45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fe565b6001600160a01b0382166115465760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fe565b611551838383611cce565b6001600160a01b0383165f90815260fb6020526040902054818110156115c85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fe565b6001600160a01b038085165f81815260fb602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116279086815260200190565b60405180910390a361147a565b5f5160206128085f395f51905f52546001600160a01b031690565b610983611b44565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561168a5761105a83611d09565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156116e4575060408051601f3d908101601f191682019092526116e19181019061266a565b60015b6117475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108fe565b5f5160206128085f395f51905f5281146117b55760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108fe565b5061105a838383611da4565b5f6117cc8484611dc8565b9050811580156117e357506001600160a01b038116155b1561089757604051632b0d65db60e01b81526001600160401b0385166004820152602481018490526044016108fe565b61182760c954610100900460ff1660021490565b6118445760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610ae5611b44565b60c9805460ff191660ff92909216919091179055565b6a195c98cc8c17dd985d5b1d60aa1b6118e26033546001600160a01b031690565b6001600160a01b0316336001600160a01b03161415801561191f5750611909816001610ec9565b6001600160a01b0316336001600160a01b031614155b15610ae557604051630d85cccf60e11b815260040160405180910390fd5b6001600160a01b0382166119935760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fe565b61199e5f8383611cce565b8060fd5f8282546119af919061264b565b90915550506001600160a01b0382165f81815260fb60209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216611a675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108fe565b611a72825f83611cce565b6001600160a01b0382165f90815260fb602052604090205481811015611ae55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108fe565b6001600160a01b0383165f81815260fb60209081526040808320868603905560fd80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6033546001600160a01b031633146109cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108fe565b606580546001600160a01b031916905561098381611e6a565b611bcb60c954610100900460ff1660021490565b15611be95760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611899565b6001600160a01b0382161580611c3c575080155b80611c4657504681145b15610ae55760405163c118d2f360e01b815260040160405180910390fd5b806001600160a01b038116611c8c5760405163538ba4f960e01b815260040160405180910390fd5b611c9583611ebb565b61105a82611f19565b5f54610100900460ff16611cc45760405162461bcd60e51b81526004016108fe90612681565b610ae58282611f89565b611ce260c954610100900460ff1660021490565b15611d005760405163bae6e2a960e01b815260040160405180910390fd5b61105a82611fc8565b6001600160a01b0381163b611d765760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108fe565b5f5160206128085f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611dad83611ff1565b5f82511180611db95750805b1561105a5761147a8383612030565b6097545f906001600160a01b031680611df457604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611e46573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b391906126cc565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16611ee15760405162461bcd60e51b81526004016108fe90612681565b611ee9612055565b611f076001600160a01b03821615611f015781611b9e565b33611b9e565b5060c9805461ff001916610100179055565b5f54610100900460ff16611f3f5760405162461bcd60e51b81526004016108fe90612681565b6001600160401b03461115611f675760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f54610100900460ff16611faf5760405162461bcd60e51b81526004016108fe90612681565b60fe611fbb8382612732565b5060ff61105a8282612732565b306001600160a01b0382160361098357604051630c292c9d60e21b815260040160405180910390fd5b611ffa81611d09565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061089783836040518060600160405280602781526020016128286027913961207b565b5f54610100900460ff166109cd5760405162461bcd60e51b81526004016108fe90612681565b60605f5f856001600160a01b03168560405161209791906127ec565b5f60405180830381855af49150503d805f81146120cf576040519150601f19603f3d011682016040523d82523d5f602084013e6120d4565b606091505b50915091506120e5868383876120ef565b9695505050505050565b6060831561215d5782515f03612156576001600160a01b0385163b6121565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108fe565b50816109b3565b6109b383838151156121725781518083602001fd5b8060405162461bcd60e51b81526004016108fe91906121d5565b5f6020828403121561219c575f5ffd5b81356001600160e01b031981168114610897575f5ffd5b5f5b838110156121cd5781810151838201526020016121b5565b50505f910152565b602081525f82518060208401526121f38160408501602087016121b3565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610983575f5ffd5b5f5f6040838503121561222c575f5ffd5b823561223781612207565b946020939093013593505050565b5f5f5f60608486031215612257575f5ffd5b833561226281612207565b9250602084013561227281612207565b929592945050506040919091013590565b5f60208284031215612293575f5ffd5b813561089781612207565b803580151581146122ad575f5ffd5b919050565b5f5f5f606084860312156122c4575f5ffd5b83356001600160401b03811681146122da575f5ffd5b9250602084013591506122ef6040850161229e565b90509250925092565b5f60208284031215612308575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612334575f5ffd5b823561233f81612207565b915060208301356001600160401b03811115612359575f5ffd5b8301601f81018513612369575f5ffd5b80356001600160401b038111156123825761238261230f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156123b0576123b061230f565b6040528181528282016020018710156123c7575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f604083850312156123f7575f5ffd5b823591506124076020840161229e565b90509250929050565b5f5f60408385031215612421575f5ffd5b823561242c81612207565b91506124076020840161229e565b5f5f83601f84011261244a575f5ffd5b5081356001600160401b03811115612460575f5ffd5b602083019150836020828501011115612477575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60e08a8c031215612496575f5ffd5b89356124a181612207565b985060208a01356124b181612207565b975060408a01356124c181612207565b965060608a0135955060808a013560ff811681146124dd575f5ffd5b945060a08a01356001600160401b038111156124f7575f5ffd5b6125038c828d0161243a565b90955093505060c08a01356001600160401b03811115612521575f5ffd5b61252d8c828d0161243a565b915080935050809150509295985092959850929598565b5f5f60408385031215612555575f5ffd5b823561256081612207565b9150602083013561257081612207565b809150509250929050565b600181811c9082168061258f57607f821691505b6020821081036125ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b808201808211156107cc57634e487b7160e01b5f52601160045260245ffd5b5f6020828403121561267a575f5ffd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f602082840312156126dc575f5ffd5b815161089781612207565b601f82111561105a57805f5260205f20601f840160051c8101602085101561270c5750805b601f840160051c820191505b8181101561272b575f8155600101612718565b5050505050565b81516001600160401b0381111561274b5761274b61230f565b61275f81612759845461257b565b846126e7565b6020601f821160018114612791575f831561277a5750848201515b5f19600385901b1c1916600184901b17845561272b565b5f84815260208120601f198516915b828110156127c057878501518255602094850194600190920191016127a0565b50848210156127dd57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82516127fd8184602087016121b3565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206de11e098828560ed8b32ec4c49b5259fec7bac640db1effdfd9fcc5e0efa77b64736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010097": { - "contractName": "BridgedERC721", - "storage": {}, - "code": "0x608060405260043610610207575f3560e01c80636352211e11610113578063a22cb4651161009d578063e07baba61161006d578063e07baba6146105c3578063e30c397814610600578063e985e9c51461061d578063ef8c4ae614610665578063f2fde38b14610684575f5ffd5b8063a22cb46514610547578063a86f9d9e14610566578063b88d4fde14610585578063c87b56dd146105a4575f5ffd5b80637cf8ed0d116100e35780637cf8ed0d146104ce5780638456cb59146104ee5780638abf6077146105025780638da5cb5b1461051657806395d89b4114610533575f5ffd5b80636352211e1461046857806370a0823114610487578063715018a6146104a657806379ba5097146104ba575f5ffd5b80633eb6b8cf1161019457806342966c681161016457806342966c68146103de57806349d12605146103fd5780634f1ef2861461042157806352d1902d146104345780635c975abb14610448575f5ffd5b80633eb6b8cf1461036d5780633f4ba83a1461038c57806340c10f19146103a057806342842e0e146103bf575f5ffd5b806323b872dd116101da57806323b872dd146102b857806326afaadd146102d75780633075db561461031b5780633659cfe61461032f5780633ab76e9f1461034e575f5ffd5b806301ffc9a71461020b57806306fdde031461023f578063081812fc14610260578063095ea7b314610297575b5f5ffd5b348015610216575f5ffd5b5061022a61022536600461253b565b6106a3565b60405190151581526020015b60405180910390f35b34801561024a575f5ffd5b506102536106e8565b60405161023691906125a3565b34801561026b575f5ffd5b5061027f61027a3660046125b5565b610779565b6040516001600160a01b039091168152602001610236565b3480156102a2575f5ffd5b506102b66102b13660046125e0565b61079f565b005b3480156102c3575f5ffd5b506102b66102d236600461260a565b6108b8565b3480156102e2575f5ffd5b506102fc61015f54610160546001600160a01b0390911691565b604080516001600160a01b039093168352602083019190915201610236565b348015610326575f5ffd5b5061022a6108e9565b34801561033a575f5ffd5b506102b6610349366004612648565b610901565b348015610359575f5ffd5b5060975461027f906001600160a01b031681565b348015610378575f5ffd5b5061027f610387366004612677565b6109c8565b348015610397575f5ffd5b506102b66109de565b3480156103ab575f5ffd5b506102b66103ba3660046125e0565b6109f2565b3480156103ca575f5ffd5b506102b66103d936600461260a565b610abd565b3480156103e9575f5ffd5b506102b66103f83660046125b5565b610ad7565b348015610408575f5ffd5b506104136101605481565b604051908152602001610236565b6102b661042f36600461275a565b610bd6565b34801561043f575f5ffd5b50610413610c8b565b348015610453575f5ffd5b5061022a60c954610100900460ff1660021490565b348015610473575f5ffd5b5061027f6104823660046125b5565b610d3c565b348015610492575f5ffd5b506104136104a1366004612648565b610d9c565b3480156104b1575f5ffd5b506102b6610e21565b3480156104c5575f5ffd5b506102b6610e32565b3480156104d9575f5ffd5b5061015f5461027f906001600160a01b031681565b3480156104f9575f5ffd5b506102b6610ea9565b34801561050d575f5ffd5b5061027f610ebc565b348015610521575f5ffd5b506033546001600160a01b031661027f565b34801561053e575f5ffd5b50610253610eca565b348015610552575f5ffd5b506102b66105613660046127a6565b610eda565b348015610571575f5ffd5b5061027f6105803660046127d9565b610ee5565b348015610590575f5ffd5b506102b661059f3660046127fa565b610ef1565b3480156105af575f5ffd5b506102536105be3660046125b5565b610f29565b3480156105ce575f5ffd5b5060c9546105e8906201000090046001600160401b031681565b6040516001600160401b039091168152602001610236565b34801561060b575f5ffd5b506065546001600160a01b031661027f565b348015610628575f5ffd5b5061022a610637366004612861565b6001600160a01b039182165f9081526101326020908152604080832093909416825291909152205460ff1690565b348015610670575f5ffd5b506102b661067f3660046128dc565b610f52565b34801561068f575f5ffd5b506102b661069e366004612648565b611104565b5f6001600160e01b0319821663093e326b60e21b14806106d357506001600160e01b031982166377c6257360e11b145b806106e257506106e282611175565b92915050565b606061012d80546106f890612989565b80601f016020809104026020016040519081016040528092919081815260200182805461072490612989565b801561076f5780601f106107465761010080835404028352916020019161076f565b820191905f5260205f20905b81548152906001019060200180831161075257829003601f168201915b5050505050905090565b5f610783826111c4565b505f90815261013160205260409020546001600160a01b031690565b5f6107a982610d3c565b9050806001600160a01b0316836001600160a01b03160361081b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061083757506108378133610637565b6108a95760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610812565b6108b38383611223565b505050565b6108c23382611291565b6108de5760405162461bcd60e51b8152600401610812906129c1565b6108b383838361130f565b5f60026108f860c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100971630036109495760405162461bcd60e51b815260040161081290612a0e565b7f00000000000000000000000001670000000000000000000000000000000100976001600160a01b031661097b611481565b6001600160a01b0316146109a15760405162461bcd60e51b815260040161081290612a5a565b6109aa8161149c565b604080515f808252602082019092526109c5918391906114a4565b50565b5f6109d484848461160e565b90505b9392505050565b6109e6611660565b6109f0335f6116f0565b565b610a0660c954610100900460ff1660021490565b15610a245760405163bae6e2a960e01b815260040160405180910390fd5b6b195c98cdcc8c57dd985d5b1d60a21b610a3f816001610ee5565b6001600160a01b0316336001600160a01b031614610a7057604051630d85cccf60e11b815260040160405180910390fd5b6002610a7e60c95460ff1690565b60ff1603610a9f5760405163dfc60d8560e01b815260040160405180910390fd5b610aa960026116f8565b610ab3838361170e565b6108b360016116f8565b6108b383838360405180602001604052805f815250610ef1565b610aeb60c954610100900460ff1660021490565b15610b095760405163bae6e2a960e01b815260040160405180910390fd5b6b195c98cdcc8c57dd985d5b1d60a21b610b24816001610ee5565b6001600160a01b0316336001600160a01b031614610b5557604051630d85cccf60e11b815260040160405180910390fd5b6002610b6360c95460ff1690565b60ff1603610b845760405163dfc60d8560e01b815260040160405180910390fd5b610b8e60026116f8565b33610b9883610d3c565b6001600160a01b031614610bbf5760405163358bf3d960e01b815260040160405180910390fd5b610bc882611727565b610bd260016116f8565b5050565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000010097163003610c1e5760405162461bcd60e51b815260040161081290612a0e565b7f00000000000000000000000001670000000000000000000000000000000100976001600160a01b0316610c50611481565b6001600160a01b031614610c765760405162461bcd60e51b815260040161081290612a5a565b610c7f8261149c565b610bd2828260016114a4565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000100971614610d2a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610812565b505f516020612e175f395f51905f5290565b5f81815261012f60205260408120546001600160a01b0316806106e25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610812565b5f6001600160a01b038216610e055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610812565b506001600160a01b03165f908152610130602052604090205490565b610e296117c9565b6109f05f611823565b60655433906001600160a01b03168114610ea05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610812565b6109c581611823565b610eb161183c565b6109f03360016116f0565b5f610ec5611481565b905090565b606061012e80546106f890612989565b610bd23383836118ad565b5f6109d746848461160e565b610efb3383611291565b610f175760405162461bcd60e51b8152600401610812906129c1565b610f238484848461197b565b50505050565b61015f54610160546060916106e2916001600160a01b0390911690610f4d856119ae565b611a3d565b5f54610100900460ff1615808015610f7057505f54600160ff909116105b80610f895750303b158015610f8957505f5460ff166001145b610fec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610812565b5f805460ff19166001179055801561100d575f805461ff0019166101001790555b6110178787611a87565b6110218989611ac3565b61109283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284375f92019190915250611afd92505050565b61015f80546001600160a01b0319166001600160a01b03891617905561016086905580156110f9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b61110c6117c9565b606580546001600160a01b0383166001600160a01b0319909116811790915561113d6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b031982166380ac58cd60e01b14806111a557506001600160e01b03198216635b5e139f60e01b145b806106e257506301ffc9a760e01b6001600160e01b03198316146106e2565b5f81815261012f60205260409020546001600160a01b03166109c55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610812565b5f8181526101316020526040902080546001600160a01b0319166001600160a01b038416908117909155819061125882610d3c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f5f61129c83610d3c565b9050806001600160a01b0316846001600160a01b031614806112e357506001600160a01b038082165f908152610132602090815260408083209388168352929052205460ff165b806113075750836001600160a01b03166112fc84610779565b6001600160a01b0316145b949350505050565b826001600160a01b031661132282610d3c565b6001600160a01b0316146113485760405162461bcd60e51b815260040161081290612aa6565b6001600160a01b0382166113aa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610812565b6113b78383836001611b2d565b826001600160a01b03166113ca82610d3c565b6001600160a01b0316146113f05760405162461bcd60e51b815260040161081290612aa6565b5f8181526101316020908152604080832080546001600160a01b03199081169091556001600160a01b03878116808652610130855283862080545f190190559087168086528386208054600101905586865261012f90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f516020612e175f395f51905f52546001600160a01b031690565b6109c56117c9565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156114d7576108b383611b6d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611531575060408051601f3d908101601f1916820190925261152e91810190612aeb565b60015b6115945760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610812565b5f516020612e175f395f51905f5281146116025760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610812565b506108b3838383611c08565b5f6116198484611c2c565b90508115801561163057506001600160a01b038116155b156109d757604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610812565b61167460c954610100900460ff1660021490565b6116915760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610bd26117c9565b60c9805460ff191660ff92909216919091179055565b610bd2828260405180602001604052805f815250611cce565b5f61173182610d3c565b9050611740815f846001611b2d565b61174982610d3c565b5f8381526101316020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552610130845282852080545f1901905587855261012f909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6033546001600160a01b031633146109f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610812565b606580546001600160a01b03191690556109c581611d00565b61185060c954610100900460ff1660021490565b1561186e5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016116e6565b816001600160a01b0316836001600160a01b03160361190e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610812565b6001600160a01b038381165f8181526101326020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61198684848461130f565b61199284848484611d51565b610f235760405162461bcd60e51b815260040161081290612b02565b60605f6119ba83611e4e565b60010190505f816001600160401b038111156119d8576119d86126bd565b6040519080825280601f01601f191660200182016040528015611a02576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611a0c57509392505050565b6060611a53846001600160a01b03166014611f25565b611a5c846119ae565b83604051602001611a6f93929190612b54565b60405160208183030381529060405290509392505050565b6001600160a01b0382161580611a9b575080155b80611aa557504681145b15610bd25760405163c118d2f360e01b815260040160405180910390fd5b806001600160a01b038116611aeb5760405163538ba4f960e01b815260040160405180910390fd5b611af4836120ba565b6108b382612118565b5f54610100900460ff16611b235760405162461bcd60e51b815260040161081290612bdc565b610bd28282612188565b611b4160c954610100900460ff1660021490565b15611b5f5760405163bae6e2a960e01b815260040160405180910390fd5b611b68836121c9565b610f23565b6001600160a01b0381163b611bda5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610812565b5f516020612e175f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611c11836121f2565b5f82511180611c1d5750805b156108b357610f238383612231565b6097545f906001600160a01b031680611c5857604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611caa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113079190612c27565b611cd88383612256565b611ce45f848484611d51565b6108b35760405162461bcd60e51b815260040161081290612b02565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160a01b0384163b15611e4357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d94903390899088908890600401612c42565b6020604051808303815f875af1925050508015611dce575060408051601f3d908101601f19168201909252611dcb91810190612c74565b60015b611e29573d808015611dfb576040519150601f19603f3d011682016040523d82523d5f602084013e611e00565b606091505b5080515f03611e215760405162461bcd60e51b815260040161081290612b02565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611307565b506001949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e8c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611eb8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ed657662386f26fc10000830492506010015b6305f5e1008310611eee576305f5e100830492506008015b6127108310611f0257612710830492506004015b60648310611f14576064830492506002015b600a83106106e25760010192915050565b60605f611f33836002612ca3565b611f3e906002612cba565b6001600160401b03811115611f5557611f556126bd565b6040519080825280601f01601f191660200182016040528015611f7f576020820181803683370190505b509050600360fc1b815f81518110611f9957611f99612ccd565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110611fc757611fc7612ccd565b60200101906001600160f81b03191690815f1a9053505f611fe9846002612ca3565b611ff4906001612cba565b90505b600181111561206b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061202857612028612ccd565b1a60f81b82828151811061203e5761203e612ccd565b60200101906001600160f81b03191690815f1a90535060049490941c9361206481612ce1565b9050611ff7565b5083156109d75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610812565b5f54610100900460ff166120e05760405162461bcd60e51b815260040161081290612bdc565b6120e86123ef565b6121066001600160a01b038216156121005781611823565b33611823565b5060c9805461ff001916610100179055565b5f54610100900460ff1661213e5760405162461bcd60e51b815260040161081290612bdc565b6001600160401b034611156121665760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f54610100900460ff166121ae5760405162461bcd60e51b815260040161081290612bdc565b61012d6121bb8382612d41565b5061012e6108b38282612d41565b306001600160a01b038216036109c557604051630c292c9d60e21b815260040160405180910390fd5b6121fb81611b6d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606109d78383604051806060016040528060278152602001612e3760279139612415565b6001600160a01b0382166122ac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610812565b5f81815261012f60205260409020546001600160a01b0316156123115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610812565b61231e5f83836001611b2d565b5f81815261012f60205260409020546001600160a01b0316156123835760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610812565b6001600160a01b0382165f818152610130602090815260408083208054600101905584835261012f90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f54610100900460ff166109f05760405162461bcd60e51b815260040161081290612bdc565b60605f5f856001600160a01b0316856040516124319190612dfb565b5f60405180830381855af49150503d805f8114612469576040519150601f19603f3d011682016040523d82523d5f602084013e61246e565b606091505b509150915061247f86838387612489565b9695505050505050565b606083156124f75782515f036124f0576001600160a01b0385163b6124f05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610812565b5081611307565b611307838381511561250c5781518083602001fd5b8060405162461bcd60e51b815260040161081291906125a3565b6001600160e01b0319811681146109c5575f5ffd5b5f6020828403121561254b575f5ffd5b81356109d781612526565b5f5b83811015612570578181015183820152602001612558565b50505f910152565b5f815180845261258f816020860160208601612556565b601f01601f19169290920160200192915050565b602081525f6109d76020830184612578565b5f602082840312156125c5575f5ffd5b5035919050565b6001600160a01b03811681146109c5575f5ffd5b5f5f604083850312156125f1575f5ffd5b82356125fc816125cc565b946020939093013593505050565b5f5f5f6060848603121561261c575f5ffd5b8335612627816125cc565b92506020840135612637816125cc565b929592945050506040919091013590565b5f60208284031215612658575f5ffd5b81356109d7816125cc565b80358015158114612672575f5ffd5b919050565b5f5f5f60608486031215612689575f5ffd5b83356001600160401b038116811461269f575f5ffd5b9250602084013591506126b460408501612663565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126126e0575f5ffd5b81356001600160401b038111156126f9576126f96126bd565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612727576127276126bd565b60405281815283820160200185101561273e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561276b575f5ffd5b8235612776816125cc565b915060208301356001600160401b03811115612790575f5ffd5b61279c858286016126d1565b9150509250929050565b5f5f604083850312156127b7575f5ffd5b82356127c2816125cc565b91506127d060208401612663565b90509250929050565b5f5f604083850312156127ea575f5ffd5b823591506127d060208401612663565b5f5f5f5f6080858703121561280d575f5ffd5b8435612818816125cc565b93506020850135612828816125cc565b92506040850135915060608501356001600160401b03811115612849575f5ffd5b612855878288016126d1565b91505092959194509250565b5f5f60408385031215612872575f5ffd5b823561287d816125cc565b9150602083013561288d816125cc565b809150509250929050565b5f5f83601f8401126128a8575f5ffd5b5081356001600160401b038111156128be575f5ffd5b6020830191508360208285010111156128d5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156128f3575f5ffd5b88356128fe816125cc565b9750602089013561290e816125cc565b9650604089013561291e816125cc565b95506060890135945060808901356001600160401b0381111561293f575f5ffd5b61294b8b828c01612898565b90955093505060a08901356001600160401b03811115612969575f5ffd5b6129758b828c01612898565b999c989b5096995094979396929594505050565b600181811c9082168061299d57607f821691505b6020821081036129bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b5f60208284031215612afb575f5ffd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6832ba3432b932bab69d60b91b81525f8451612b77816009850160208901612556565b600160fe1b6009918401918201528451612b9881600a840160208901612556565b600981830101915050712f746f6b656e5552493f75696e743235363d60701b60018201528351612bcf816013840160208801612556565b0160130195945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612c37575f5ffd5b81516109d7816125cc565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061247f90830184612578565b5f60208284031215612c84575f5ffd5b81516109d781612526565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176106e2576106e2612c8f565b808201808211156106e2576106e2612c8f565b634e487b7160e01b5f52603260045260245ffd5b5f81612cef57612cef612c8f565b505f190190565b601f8211156108b357805f5260205f20601f840160051c81016020851015612d1b5750805b601f840160051c820191505b81811015612d3a575f8155600101612d27565b5050505050565b81516001600160401b03811115612d5a57612d5a6126bd565b612d6e81612d688454612989565b84612cf6565b6020601f821160018114612da0575f8315612d895750848201515b5f19600385901b1c1916600184901b178455612d3a565b5f84815260208120601f198516915b82811015612dcf5787850151825560209485019460019092019101612daf565b5084821015612dec57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8251612e0c818460208701612556565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212205ca793a2312f9b2fc8fc6bda4c8492cc141ddbe707fcc60e6d2cb7bff225a87a64736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010098": { - "contractName": "BridgedERC1155", - "storage": {}, - "code": "0x6080604052600436106101e5575f3560e01c8063715018a611610108578063a86f9d9e1161009d578063e30c39781161006d578063e30c39781461056f578063e985e9c51461058c578063ef8c4ae6146105d4578063f242432a146105f3578063f2fde38b14610612575f5ffd5b8063a86f9d9e146104d5578063b390c0ab146104f4578063d81d0a1514610513578063e07baba614610532575f5ffd5b80638abf6077116100d85780638abf6077146104715780638da5cb5b1461048557806395d89b41146104a2578063a22cb465146104b6575f5ffd5b8063715018a61461041557806379ba5097146104295780637cf8ed0d1461043d5780638456cb591461045d575f5ffd5b80633ab76e9f1161017e5780634e1273f41161014e5780634e1273f4146103a25780634f1ef286146103ce57806352d1902d146103e15780635c975abb146103f5575f5ffd5b80633ab76e9f146103225780633eb6b8cf146103595780633f4ba83a1461037857806349d126051461038c575f5ffd5b806326afaadd116101b957806326afaadd1461028a5780632eb2c2d6146102ce5780633075db56146102ef5780633659cfe614610303575f5ffd5b8062fdd58e146101e957806301ffc9a71461021b57806306fdde031461024a5780630e89341c1461026b575b5f5ffd5b3480156101f4575f5ffd5b506102086102033660046126ae565b610631565b6040519081526020015b60405180910390f35b348015610226575f5ffd5b5061023a6102353660046126ed565b6106cb565b6040519015158152602001610212565b348015610255575f5ffd5b5061025e61070a565b6040516102129190612755565b348015610276575f5ffd5b5061025e610285366004612767565b610797565b348015610295575f5ffd5b506102af61015f54610160546001600160a01b0390911691565b604080516001600160a01b039093168352602083019190915201610212565b3480156102d9575f5ffd5b506102ed6102e83660046128c0565b61082a565b005b3480156102fa575f5ffd5b5061023a610876565b34801561030e575f5ffd5b506102ed61031d366004612970565b61088e565b34801561032d575f5ffd5b50609754610341906001600160a01b031681565b6040516001600160a01b039091168152602001610212565b348015610364575f5ffd5b5061034161037336600461299f565b610955565b348015610383575f5ffd5b506102ed61096b565b348015610397575f5ffd5b506102086101605481565b3480156103ad575f5ffd5b506103c16103bc3660046129e5565b61097f565b6040516102129190612aee565b6102ed6103dc366004612b00565b610a9e565b3480156103ec575f5ffd5b50610208610b57565b348015610400575f5ffd5b5061023a60c954610100900460ff1660021490565b348015610420575f5ffd5b506102ed610c09565b348015610434575f5ffd5b506102ed610c1a565b348015610448575f5ffd5b5061015f54610341906001600160a01b031681565b348015610468575f5ffd5b506102ed610c91565b34801561047c575f5ffd5b50610341610ca4565b348015610490575f5ffd5b506033546001600160a01b0316610341565b3480156104ad575f5ffd5b5061025e610cb2565b3480156104c1575f5ffd5b506102ed6104d0366004612b42565b610cc0565b3480156104e0575f5ffd5b506103416104ef366004612b75565b610ccb565b3480156104ff575f5ffd5b506102ed61050e366004612b96565b610cd7565b34801561051e575f5ffd5b506102ed61052d366004612bfd565b610da9565b34801561053d575f5ffd5b5060c954610557906201000090046001600160401b031681565b6040516001600160401b039091168152602001610212565b34801561057a575f5ffd5b506065546001600160a01b0316610341565b348015610597575f5ffd5b5061023a6105a6366004612c7d565b6001600160a01b039182165f90815261012e6020908152604080832093909416825291909152205460ff1690565b3480156105df575f5ffd5b506102ed6105ee366004612cf1565b610eed565b3480156105fe575f5ffd5b506102ed61060d366004612d9e565b61106d565b34801561061d575f5ffd5b506102ed61062c366004612970565b6110b2565b5f6001600160a01b0383166106a05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f81815261012d602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6001600160e01b03198216634d22606360e01b14806106fb57506001600160e01b031982166377c6257360e11b145b806106c557506106c582611123565b610162805461071890612df5565b80601f016020809104026020016040519081016040528092919081815260200182805461074490612df5565b801561078f5780601f106107665761010080835404028352916020019161078f565b820191905f5260205f20905b81548152906001019060200180831161077257829003601f168201915b505050505081565b606061012f80546107a790612df5565b80601f01602080910402602001604051908101604052809291908181526020018280546107d390612df5565b801561081e5780601f106107f55761010080835404028352916020019161081e565b820191905f5260205f20905b81548152906001019060200180831161080157829003601f168201915b50505050509050919050565b6001600160a01b038516331480610846575061084685336105a6565b6108625760405162461bcd60e51b815260040161069790612e2d565b61086f8585858585611172565b5050505050565b5f600261088560c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100981630036108d65760405162461bcd60e51b815260040161069790612e7b565b7f00000000000000000000000001670000000000000000000000000000000100986001600160a01b031661090861130d565b6001600160a01b03161461092e5760405162461bcd60e51b815260040161069790612ec7565b61093781611328565b604080515f8082526020820190925261095291839190611330565b50565b5f61096184848461149a565b90505b9392505050565b6109736114ec565b61097d335f61157c565b565b606081518351146109e45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610697565b5f83516001600160401b038111156109fe576109fe61277e565b604051908082528060200260200182016040528015610a27578160200160208202803683370190505b5090505f5b8451811015610a9657610a71858281518110610a4a57610a4a612f13565b6020026020010151858381518110610a6457610a64612f13565b6020026020010151610631565b828281518110610a8357610a83612f13565b6020908102919091010152600101610a2c565b509392505050565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000010098163003610ae65760405162461bcd60e51b815260040161069790612e7b565b7f00000000000000000000000001670000000000000000000000000000000100986001600160a01b0316610b1861130d565b6001600160a01b031614610b3e5760405162461bcd60e51b815260040161069790612ec7565b610b4782611328565b610b5382826001611330565b5050565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000100981614610bf65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610697565b505f5160206134ec5f395f51905f525b90565b610c11611580565b61097d5f6115da565b60655433906001600160a01b03168114610c885760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610697565b610952816115da565b610c996115f3565b61097d33600161157c565b5f610cad61130d565b905090565b610161805461071890612df5565b610b53338383611664565b5f61096446848461149a565b610ceb60c954610100900460ff1660021490565b15610d095760405163bae6e2a960e01b815260040160405180910390fd5b6c195c98cc4c4d4d57dd985d5b1d609a1b610d25816001610ccb565b6001600160a01b0316336001600160a01b031614610d5657604051630d85cccf60e11b815260040160405180910390fd5b6002610d6460c95460ff1690565b60ff1603610d855760405163dfc60d8560e01b815260040160405180910390fd5b610d8f6002611744565b610d9a33848461175a565b610da46001611744565b505050565b610dbd60c954610100900460ff1660021490565b15610ddb5760405163bae6e2a960e01b815260040160405180910390fd5b6c195c98cc4c4d4d57dd985d5b1d609a1b610df7816001610ccb565b6001600160a01b0316336001600160a01b031614610e2857604051630d85cccf60e11b815260040160405180910390fd5b6002610e3660c95460ff1690565b60ff1603610e575760405163dfc60d8560e01b815260040160405180910390fd5b610e616002611744565b610edb868686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284375f920182905250604080516020810190915290815292506118ee915050565b610ee56001611744565b505050505050565b5f54610100900460ff1615808015610f0b57505f54600160ff909116105b80610f245750303b158015610f2457505f5460ff166001145b610f875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610697565b5f805460ff191660011790558015610fa8575f805461ff0019166101001790555b610fb28787611a70565b610fbc8989611aac565b610fdd610fd8888860405180602001604052805f815250611ae6565b611b30565b61015f80546001600160a01b0319166001600160a01b03891617905561016086905561016161100d858783612f6b565b5061016261101c838583612f6b565b508015611062575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6001600160a01b038516331480611089575061108985336105a6565b6110a55760405162461bcd60e51b815260040161069790612e2d565b61086f8585858585611b5f565b6110ba611580565b606580546001600160a01b0383166001600160a01b031990911681179091556110eb6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b03198216636cdb3d1360e11b148061115357506001600160e01b031982166303a24d0760e21b145b806106c557506301ffc9a760e01b6001600160e01b03198316146106c5565b81518351146111935760405162461bcd60e51b815260040161069790613024565b6001600160a01b0384166111b95760405162461bcd60e51b81526004016106979061306c565b336111c8818787878787611c8e565b5f5b84518110156112a7575f8582815181106111e6576111e6612f13565b602002602001015190505f85838151811061120357611203612f13565b6020908102919091018101515f84815261012d835260408082206001600160a01b038e1683529093529190912054909150818110156112545760405162461bcd60e51b8152600401610697906130b1565b5f83815261012d602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061129390849061310f565b9091555050600190930192506111ca915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112f7929190613122565b60405180910390a4610ee5818787878787611cce565b5f5160206134ec5f395f51905f52546001600160a01b031690565b610952611580565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561136357610da483611e28565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156113bd575060408051601f3d908101601f191682019092526113ba9181019061314f565b60015b6114205760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610697565b5f5160206134ec5f395f51905f52811461148e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610697565b50610da4838383611ec3565b5f6114a58484611eed565b9050811580156114bc57506001600160a01b038116155b1561096457604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610697565b61150060c954610100900460ff1660021490565b61151d5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610b535b6033546001600160a01b0316331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610697565b606580546001600160a01b031916905561095281611f97565b61160760c954610100900460ff1660021490565b156116255760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611572565b816001600160a01b0316836001600160a01b0316036116d75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610697565b6001600160a01b038381165f81815261012e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60c9805460ff191660ff92909216919091179055565b6001600160a01b0383166117bc5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610697565b335f6117c784611fe8565b90505f6117d384611fe8565b90506117f183875f858560405180602001604052805f815250611c8e565b5f85815261012d602090815260408083206001600160a01b038a168452909152902054848110156118705760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610697565b5f86815261012d602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f90525b50505050505050565b6001600160a01b03841661194e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610697565b815183511461196f5760405162461bcd60e51b815260040161069790613024565b3361197e815f87878787611c8e565b5f5b8451811015611a0a5783818151811061199b5761199b612f13565b602002602001015161012d5f8784815181106119b9576119b9612f13565b602002602001015181526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f8282546119fd919061310f565b9091555050600101611980565b50846001600160a01b03165f6001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a5a929190613122565b60405180910390a461086f815f87878787611cce565b6001600160a01b0382161580611a84575080155b80611a8e57504681145b15610b535760405163c118d2f360e01b815260040160405180910390fd5b806001600160a01b038116611ad45760405163538ba4f960e01b815260040160405180910390fd5b611add83612031565b610da48261208f565b6060611afc846001600160a01b031660146120ff565b611b0584612294565b83604051602001611b1893929190613166565b60405160208183030381529060405290509392505050565b5f54610100900460ff16611b565760405162461bcd60e51b8152600401610697906131ee565b61095281612323565b6001600160a01b038416611b855760405162461bcd60e51b81526004016106979061306c565b335f611b9085611fe8565b90505f611b9c85611fe8565b9050611bac838989858589611c8e565b5f86815261012d602090815260408083206001600160a01b038c16845290915290205485811015611bef5760405162461bcd60e51b8152600401610697906130b1565b5f87815261012d602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611c2e90849061310f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611062848a8a8a8a8a612352565b611ca260c954610100900460ff1660021490565b15611cc05760405163bae6e2a960e01b815260040160405180910390fd5b611cc98461240c565b610ee5565b6001600160a01b0384163b15610ee55760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611d129089908990889088908890600401613239565b6020604051808303815f875af1925050508015611d4c575060408051601f3d908101601f19168201909252611d4991810190613296565b60015b611df857611d586132b1565b806308c379a003611d915750611d6c6132c9565b80611d775750611d93565b8060405162461bcd60e51b81526004016106979190612755565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610697565b6001600160e01b0319811663bc197c8160e01b146118e55760405162461bcd60e51b815260040161069790613343565b6001600160a01b0381163b611e955760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610697565b5f5160206134ec5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611ecc83612435565b5f82511180611ed85750805b15610da457611ee78383612474565b50505050565b6097545f906001600160a01b031680611f1957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8f919061338b565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061202057612020612f13565b602090810291909101015292915050565b5f54610100900460ff166120575760405162461bcd60e51b8152600401610697906131ee565b61205f612499565b61207d6001600160a01b0382161561207757816115da565b336115da565b5060c9805461ff001916610100179055565b5f54610100900460ff166120b55760405162461bcd60e51b8152600401610697906131ee565b6001600160401b034611156120dd5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b60605f61210d8360026133a6565b61211890600261310f565b6001600160401b0381111561212f5761212f61277e565b6040519080825280601f01601f191660200182016040528015612159576020820181803683370190505b509050600360fc1b815f8151811061217357612173612f13565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106121a1576121a1612f13565b60200101906001600160f81b03191690815f1a9053505f6121c38460026133a6565b6121ce90600161310f565b90505b6001811115612245576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061220257612202612f13565b1a60f81b82828151811061221857612218612f13565b60200101906001600160f81b03191690815f1a90535060049490941c9361223e816133bd565b90506121d1565b5083156109645760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610697565b60605f6122a0836124bf565b60010190505f816001600160401b038111156122be576122be61277e565b6040519080825280601f01601f1916602001820160405280156122e8576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846122f257509392505050565b5f54610100900460ff166123495760405162461bcd60e51b8152600401610697906131ee565b61095281612596565b6001600160a01b0384163b15610ee55760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061239690899089908890889088906004016133d2565b6020604051808303815f875af19250505080156123d0575060408051601f3d908101601f191682019092526123cd91810190613296565b60015b6123dc57611d586132b1565b6001600160e01b0319811663f23a6e6160e01b146118e55760405162461bcd60e51b815260040161069790613343565b306001600160a01b0382160361095257604051630c292c9d60e21b815260040160405180910390fd5b61243e81611e28565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610964838360405180606001604052806027815260200161350c602791396125a3565b5f54610100900460ff1661097d5760405162461bcd60e51b8152600401610697906131ee565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106124fd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612529576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061254757662386f26fc10000830492506010015b6305f5e100831061255f576305f5e100830492506008015b612710831061257357612710830492506004015b60648310612585576064830492506002015b600a83106106c55760010192915050565b61012f610b538282613416565b60605f5f856001600160a01b0316856040516125bf91906134d0565b5f60405180830381855af49150503d805f81146125f7576040519150601f19603f3d011682016040523d82523d5f602084013e6125fc565b606091505b509150915061260d86838387612617565b9695505050505050565b606083156126855782515f0361267e576001600160a01b0385163b61267e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610697565b5081611f8f565b611f8f8383815115611d775781518083602001fd5b6001600160a01b0381168114610952575f5ffd5b5f5f604083850312156126bf575f5ffd5b82356126ca8161269a565b946020939093013593505050565b6001600160e01b031981168114610952575f5ffd5b5f602082840312156126fd575f5ffd5b8135610964816126d8565b5f5b8381101561272257818101518382015260200161270a565b50505f910152565b5f8151808452612741816020860160208601612708565b601f01601f19169290920160200192915050565b602081525f610964602083018461272a565b5f60208284031215612777575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156127b7576127b761277e565b6040525050565b5f6001600160401b038211156127d6576127d661277e565b5060051b60200190565b5f82601f8301126127ef575f5ffd5b81356127fa816127be565b6040516128078282612792565b80915082815260208101915060208360051b86010192508583111561282a575f5ffd5b602085015b8381101561284757803583526020928301920161282f565b5095945050505050565b5f82601f830112612860575f5ffd5b81356001600160401b038111156128795761287961277e565b604051612890601f8301601f191660200182612792565b8181528460208386010111156128a4575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f60a086880312156128d4575f5ffd5b85356128df8161269a565b945060208601356128ef8161269a565b935060408601356001600160401b03811115612909575f5ffd5b612915888289016127e0565b93505060608601356001600160401b03811115612930575f5ffd5b61293c888289016127e0565b92505060808601356001600160401b03811115612957575f5ffd5b61296388828901612851565b9150509295509295909350565b5f60208284031215612980575f5ffd5b81356109648161269a565b8035801515811461299a575f5ffd5b919050565b5f5f5f606084860312156129b1575f5ffd5b83356001600160401b03811681146129c7575f5ffd5b9250602084013591506129dc6040850161298b565b90509250925092565b5f5f604083850312156129f6575f5ffd5b82356001600160401b03811115612a0b575f5ffd5b8301601f81018513612a1b575f5ffd5b8035612a26816127be565b604051612a338282612792565b80915082815260208101915060208360051b850101925087831115612a56575f5ffd5b6020840193505b82841015612a81578335612a708161269a565b825260209384019390910190612a5d565b945050505060208301356001600160401b03811115612a9e575f5ffd5b612aaa858286016127e0565b9150509250929050565b5f8151808452602084019350602083015f5b82811015612ae4578151865260209586019590910190600101612ac6565b5093949350505050565b602081525f6109646020830184612ab4565b5f5f60408385031215612b11575f5ffd5b8235612b1c8161269a565b915060208301356001600160401b03811115612b36575f5ffd5b612aaa85828601612851565b5f5f60408385031215612b53575f5ffd5b8235612b5e8161269a565b9150612b6c6020840161298b565b90509250929050565b5f5f60408385031215612b86575f5ffd5b82359150612b6c6020840161298b565b5f5f60408385031215612ba7575f5ffd5b50508035926020909101359150565b5f5f83601f840112612bc6575f5ffd5b5081356001600160401b03811115612bdc575f5ffd5b6020830191508360208260051b8501011115612bf6575f5ffd5b9250929050565b5f5f5f5f5f60608688031215612c11575f5ffd5b8535612c1c8161269a565b945060208601356001600160401b03811115612c36575f5ffd5b612c4288828901612bb6565b90955093505060408601356001600160401b03811115612c60575f5ffd5b612c6c88828901612bb6565b969995985093965092949392505050565b5f5f60408385031215612c8e575f5ffd5b8235612c998161269a565b91506020830135612ca98161269a565b809150509250929050565b5f5f83601f840112612cc4575f5ffd5b5081356001600160401b03811115612cda575f5ffd5b602083019150836020828501011115612bf6575f5ffd5b5f5f5f5f5f5f5f5f60c0898b031215612d08575f5ffd5b8835612d138161269a565b97506020890135612d238161269a565b96506040890135612d338161269a565b95506060890135945060808901356001600160401b03811115612d54575f5ffd5b612d608b828c01612cb4565b90955093505060a08901356001600160401b03811115612d7e575f5ffd5b612d8a8b828c01612cb4565b999c989b5096995094979396929594505050565b5f5f5f5f5f60a08688031215612db2575f5ffd5b8535612dbd8161269a565b94506020860135612dcd8161269a565b9350604086013592506060860135915060808601356001600160401b03811115612957575f5ffd5b600181811c90821680612e0957607f821691505b602082108103612e2757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b601f821115610da457805f5260205f20601f840160051c81016020851015612f4c5750805b601f840160051c820191505b8181101561086f575f8155600101612f58565b6001600160401b03831115612f8257612f8261277e565b612f9683612f908354612df5565b83612f27565b5f601f841160018114612fc7575f8515612fb05750838201355b5f19600387901b1c1916600186901b17835561086f565b5f83815260208120601f198716915b82811015612ff65786850135825560209485019460019092019101612fd6565b5086821015613012575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106c5576106c56130fb565b604081525f6131346040830185612ab4565b82810360208401526131468185612ab4565b95945050505050565b5f6020828403121561315f575f5ffd5b5051919050565b6832ba3432b932bab69d60b91b81525f8451613189816009850160208901612708565b600160fe1b60099184019182015284516131aa81600a840160208901612708565b600981830101915050712f746f6b656e5552493f75696e743235363d60701b600182015283516131e1816013840160208801612708565b0160130195945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f9061326490830186612ab4565b82810360608401526132768186612ab4565b9050828103608084015261328a818561272a565b98975050505050505050565b5f602082840312156132a6575f5ffd5b8151610964816126d8565b5f60033d1115610c065760045f5f3e505f5160e01c90565b5f60443d10156132d65790565b6040513d600319016004823e80513d60248201116001600160401b03821117156132ff57505090565b80820180516001600160401b0381111561331a575050505090565b3d8401600319018282016020011115613334575050505090565b610a9660208285010185612792565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b5f6020828403121561339b575f5ffd5b81516109648161269a565b80820281158282048414176106c5576106c56130fb565b5f816133cb576133cb6130fb565b505f190190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f9061340b9083018461272a565b979650505050505050565b81516001600160401b0381111561342f5761342f61277e565b6134438161343d8454612df5565b84612f27565b6020601f821160018114613475575f831561345e5750848201515b5f19600385901b1c1916600184901b17845561086f565b5f84815260208120601f198516915b828110156134a45787850151825560209485019460019092019101613484565b50848210156134c157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82516134e1818460208701612708565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220056c58b99db557dce285f996f441ca995a4a77b2754e41fc6af5e46a7185c22664736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000005": { - "contractName": "SignalServiceImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x6080604052600436106101c5575f3560e01c806379ba5097116100f2578063a86f9d9e11610092578063e30c397811610062578063e30c39781461052f578063f09a40161461054c578063f2fde38b1461056b578063fe9fbb801461058a575f5ffd5b8063a86f9d9e1461048e578063ce9d0820146104ad578063dfc8ff1d146104cc578063e07baba61461050a575f5ffd5b80638da5cb5b116100cd5780638da5cb5b14610414578063910af6ed1461043157806391f3f74b146104505780639b527cfa1461046f575f5ffd5b806379ba5097146103d85780638456cb59146103ec5780638abf607714610400575f5ffd5b80633eb6b8cf1161016857806352d1902d1161013857806352d1902d146103715780635c975abb1461038557806366ca2bc0146103a5578063715018a6146103c4575f5ffd5b80633eb6b8cf146102fe5780633f4ba83a1461031d5780634f1ef286146103315780634f90a67414610344575f5ffd5b8063355bcc3d116101a3578063355bcc3d146102325780633659cfe6146102895780633ab76e9f146102a85780633ced0e08146102df575f5ffd5b80632d1fb389146101c95780633075db56146101ea57806332676bc614610213575b5f5ffd5b3480156101d4575f5ffd5b506101e86101e336600461351b565b6105b8565b005b3480156101f5575f5ffd5b506101fe61065e565b60405190151581526020015b60405180910390f35b34801561021e575f5ffd5b506101fe61022d36600461354e565b610676565b34801561023d575f5ffd5b5061027161024c36600461358e565b60fb60209081525f92835260408084209091529082529020546001600160401b031681565b6040516001600160401b03909116815260200161020a565b348015610294575f5ffd5b506101e86102a33660046135a8565b61068c565b3480156102b3575f5ffd5b506097546102c7906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b3480156102ea575f5ffd5b506101fe6102f93660046135c3565b61075c565b348015610309575f5ffd5b506102c7610318366004613604565b6107a3565b348015610328575f5ffd5b506101e86107b9565b6101e861033f366004613714565b6107cd565b34801561034f575f5ffd5b5061036361035e3660046135c3565b610886565b60405190815260200161020a565b34801561037c575f5ffd5b506103636108cc565b348015610390575f5ffd5b506101fe60c954610100900460ff1660021490565b3480156103b0575f5ffd5b506103636103bf366004613760565b61097d565b3480156103cf575f5ffd5b506101e8610989565b3480156103e3575f5ffd5b506101e861099a565b3480156103f7575f5ffd5b506101e8610a11565b34801561040b575f5ffd5b506102c7610a24565b34801561041f575f5ffd5b506033546001600160a01b03166102c7565b34801561043c575f5ffd5b5061036361044b366004613777565b610a32565b34801561045b575f5ffd5b5061036361046a36600461380c565b610b0d565b34801561047a575f5ffd5b50610363610489366004613848565b610b78565b348015610499575f5ffd5b506102c76104a8366004613878565b610ba4565b3480156104b8575f5ffd5b506101e86104c7366004613777565b610bb0565b3480156104d7575f5ffd5b506104eb6104e6366004613848565b610bc6565b604080516001600160401b03909316835260208301919091520161020a565b348015610515575f5ffd5b5060c954610271906201000090046001600160401b031681565b34801561053a575f5ffd5b506065546001600160a01b03166102c7565b348015610557575f5ffd5b506101e8610566366004613899565b610c5a565b348015610576575f5ffd5b506101e86105853660046135a8565b610d69565b348015610595575f5ffd5b506101fe6105a43660046135a8565b60fc6020525f908152604090205460ff1681565b6105c0610dda565b6001600160a01b0382165f90815260fc602052604090205481151560ff909116151503610600576040516398f26f4560e01b815260040160405180910390fd5b6001600160a01b0382165f81815260fc6020908152604091829020805460ff191685151590811790915591519182527f4c0079b9bcd37cd5d29a13938effd97c881798cbc6bd52a3026a29d94b27d1bf910160405180910390a25050565b5f600261066d60c95460ff1690565b60ff1614905090565b5f6106818383610e34565b151590505b92915050565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000051630036106dd5760405162461bcd60e51b81526004016106d4906138d0565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000056001600160a01b031661070f610e96565b6001600160a01b0316146107355760405162461bcd60e51b81526004016106d49061391c565b61073e81610eb1565b604080515f8082526020820190925261075991839190610eb9565b50565b5f8180820361077e5760405163ec73295960e01b815260040160405180910390fd5b5f61078a878787610b78565b9050836107973083610e34565b14979650505050505050565b5f6107af848484611023565b90505b9392505050565b6107c1611075565b6107cb335f611105565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000051630036108155760405162461bcd60e51b81526004016106d4906138d0565b7f00000000000000000000000001670000000000000000000000000000000000056001600160a01b0316610847610e96565b6001600160a01b03161461086d5760405162461bcd60e51b81526004016106d49061391c565b61087682610eb1565b61088282826001610eb9565b5050565b335f90815260fc602052604081205460ff166108b557604051631f67751f60e01b815260040160405180910390fd5b6108c18585858561111e565b90505b949350505050565b5f306001600160a01b037f0000000000000000000000000167000000000000000000000000000000000005161461096b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106d4565b505f516020613eb05f395f51905f5290565b5f610686338384611200565b610991610dda565b6107cb5f6112d9565b60655433906001600160a01b03168114610a085760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016106d4565b610759816112d9565b610a196112f2565b6107cb336001611105565b5f610a2d610e96565b905090565b5f610a4760c954610100900460ff1660021490565b15610a655760405163bae6e2a960e01b815260040160405180910390fd5b6002610a7360c95460ff1690565b60ff1603610a945760405163dfc60d8560e01b815260040160405180910390fd5b60c9805460ff191660021790555f610ab187878787876001611363565b90505f5b8151811015610af457610ae0828281518110610ad357610ad3613968565b602002602001015161181f565b610aea9084613990565b9250600101610ab5565b505060c9805460ff191660011790555b95945050505050565b6040516514d251d3905360d21b60208201526001600160c01b031960c085901b1660268201526bffffffffffffffffffffffff19606084901b16602e820152604281018290525f906062015b6040516020818303038152906040528051906020012090509392505050565b604080516001600160401b03808616602083015291810184905290821660608201525f90608001610b59565b5f6107b2468484611023565b610bbe85858585855f611363565b505050505050565b5f5f826001600160401b03165f03610c02576001600160401b038086165f90815260fb6020908152604080832088845290915290205416610c04565b825b91506001600160401b03821615610c52575f610c21868685610b78565b9050610c2d3082610e34565b91505f829003610c505760405163738afa0560e01b815260040160405180910390fd5b505b935093915050565b5f54610100900460ff1615808015610c7857505f54600160ff909116105b80610c915750303b158015610c9157505f5460ff166001145b610cf45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106d4565b5f805460ff191660011790558015610d15575f805461ff0019166101001790555b610d1f8383611963565b8015610d64575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d71610dda565b606580546001600160a01b0383166001600160a01b03199091168117909155610da26033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b031633146107cb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d4565b5f826001600160a01b038116610e5d5760405163538ba4f960e01b815260040160405180910390fd5b825f819003610e7f5760405163ec73295960e01b815260040160405180910390fd5b5f610e8b468787610b0d565b549695505050505050565b5f516020613eb05f395f51905f52546001600160a01b031690565b610759610dda565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610eec57610d648361199d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f46575060408051601f3d908101601f19168201909252610f43918101906139a3565b60015b610fa95760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106d4565b5f516020613eb05f395f51905f5281146110175760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106d4565b50610d64838383611a38565b5f61102e8484611a62565b90508115801561104557506001600160a01b038116155b156107b257604051632b0d65db60e01b81526001600160401b0385166004820152602481018490526044016106d4565b61108960c954610100900460ff1660021490565b6110a65760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b604051630c2b8f8f60e11b815260040160405180910390fd5b5f61112a858585610b78565b9050611137308284611200565b506001600160401b038581165f90815260fb60209081526040808320888452909152902054818516911610156111a1576001600160401b038581165f90815260fb602090815260408083208884529091529020805467ffffffffffffffff19169185169190911790555b83836001600160401b0316866001600160401b03167fde247c825b1fb2d7ff9e0e771cba6f9e757ad04479fcdc135d88ae91fd50b37d85856040516111f0929190918252602082015260400190565b60405180910390a4949350505050565b5f836001600160a01b0381166112295760405163538ba4f960e01b815260040160405180910390fd5b835f81900361124b5760405163ec73295960e01b815260040160405180910390fd5b835f81900361126d5760405163ec73295960e01b815260040160405180910390fd5b611278468888610b0d565b858155604080516001600160a01b038a16815260208101899052908101829052606081018790529094507f0ad2d108660a211f47bf7fb43a0443cae181624995d3d42b88ee6879d200e9739060800160405180910390a15050509392505050565b606580546001600160a01b031916905561075981611b04565b61130660c954610100900460ff1660021490565b156113245760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016110fb565b6060856001600160a01b03811661138d5760405163538ba4f960e01b815260040160405180910390fd5b855f8190036113af5760405163ec73295960e01b815260040160405180910390fd5b5f6113bc86880188613a77565b905080515f036113df57604051630b92daef60e21b815260040160405180910390fd5b5f600182516113ee9190613bbd565b6001600160401b038111156114055761140561363d565b60405190808252806020026020018201604052801561142e578160200160208202803683370190505b50905085156114c15781516001600160401b038111156114505761145061363d565b6040519080825280602002602001820160405280156114bd57816020015b6114aa6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b81526020019060019003908161146e5790505b5094505b8a8a8a805f6114e2856d7369676e616c5f7365727669636560901b836107a3565b9050306001600160a01b0382160361150d57604051637556223560e11b815260040160405180910390fd5b6115456040805160c0810182525f80825260208201819052918101829052906060820190815260200160608152602001606081525090565b5f5f5f5f5b8b518110156117d3578b818151811061156557611565613968565b602002602001015194505f5b818110156115cf57855f01516001600160401b03168c828151811061159857611598613968565b60200260200101516001600160401b0316036115c7576040516348362c2760e11b815260040160405180910390fd5b600101611571565b506115de8a8a8a8a898b611b55565b93508a5181149150811561161e5784516001600160401b03164614611616576040516338bf822760e21b815260040160405180910390fd5b3095506116c9565b845f01518b828151811061163457611634613968565b6001600160401b0392831660209182029290920101528551161580611662575084516001600160401b031646145b1561168057604051637556223560e11b815260040160405180910390fd5b845161169e906d7369676e616c5f7365727669636560901b5f6107a3565b9550306001600160a01b038716036116c957604051637556223560e11b815260040160405180910390fd5b608085015151151592508f1561175d576040518060e00160405280866040015181526020018581526020018b6001600160401b0316815260200186602001516001600160401b03168152602001841515815260200183151581526020018660600151600381111561173c5761173c613bd0565b8152508f828151811061175157611751613968565b60200260200101819052505b6117b88a8461178c577fc6cdc4f2acf13acb10f410085b821f7b7113b303e9a4799023f928317396aaf56117ae565b7f73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da1695b8760200151610b78565b604086015186519b509699509750949550879460010161154a565b508515806117ea57506117e63088610e34565b8614155b156118085760405163738afa0560e01b815260040160405180910390fd5b505050505050505050505050509695505050505050565b5f8060038360c00151600381111561183957611839613bd0565b148061185a575060028360c00151600381111561185857611858613bd0565b145b905080801561186a575082608001515b801561187857508260a00151155b156118ba57600191506118b883604001517f73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da1698560600151865f015161111e565b505b5f60038460c0015160038111156118d3576118d3613bd0565b14806118f4575060018460c0015160038111156118f2576118f2613bd0565b145b9050808015611910575083608001518061191057508360a00151155b1561195c57611920600184613990565b925061195a84604001517fc6cdc4f2acf13acb10f410085b821f7b7113b303e9a4799023f928317396aaf58660600151876020015161111e565b505b5050919050565b806001600160a01b03811661198b5760405163538ba4f960e01b815260040160405180910390fd5b61199483611bf4565b610d6482611c52565b6001600160a01b0381163b611a0a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106d4565b5f516020613eb05f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611a4183611cc2565b5f82511180611a4d5750805b15610d6457611a5c8383611d01565b50505050565b6097545f906001600160a01b031680611a8e57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611ae0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c49190613be4565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f856001600160a01b038116611b7e5760405163538ba4f960e01b815260040160405180910390fd5b855f819003611ba05760405163ec73295960e01b815260040160405180910390fd5b855f819003611bc25760405163ec73295960e01b815260040160405180910390fd5b611be6866040015186611bd68d8d8d610b0d565b8a8a608001518b60a00151611d26565b9a9950505050505050505050565b5f54610100900460ff16611c1a5760405162461bcd60e51b81526004016106d490613bff565b611c22611e33565b611c406001600160a01b03821615611c3a57816112d9565b336112d9565b5060c9805461ff001916610100179055565b5f54610100900460ff16611c785760405162461bcd60e51b81526004016106d490613bff565b6001600160401b03461115611ca05760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b611ccb8161199d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606107b28383604051806060016040528060278152602001613ed060279139611e59565b5f82515f14611dce576040516bffffffffffffffffffffffff19606088901b1660208201525f90611d6a90603401604051602081830303815290604052858a611ecd565b905080515f03611d8d57604051630414cd5b60e31b815260040160405180910390fd5b5f611d9782611ee6565b9050611dbc81600281518110611daf57611daf613968565b6020026020010151611ef9565b611dc590613c4a565b92505050611dd1565b50855b5f611e0886604051602001611de891815260200190565b60408051601f19818403018152919052611e0187611f78565b8585611f8b565b905080611e2857604051638d9a4db360e01b815260040160405180910390fd5b509695505050505050565b5f54610100900460ff166107cb5760405162461bcd60e51b81526004016106d490613bff565b60605f5f856001600160a01b031685604051611e759190613c92565b5f60405180830381855af49150503d805f8114611ead576040519150601f19603f3d011682016040523d82523d5f602084013e611eb2565b606091505b5091509150611ec386838387611fa4565b9695505050505050565b60605f611ed98561201c565b9050610b0481858561204e565b6060610686611ef4836128bc565b61290e565b60605f5f5f611f0785612a8c565b919450925090505f816001811115611f2157611f21613bd0565b14611f3f576040516307fe6cb960e21b815260040160405180910390fd5b611f498284613990565b855114611f6957604051630b8aa6f760e31b815260040160405180910390fd5b610b0485602001518484612d6f565b6060610686611f8683612dff565b612f13565b5f5f611f968661201c565b9050611ec381868686612f6b565b606083156120125782515f0361200b576001600160a01b0385163b61200b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106d4565b50816108c4565b6108c48383612f91565b6060818051906020012060405160200161203891815260200190565b6040516020818303038152906040529050919050565b60605f8451116120985760405162461bcd60e51b81526020600482015260156024820152744d65726b6c65547269653a20656d707479206b657960581b60448201526064016106d4565b5f6120a284612fbb565b90505f6120ae8661309e565b90505f846040516020016120c491815260200190565b60408051601f1981840301815291905290505f805b8451811015612865575f8582815181106120f5576120f5613968565b6020026020010151905084518311156121675760405162461bcd60e51b815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201526d0e8c2d840d6caf240d8cadccee8d60931b60648201526084016106d4565b825f0361220557805180516020918201206040516121b49261218e92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6122005760405162461bcd60e51b815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016106d4565b6122fb565b80515160201161228b578051805160209182012060405161222f9261218e92910190815260200190565b6122005760405162461bcd60e51b815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e6044820152660c2d840d0c2e6d60cb1b60648201526084016106d4565b8051845160208087019190912082519190920120146122fb5760405162461bcd60e51b815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f646044820152650ca40d0c2e6d60d31b60648201526084016106d4565b61230760106001613990565b8160200151510361249f5784518303612439576123348160200151601081518110611daf57611daf613968565b96505f8751116123ac5760405162461bcd60e51b815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016106d4565b600186516123ba9190613bbd565b821461242e5760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016106d4565b5050505050506107b2565b5f85848151811061244c5761244c613968565b602001015160f81c60f81b60f81c90505f82602001518260ff168151811061247657612476613968565b60200260200101519050612489816130ff565b9550612496600186613990565b9450505061285c565b600281602001515103612803575f6124b682613123565b90505f815f815181106124cb576124cb613968565b016020015160f81c90505f6124e1600283613cc1565b6124ec906002613ce2565b90505f6124fc848360ff16613146565b90505f6125098a89613146565b90505f612516838361317b565b90508083511461258e5760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016106d4565b60ff8516600214806125a3575060ff85166003145b15612743578082511461261e5760405162461bcd60e51b815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016106d4565b6126388760200151600181518110611daf57611daf613968565b9c505f8d51116126b05760405162461bcd60e51b815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016106d4565b60018c516126be9190613bbd565b88146127325760405162461bcd60e51b815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016106d4565b5050505050505050505050506107b2565b60ff85161580612756575060ff85166001145b1561279557612782876020015160018151811061277557612775613968565b60200260200101516130ff565b995061278e818a613990565b98506127f8565b60405162461bcd60e51b815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f64652077697468604482015271040c2dc40eadcd6dcdeeedc40e0e4caccd2f60731b60648201526084016106d4565b50505050505061285c565b60405162461bcd60e51b815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e706172736561604482015267626c65206e6f646560c01b60648201526084016106d4565b506001016120d9565b5060405162461bcd60e51b815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c656044820152646d656e747360d81b60648201526084016106d4565b604080518082019091525f808252602082015281515f036128f057604051635ab458fb60e01b815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60605f5f5f61291c85612a8c565b91945092509050600181600181111561293757612937613bd0565b14612955576040516325ce355f60e11b815260040160405180910390fd5b84516129618385613990565b1461297f57604051630b8aa6f760e31b815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091525f80825260208201528152602001906001900390816129965790505093505f835b8651811015612a80575f5f612a056040518060400160405280858c5f01516129e99190613bbd565b8152602001858c602001516129fe9190613990565b9052612a8c565b509150915060405180604001604052808383612a219190613990565b8152602001848b60200151612a369190613990565b815250888581518110612a4b57612a4b613968565b6020908102919091010152612a61600185613990565b9350612a6d8183613990565b612a779084613990565b925050506129c1565b50845250919392505050565b5f5f5f835f01515f03612ab257604051635ab458fb60e01b815260040160405180910390fd5b602084015180515f1a607f8111612ad4575f60015f9450945094505050612d68565b60b78111612b69575f612ae8608083613bbd565b905080875f015111612b0d576040516366c9448560e01b815260040160405180910390fd5b6001838101516001600160f81b0319169082148015612b395750600160ff1b6001600160f81b03198216105b15612b575760405163babb01dd60e01b815260040160405180910390fd5b506001955093505f9250612d68915050565b60bf8111612c47575f612b7d60b783613bbd565b905080875f015111612ba2576040516366c9448560e01b815260040160405180910390fd5b60018301516001600160f81b0319165f819003612bd25760405163babb01dd60e01b815260040160405180910390fd5b600184015160088302610100031c60378111612c015760405163babb01dd60e01b815260040160405180910390fd5b612c0b8184613990565b895111612c2b576040516366c9448560e01b815260040160405180910390fd5b612c36836001613990565b975095505f9450612d689350505050565b60f78111612c91575f612c5b60c083613bbd565b905080875f015111612c80576040516366c9448560e01b815260040160405180910390fd5b600195509350849250612d68915050565b5f612c9d60f783613bbd565b905080875f015111612cc2576040516366c9448560e01b815260040160405180910390fd5b60018301516001600160f81b0319165f819003612cf25760405163babb01dd60e01b815260040160405180910390fd5b600184015160088302610100031c60378111612d215760405163babb01dd60e01b815260040160405180910390fd5b612d2b8184613990565b895111612d4b576040516366c9448560e01b815260040160405180910390fd5b612d56836001613990565b9750955060019450612d689350505050565b9193909250565b6060816001600160401b03811115612d8957612d8961363d565b6040519080825280601f01601f191660200182016040528015612db3576020820181803683370190505b50905081156107b2575f612dc78486613990565b9050602082015f5b84811015612de7578281015182820152602001612dcf565b84811115612df5575f858301525b5050509392505050565b60605f82604051602001612e1591815260200190565b60408051601f1981840301815291905290505f5b6020811015612e6157818181518110612e4457612e44613968565b01602001516001600160f81b0319165f03612e6157600101612e29565b612e6c816020613bbd565b6001600160401b03811115612e8357612e8361363d565b6040519080825280601f01601f191660200182016040528015612ead576020820181803683370190505b5092505f5b835181101561195a578282612ec681613cfb565b935081518110612ed857612ed8613968565b602001015160f81c60f81b848281518110612ef557612ef5613968565b60200101906001600160f81b03191690815f1a905350600101612eb2565b606081516001148015612f3f57506080825f81518110612f3557612f35613968565b016020015160f81c105b15612f48575090565b612f54825160806131fe565b82604051602001612038929190613d13565b919050565b5f6108c184612f7b87868661204e565b8051602091820120825192909101919091201490565b815115612fa15781518083602001fd5b8060405162461bcd60e51b81526004016106d49190613d41565b8051606090806001600160401b03811115612fd857612fd861363d565b60405190808252806020026020018201604052801561301d57816020015b6040805180820190915260608082526020820152815260200190600190039081612ff65790505b5091505f5b8181101561195c57604051806040016040528085838151811061304757613047613968565b6020026020010151815260200161307686848151811061306957613069613968565b6020026020010151611ee6565b81525083828151811061308b5761308b613968565b6020908102919091010152600101613022565b606080604051905082518060011b603f8101601f191683016040528083525060208401602083015f5b838110156130f4578060011b8201818401515f1a8060041c8253600f8116600183015350506001016130c7565b509295945050505050565b60606020825f01511061311a5761311582611ef9565b610686565b610686826133a3565b606061068661314183602001515f81518110611daf57611daf613968565b61309e565b606082518210613164575060408051602081019091525f8152610686565b6107b283838486516131769190613bbd565b6133b7565b5f5f825184511061318d578251613190565b83515b90505b80821080156131e757508282815181106131af576131af613968565b602001015160f81c60f81b6001600160f81b0319168483815181106131d6576131d6613968565b01602001516001600160f81b031916145b156131f757816001019150613193565b5092915050565b6060603883101561326257604080516001808252818301909252906020820181803683370190505090506132328284613d73565b60f81b815f8151811061324757613247613968565b60200101906001600160f81b03191690815f1a905350610686565b5f60015b6132708186613d8c565b15613296578161327f81613cfb565b925061328f905061010082613d9f565b9050613266565b6132a1826001613990565b6001600160401b038111156132b8576132b861363d565b6040519080825280601f01601f1916602001820160405280156132e2576020820181803683370190505b5092506132ef8483613d73565b6132fa906037613d73565b60f81b835f8151811061330f5761330f613968565b60200101906001600160f81b03191690815f1a905350600190505b81811161339b5761010061333e8284613bbd565b61334a90610100613e91565b6133549087613d8c565b61335e9190613e9c565b60f81b83828151811061337357613373613968565b60200101906001600160f81b03191690815f1a9053508061339381613cfb565b91505061332a565b505092915050565b606061068682602001515f845f0151612d6f565b60608182601f0110156133fd5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106d4565b8282840110156134405760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106d4565b818301845110156134875760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016106d4565b6060821580156134a55760405191505f8252602082016040526134ef565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156134de5780518352602092830192016134c6565b5050858452601f01601f1916604052505b50949350505050565b6001600160a01b0381168114610759575f5ffd5b80358015158114612f66575f5ffd5b5f5f6040838503121561352c575f5ffd5b8235613537816134f8565b91506135456020840161350c565b90509250929050565b5f5f6040838503121561355f575f5ffd5b823561356a816134f8565b946020939093013593505050565b80356001600160401b0381168114612f66575f5ffd5b5f5f6040838503121561359f575f5ffd5b61356a83613578565b5f602082840312156135b8575f5ffd5b81356107b2816134f8565b5f5f5f5f608085870312156135d6575f5ffd5b6135df85613578565b9350602085013592506135f460408601613578565b9396929550929360600135925050565b5f5f5f60608486031215613616575f5ffd5b61361f84613578565b9250602084013591506136346040850161350c565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156136735761367361363d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136a1576136a161363d565b604052919050565b5f82601f8301126136b8575f5ffd5b81356001600160401b038111156136d1576136d161363d565b6136e4601f8201601f1916602001613679565b8181528460208386010111156136f8575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613725575f5ffd5b8235613730816134f8565b915060208301356001600160401b0381111561374a575f5ffd5b613756858286016136a9565b9150509250929050565b5f60208284031215613770575f5ffd5b5035919050565b5f5f5f5f5f6080868803121561378b575f5ffd5b61379486613578565b945060208601356137a4816134f8565b93506040860135925060608601356001600160401b038111156137c5575f5ffd5b8601601f810188136137d5575f5ffd5b80356001600160401b038111156137ea575f5ffd5b8860208284010111156137fb575f5ffd5b959894975092955050506020019190565b5f5f5f6060848603121561381e575f5ffd5b61382784613578565b92506020840135613837816134f8565b929592945050506040919091013590565b5f5f5f6060848603121561385a575f5ffd5b61386384613578565b92506020840135915061363460408501613578565b5f5f60408385031215613889575f5ffd5b823591506135456020840161350c565b5f5f604083850312156138aa575f5ffd5b82356138b5816134f8565b915060208301356138c5816134f8565b809150509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106865761068661397c565b5f602082840312156139b3575f5ffd5b5051919050565b5f6001600160401b038211156139d2576139d261363d565b5060051b60200190565b803560048110612f66575f5ffd5b5f82601f8301126139f9575f5ffd5b8135613a0c613a07826139ba565b613679565b8082825260208201915060208360051b860101925085831115613a2d575f5ffd5b602085015b83811015613a6d5780356001600160401b03811115613a4f575f5ffd5b613a5e886020838a01016136a9565b84525060209283019201613a32565b5095945050505050565b5f60208284031215613a87575f5ffd5b81356001600160401b03811115613a9c575f5ffd5b8201601f81018413613aac575f5ffd5b8035613aba613a07826139ba565b8082825260208201915060208360051b850101925086831115613adb575f5ffd5b602084015b83811015611e285780356001600160401b03811115613afd575f5ffd5b850160c0818a03601f19011215613b12575f5ffd5b613b1a613651565b613b2660208301613578565b8152613b3460408301613578565b602082015260608201356040820152613b4f608083016139dc565b606082015260a08201356001600160401b03811115613b6c575f5ffd5b613b7b8b6020838601016139ea565b60808301525060c08201356001600160401b03811115613b99575f5ffd5b613ba88b6020838601016139ea565b60a08301525084525060209283019201613ae0565b818103818111156106865761068661397c565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613bf4575f5ffd5b81516107b2816134f8565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80516020808301519190811015613c6a575f198160200360031b1b821691505b50919050565b5f5b83811015613c8a578181015183820152602001613c72565b50505f910152565b5f8251613ca3818460208701613c70565b9190910192915050565b634e487b7160e01b5f52601260045260245ffd5b5f60ff831680613cd357613cd3613cad565b8060ff84160691505092915050565b60ff82811682821603908111156106865761068661397c565b5f60018201613d0c57613d0c61397c565b5060010190565b5f8351613d24818460208801613c70565b835190830190613d38818360208801613c70565b01949350505050565b602081525f8251806020840152613d5f816040850160208701613c70565b601f01601f19169190910160400192915050565b60ff81811683821601908111156106865761068661397c565b5f82613d9a57613d9a613cad565b500490565b80820281158282048414176106865761068661397c565b6001815b6001841115610c5257808504811115613dd557613dd561397c565b6001841615613de357908102905b60019390931c928002613dba565b5f82613dff57506001610686565b81613e0b57505f610686565b8160018114613e215760028114613e2b57613e47565b6001915050610686565b60ff841115613e3c57613e3c61397c565b50506001821b610686565b5060208310610133831016604e8410600b8410161715613e6a575081810a610686565b613e765f198484613db6565b805f1904821115613e8957613e8961397c565b029392505050565b5f6107b28383613df1565b5f82613eaa57613eaa613cad565b50069056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088e374295b28e7ad8361a3b961be9595b9248bb8792c867a5bea9cc2824409f764736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000005": { - "contractName": "SignalService", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0xdf3a3dd9c4001d1115304f0841a31ee7b79b184f45ef381343fdf0ae529fbcb4": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000005" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010001": { - "contractName": "TaikoL2Impl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x6080604052600436106101fc575f3560e01c80638456cb5911610113578063da69d3db1161009d578063e902461a1161006d578063e902461a146105ca578063ee82ac5e146105e9578063f2fde38b14610608578063f940e38514610627578063fd85eb2d14610646575f5ffd5b8063da69d3db14610554578063dac5df7814610573578063e07baba614610588578063e30c3978146105ad575f5ffd5b8063a7137c0f116100e3578063a7137c0f1461047c578063a7e022d1146104a2578063a86f9d9e146104de578063b8c7b30c146104fd578063c3f909d41461051c575f5ffd5b80638456cb59146104125780638abf6077146104265780638da5cb5b1461043a5780639ee512f214610457575f5ffd5b80633eb6b8cf11610194578063539b8ade11610164578063539b8ade146103855780635950f9f1146103ab5780635c975abb146103ca578063715018a6146103ea57806379ba5097146103fe575f5ffd5b80633eb6b8cf1461031d5780633f4ba83a1461033c5780634f1ef2861461035057806352d1902d14610363575f5ffd5b806333d5ac9b116101cf57806333d5ac9b1461028d578063356aec04146102b35780633659cfe6146102c55780633ab76e9f146102e6575f5ffd5b806312622e5b14610200578063136dc4a81461023c5780632f9804731461025b5780633075db5614610279575b5f5ffd5b34801561020b575f5ffd5b5060fe5461021f906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b348015610247575f5ffd5b5061021f6102563660046125c0565b610665565b348015610266575f5ffd5b505f5b6040519015158152602001610233565b348015610284575f5ffd5b5061026961067b565b348015610298575f5ffd5b5060fd5461021f90600160401b90046001600160401b031681565b3480156102be575f5ffd5b505f61021f565b3480156102d0575f5ffd5b506102e46102df366004612614565b610693565b005b3480156102f1575f5ffd5b50609754610305906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610328575f5ffd5b5061030561033736600461263c565b610763565b348015610347575f5ffd5b506102e461076f565b6102e461035e36600461268d565b610783565b34801561036e575f5ffd5b5061037761083c565b604051908152602001610233565b348015610390575f5ffd5b5060fd5461021f90600160801b90046001600160401b031681565b3480156103b6575f5ffd5b506102e46103c5366004612750565b6108ed565b3480156103d5575f5ffd5b5061026960c954610100900460ff1660021490565b3480156103f5575f5ffd5b506102e4610af6565b348015610409575f5ffd5b506102e4610b07565b34801561041d575f5ffd5b506102e4610b7e565b348015610431575f5ffd5b50610305610b91565b348015610445575f5ffd5b506033546001600160a01b0316610305565b348015610462575f5ffd5b5061030571777735367b36bc9b61c50022d9d0700db4ec81565b348015610487575f5ffd5b5060fd5461021f90600160c01b90046001600160401b031681565b3480156104ad575f5ffd5b506104c16104bc3660046127b8565b610b9f565b604080519283526001600160401b03909116602083015201610233565b3480156104e9575f5ffd5b506103056104f83660046127e9565b610c15565b348015610508575f5ffd5b5060fd5461021f906001600160401b031681565b348015610527575f5ffd5b50610530610c2a565b60408051825163ffffffff16815260209283015160ff169281019290925201610233565b34801561055f575f5ffd5b506102e461056e366004612817565b610c5b565b34801561057e575f5ffd5b5061037760fc5481565b348015610593575f5ffd5b5060c95461021f906201000090046001600160401b031681565b3480156105b8575f5ffd5b506065546001600160a01b0316610305565b3480156105d5575f5ffd5b506104c16105e436600461285f565b610d2b565b3480156105f4575f5ffd5b506103776106033660046128a7565b610e0d565b348015610613575f5ffd5b506102e4610622366004612614565b610e45565b348015610632575f5ffd5b506102e46106413660046128be565b610eb6565b348015610651575f5ffd5b506102e46106603660046128ea565b611075565b5f6106718484846114df565b90505b9392505050565b5f600261068a60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100011630036106e45760405162461bcd60e51b81526004016106db9061292b565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000100016001600160a01b031661071661159a565b6001600160a01b03161461073c5760405162461bcd60e51b81526004016106db90612977565b610745816115b5565b604080515f80825260208201909252610760918391906115bd565b50565b5f610671848484611727565b610777611779565b610781335f611809565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100011630036107cb5760405162461bcd60e51b81526004016106db9061292b565b7f00000000000000000000000001670000000000000000000000000000000100016001600160a01b03166107fd61159a565b6001600160a01b0316146108235760405162461bcd60e51b81526004016106db90612977565b61082c826115b5565b610838828260016115bd565b5050565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000001000116146108db5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106db565b505f516020612c045f395f51905f5290565b5f54610100900460ff161580801561090b57505f54600160ff909116105b806109245750303b15801561092457505f5460ff166001145b6109875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106db565b5f805460ff1916600117905580156109a8575f805461ff0019166101001790555b6109b28585611811565b6001600160401b03831615806109d0575046836001600160401b0316145b156109ee576040516308279a2560e31b815260040160405180910390fd5b600146111580610a0457506001600160401b0346115b15610a2257604051638f972ecb60e01b815260040160405180910390fd5b4315610a6c5743600103610a53575f610a3c6001436129d7565b5f81815260fb602052604090209040905550610a6c565b604051635a0f9e4160e11b815260040160405180910390fd5b60fe80546001600160401b0380861667ffffffffffffffff199283161790925560fd805492851692909116919091179055610aa64361184b565b5060fc558015610aef575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610afe6118db565b6107815f611935565b60655433906001600160a01b03168114610b755760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016106db565b61076081611935565b610b8661194e565b610781336001611809565b5f610b9a61159a565b905090565b5f5f5f610baa610c2a565b9050610c09816020015160ff16825f015163ffffffff16610bcb91906129ea565b60fd5483516001600160401b038083169263ffffffff90921691610bf891600160401b909104168a612a01565b610c029190612a20565b875f6119bf565b90969095509350505050565b5f610c21468484611727565b90505b92915050565b604080518082019091525f8082526020820152610b9a60408051808201909152630393870081526008602082015290565b825f819003610c7d5760405163ec73295960e01b815260040160405180910390fd5b826001600160401b0316805f03610ca75760405163ec73295960e01b815260040160405180910390fd5b3371777735367b36bc9b61c50022d9d0700db4ec14610cd957604051636494e9f760e01b815260040160405180910390fd5b6002610ce760c95460ff1690565b60ff1603610d085760405163dfc60d8560e01b815260040160405180910390fd5b610d126002611a48565b604051631799c89b60e01b815260040160405180910390fd5b5f8080610d3e6060880160408901612a60565b610d4e9063ffffffff1687612a20565b9050610d6060a0880160808901612a60565b63ffffffff1615801590610d915750610d7f60a0880160808901612a60565b63ffffffff16816001600160401b0316115b15610daf57610da660a0880160808901612a60565b63ffffffff1690505b5f610dbd6020890189612a79565b60ff16610dd060608a0160408b01612a60565b63ffffffff16610de091906129ea565b9050610dfe81878488610df960808e0160608f01612a99565b6119bf565b93509350505094509492505050565b5f438210610e1c57505f919050565b43610e2983610100612ab2565b10610e3357504090565b505f90815260fb602052604090205490565b610e4d6118db565b606580546001600160a01b0383166001600160a01b03199091168117909155610e7e6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610eca60c954610100900460ff1660021490565b15610ee85760405163bae6e2a960e01b815260040160405180910390fd5b693bb4ba34323930bbb2b960b11b610f086033546001600160a01b031690565b6001600160a01b0316336001600160a01b031614158015610f455750610f2f816001610c15565b6001600160a01b0316336001600160a01b031614155b15610f6357604051630d85cccf60e11b815260040160405180910390fd5b6002610f7160c95460ff1690565b60ff1603610f925760405163dfc60d8560e01b815260040160405180910390fd5b610f9c6002611a48565b6001600160a01b038216610fc35760405163053fd54760e01b815260040160405180910390fd5b6001600160a01b038316610fe957610fe46001600160a01b03831647611a5e565b611066565b6040516370a0823160e01b81523060048201526110669083906001600160a01b038616906370a0823190602401602060405180830381865afa158015611031573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110559190612a49565b6001600160a01b0386169190611a69565b6110706001611a48565b505050565b825f8190036110975760405163ec73295960e01b815260040160405180910390fd5b846001600160401b0316805f036110c15760405163ec73295960e01b815260040160405180910390fd5b6110d16060840160408501612a60565b63ffffffff16805f036110f75760405163ec73295960e01b815260040160405180910390fd5b6111046020850185612a79565b60ff16805f036111275760405163ec73295960e01b815260040160405180910390fd5b3371777735367b36bc9b61c50022d9d0700db4ec1461115957604051636494e9f760e01b815260040160405180910390fd5b600261116760c95460ff1690565b60ff16036111885760405163dfc60d8560e01b815260040160405180910390fd5b6111926002611a48565b5f61119e6001436129d7565b90505f5f6111ab8361184b565b915091508160fc54146111d15760405163d719258d60e01b815260040160405180910390fd5b60fc55505f6111e36020880188612a79565b60ff166111f66060890160408a01612a60565b63ffffffff166112069190612a20565b60fd549091506001600160401b03808316600160c01b90920416146112a15760fd54600160c01b90046001600160401b0316156112805760fd5461125e906001600160401b0380821691600160c01b90041683610665565b60fd805467ffffffffffffffff19166001600160401b03929092169190911790555b60fd80546001600160c01b0316600160c01b6001600160401b038416021790555b5060fd545f9081906112db9089906112c990600160801b90046001600160401b0316426129d7565b60fd546001600160401b03168c610d2b565b915091506112e65f90565b1580156112f35750814814155b15611311576040516336d54d4f60e11b815260040160405180910390fd5b60fd805467ffffffffffffffff19166001600160401b039283161790819055600160401b90048116908b16111590506114365761135f6d7369676e616c5f7365727669636560901b5f610c15565b60fe546040516313e4299d60e21b81526001600160401b0391821660048201527f73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da1696024820152908b166044820152606481018a90526001600160a01b039190911690634f90a674906084016020604051808303815f875af11580156113e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140a9190612a49565b5060fd80546fffffffffffffffff00000000000000001916600160401b6001600160401b038c16021790555b5f81815260fb60205260409081902082409081905560fd80546001600160401b03428116600160801b0267ffffffffffffffff60801b1983168117909355935192937f41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4936114c1938693908316921691909117909182526001600160401b0316602082015260400190565b60405180910390a150506114d56001611a48565b5050505050505050565b5f826001600160401b03165f036114f7575080610674565b670de0b6b3a76400005f6001600160401b0380861690611519908616846129ea565b6115239190612ad9565b90506001600160ff1b0381111561154d57604051636296f1b960e11b815260040160405180910390fd5b5f61155782611abb565b90505f828802828702015f81126001811461157657858204925061157a565b5f92505b5061158e9050816001600160401b03611cd8565b98975050505050505050565b5f516020612c045f395f51905f52546001600160a01b031690565b6107606118db565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156115f05761107083611cec565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561164a575060408051601f3d908101601f1916820190925261164791810190612a49565b60015b6116ad5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106db565b5f516020612c045f395f51905f52811461171b5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106db565b50611070838383611d87565b5f6117328484611db1565b90508115801561174957506001600160a01b038116155b1561067457604051632b0d65db60e01b81526001600160401b0385166004820152602481018490526044016106db565b61178d60c954610100900460ff1660021490565b6117aa5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6108386118db565b806001600160a01b0381166118395760405163538ba4f960e01b815260040160405180910390fd5b61184283611e5b565b61107082611eb9565b5f5f611855612585565b5f5b60ff8110801561186a5750806001018510155b1561189b575f198186030180408360ff8306610100811061188d5761188d612aec565b602002015250600101611857565b5046611fe0820152612000812092508340816118b860ff87612b00565b61010081106118c9576118c9612aec565b60200201526120009020919391925050565b6033546001600160a01b031633146107815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106db565b606580546001600160a01b031916905561076081611f29565b61196260c954610100900460ff1660021490565b156119805760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016117ff565b5f80806119db63ffffffff86166001600160401b038916612ab2565b9050856001600160401b031681116119f4576001611a07565b611a076001600160401b038716826129d7565b9050611a266001600160401b03611a2083878316611f7a565b90611cd8565b9150611a3b826001600160401b031689611f8f565b9250509550959350505050565b60c9805460ff191660ff92909216919091179055565b61083882825a611fbe565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611070908490612001565b6fffffffffffffffffffffffffffffffff811160071b81811c6001600160401b031060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b175f8213611b1757631615e6385f526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d6c8c3f38e95a6b1ff2ab1c3b343619018302821d6d02384773bdf1ac5676facced60901901830290911d6cb9a025d814b29c212b8b1a07cd1901909102780a09507084cc699bb0e71ea869ffffffffffffffffffffffff190105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b5f818311611ce65782610c21565b50919050565b6001600160a01b0381163b611d595760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106db565b5f516020612c045f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611d90836120d4565b5f82511180611d9c5750805b1561107057611dab8383612113565b50505050565b6097545f906001600160a01b031680611ddd57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611e2f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e539190612b13565b949350505050565b5f54610100900460ff16611e815760405162461bcd60e51b81526004016106db90612b2e565b611e89612138565b611ea76001600160a01b03821615611ea15781611935565b33611935565b5060c9805461ff001916610100179055565b5f54610100900460ff16611edf5760405162461bcd60e51b81526004016106db90612b2e565b6001600160401b03461115611f075760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f818311611f885781610c21565b5090919050565b5f5f82611f9c858561215e565b611fa69190612ad9565b90508015611fb45780611e53565b5060019392505050565b815f03611fca57505050565b611fe483838360405180602001604052805f8152506121d8565b61107057604051634c67134d60e11b815260040160405180910390fd5b5f612055826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122159092919063ffffffff16565b905080515f14806120755750808060200190518101906120759190612b79565b6110705760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106db565b6120dd81611cec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610c218383604051806060016040528060278152602001612c2460279139612223565b5f54610100900460ff166107815760405162461bcd60e51b81526004016106db90612b2e565b5f815f0361217f57604051636296f1b960e11b815260040160405180910390fd5b5f8261219385670de0b6b3a76400006129ea565b61219d9190612ad9565b9050680755bf798b4a1bf1e48111156121bc5750680755bf798b4a1bf1e45b670de0b6b3a76400006121ce82612297565b611e539190612ad9565b5f6001600160a01b03851661220057604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b606061067184845f85612411565b60605f5f856001600160a01b03168560405161223f9190612bb6565b5f60405180830381855af49150503d805f8114612277576040519150601f19603f3d011682016040523d82523d5f602084013e61227c565b606091505b509150915061228d868383876124e8565b9695505050505050565b5f68023f2fa8f6da5b9d281982136122ae57919050565b680755bf798b4a1bf1e582126122cb5763a37bfec95f526004601cfd5b6503782dace9d9604e83901b0591505f60606bb17217f7d1cf79abc9e3b39884821b056001605f1b01901d6bb17217f7d1cf79abc9e3b39881029093036c240c330e9fb2d9cbaf0fd5aafb1981018102606090811d6d0277594991cfc85f6e2461837cd9018202811d6d1a521255e34f6a5061b25ef1c9c319018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d6e02c72388d9f74f51a9331fed693f1419018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084016d01d3967ed30fc4f89c02bab5708119010290911d6e0587f503bb6ea29d25fcb740196450019091026d360d7aeea093263ecc6e0ecb291760621b010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6060824710156124725760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106db565b5f5f866001600160a01b0316858760405161248d9190612bb6565b5f6040518083038185875af1925050503d805f81146124c7576040519150601f19603f3d011682016040523d82523d5f602084013e6124cc565b606091505b50915091506124dd878383876124e8565b979650505050505050565b606083156125565782515f0361254f576001600160a01b0385163b61254f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106db565b5081611e53565b611e53838381511561256b5781518083602001fd5b8060405162461bcd60e51b81526004016106db9190612bd1565b604051806120000160405280610100906020820280368337509192915050565b80356001600160401b03811681146125bb575f5ffd5b919050565b5f5f5f606084860312156125d2575f5ffd5b6125db846125a5565b92506125e9602085016125a5565b91506125f7604085016125a5565b90509250925092565b6001600160a01b0381168114610760575f5ffd5b5f60208284031215612624575f5ffd5b813561067481612600565b8015158114610760575f5ffd5b5f5f5f6060848603121561264e575f5ffd5b612657846125a5565b925060208401359150604084013561266e8161262f565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561269e575f5ffd5b82356126a981612600565b915060208301356001600160401b038111156126c3575f5ffd5b8301601f810185136126d3575f5ffd5b80356001600160401b038111156126ec576126ec612679565b604051601f8201601f19908116603f011681016001600160401b038111828210171561271a5761271a612679565b604052818152828201602001871015612731575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f5f60808587031215612763575f5ffd5b843561276e81612600565b9350602085013561277e81612600565b925061278c604086016125a5565b915061279a606086016125a5565b905092959194509250565b803563ffffffff811681146125bb575f5ffd5b5f5f604083850312156127c9575f5ffd5b6127d2836125a5565b91506127e0602084016127a5565b90509250929050565b5f5f604083850312156127fa575f5ffd5b82359150602083013561280c8161262f565b809150509250929050565b5f5f5f5f6080858703121561282a575f5ffd5b8435935060208501359250612841604086016125a5565b915061279a606086016127a5565b5f60a08284031215611ce6575f5ffd5b5f5f5f5f6101008587031215612873575f5ffd5b61287d868661284f565b935061288b60a086016125a5565b925061289960c086016125a5565b915061279a60e086016127a5565b5f602082840312156128b7575f5ffd5b5035919050565b5f5f604083850312156128cf575f5ffd5b82356128da81612600565b9150602083013561280c81612600565b5f5f5f5f61010085870312156128fe575f5ffd5b612907856125a5565b93506020850135925061291c604086016127a5565b915061279a866060870161284f565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c2457610c246129c3565b8082028115828204841417610c2457610c246129c3565b6001600160401b038281168282160390811115610c2457610c246129c3565b6001600160401b038181168382160290811690818114612a4257612a426129c3565b5092915050565b5f60208284031215612a59575f5ffd5b5051919050565b5f60208284031215612a70575f5ffd5b610c21826127a5565b5f60208284031215612a89575f5ffd5b813560ff81168114610674575f5ffd5b5f60208284031215612aa9575f5ffd5b610c21826125a5565b80820180821115610c2457610c246129c3565b634e487b7160e01b5f52601260045260245ffd5b5f82612ae757612ae7612ac5565b500490565b634e487b7160e01b5f52603260045260245ffd5b5f82612b0e57612b0e612ac5565b500690565b5f60208284031215612b23575f5ffd5b815161067481612600565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612b89575f5ffd5b81516106748161262f565b5f5b83811015612bae578181015183820152602001612b96565b50505f910152565b5f8251612bc7818460208701612b94565b9190910192915050565b602081525f8251806020840152612bef816040850160208701612b94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220effaa84efcacfc056fb02202f151620faec2208bfd9251bf5034a0d35854a32e64736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000010001": { - "contractName": "TaikoL2", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000010002", - "0x00000000000000000000000000000000000000000000000000000000000000fe": "0x0000000000000000000000000000000000000000000000000000000000007a69", - "0x00000000000000000000000000000000000000000000000000000000000000fd": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000000000000000000000000000000000000fc": "0x56648745cb667f52a0ae5eb338ad021411cede74141e72933401adba6c132b01", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000010001" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010002": { - "contractName": "RollupAddressManagerImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x608060405260043610610126575f3560e01c80635c975abb116100a85780638da5cb5b1161006d5780638da5cb5b14610301578063a86f9d9e1461031e578063d8f4648f1461033d578063e07baba61461035c578063e30c39781461039b578063f2fde38b146103b8575f5ffd5b80635c975abb14610291578063715018a6146102b157806379ba5097146102c55780638456cb59146102d95780638abf6077146102ed575f5ffd5b80633ab76e9f116100ee5780633ab76e9f1461020a5780633eb6b8cf146102295780633f4ba83a146102485780634f1ef2861461025c57806352d1902d1461026f575f5ffd5b8063069489a21461012a57806319ab453c1461014057806328f713cc1461015f5780633075db56146101c75780633659cfe6146101eb575b5f5ffd5b348015610135575f5ffd5b5061013e6103d7565b005b34801561014b575f5ffd5b5061013e61015a36600461110e565b610487565b34801561016a575f5ffd5b506101aa610179366004611145565b67ffffffffffffffff919091165f90815260fb6020908152604080832093835292905220546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d2575f5ffd5b506101db61055f565b60405190151581526020016101be565b3480156101f6575f5ffd5b5061013e61020536600461110e565b610577565b348015610215575f5ffd5b506097546101aa906001600160a01b031681565b348015610234575f5ffd5b506101aa61024336600461117c565b61063e565b348015610253575f5ffd5b5061013e610654565b61013e61026a3660046111c9565b610668565b34801561027a575f5ffd5b5061028361071d565b6040519081526020016101be565b34801561029c575f5ffd5b506101db60c954610100900460ff1660021490565b3480156102bc575f5ffd5b5061013e6107ce565b3480156102d0575f5ffd5b5061013e6107df565b3480156102e4575f5ffd5b5061013e610856565b3480156102f8575f5ffd5b506101aa610869565b34801561030c575f5ffd5b506033546001600160a01b03166101aa565b348015610329575f5ffd5b506101aa61033836600461128f565b610877565b348015610348575f5ffd5b5061013e6103573660046112b9565b610883565b348015610367575f5ffd5b5060c9546103829062010000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101be565b3480156103a6575f5ffd5b506065546001600160a01b03166101aa565b3480156103c3575f5ffd5b5061013e6103d236600461110e565b610961565b6103df6109d2565b5f54600290610100900460ff161580156103ff57505f5460ff8083169116105b6104245760405162461bcd60e51b815260040161041b906112f6565b60405180910390fd5b5f8054609780546001600160a01b0319163017905561ffff191660ff83169081176101001761ff0019169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b5f54610100900460ff16158080156104a557505f54600160ff909116105b806104be5750303b1580156104be57505f5460ff166001145b6104da5760405162461bcd60e51b815260040161041b906112f6565b5f805460ff1916600117905580156104fb575f805461ff0019166101001790555b61050482610a2c565b609780546001600160a01b03191630179055801561055b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f600261056e60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100021630036105bf5760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000100026001600160a01b03166105f1610a8a565b6001600160a01b0316146106175760405162461bcd60e51b815260040161041b90611390565b61062081610aa5565b604080515f8082526020820190925261063b91839190610aad565b50565b5f61064a848484610c1c565b90505b9392505050565b61065c610c6f565b610666335f610d00565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100021630036106b05760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000100026001600160a01b03166106e2610a8a565b6001600160a01b0316146107085760405162461bcd60e51b815260040161041b90611390565b61071182610aa5565b61055b82826001610aad565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000001000216146107bc5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161041b565b505f5160206114c95f395f51905f5290565b6107d66109d2565b6106665f610d19565b60655433906001600160a01b0316811461084d5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161041b565b61063b81610d19565b61085e610d32565b610666336001610d00565b5f610872610a8a565b905090565b5f61064d468484610c1c565b61088b6109d2565b67ffffffffffffffff83165f90815260fb602090815260408083208584529091529020546001600160a01b039081169082168190036108dd5760405163a883089360e01b815260040160405180910390fd5b67ffffffffffffffff84165f81815260fb6020908152604080832087845282529182902080546001600160a01b0319166001600160a01b038781169182179092558351908152908516918101919091528592917f500dcd607a98daece9bccc2511bf6032471252929de73caf507aae0e082f8453910160405180910390a350505050565b6109696109d2565b606580546001600160a01b0383166001600160a01b0319909116811790915561099a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b031633146106665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161041b565b5f54610100900460ff16610a525760405162461bcd60e51b815260040161041b906113dc565b610a5a610da3565b610a786001600160a01b03821615610a725781610d19565b33610d19565b5060c9805461ff001916610100179055565b5f5160206114c95f395f51905f52546001600160a01b031690565b61063b6109d2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610ae557610ae083610dc9565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610b3f575060408051601f3d908101601f19168201909252610b3c91810190611427565b60015b610ba25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161041b565b5f5160206114c95f395f51905f528114610c105760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161041b565b50610ae0838383610e64565b5f610c278484610e8e565b905081158015610c3e57506001600160a01b038116155b1561064d57604051632b0d65db60e01b815267ffffffffffffffff851660048201526024810184905260440161041b565b610c8360c954610100900460ff1660021490565b610ca05760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff0019909116620100004267ffffffffffffffff1602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b604051630c2b8f8f60e11b815260040160405180910390fd5b606580546001600160a01b031916905561063b81610f39565b610d4660c954610100900460ff1660021490565b15610d645760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610cf6565b5f54610100900460ff166106665760405162461bcd60e51b815260040161041b906113dc565b6001600160a01b0381163b610e365760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161041b565b5f5160206114c95f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b610e6d83610f8a565b5f82511180610e795750805b15610ae057610e888383610fc9565b50505050565b6097545f906001600160a01b031680610eba57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b815267ffffffffffffffff85166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610f0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f31919061143e565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610f9381610dc9565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061064d83836040518060600160405280602781526020016114e96027913960605f5f856001600160a01b031685604051611005919061147b565b5f60405180830381855af49150503d805f811461103d576040519150601f19603f3d011682016040523d82523d5f602084013e611042565b606091505b50915091506110538683838761105d565b9695505050505050565b606083156110cb5782515f036110c4576001600160a01b0385163b6110c45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161041b565b5081610f31565b610f3183838151156110e05781518083602001fd5b8060405162461bcd60e51b815260040161041b9190611496565b6001600160a01b038116811461063b575f5ffd5b5f6020828403121561111e575f5ffd5b813561064d816110fa565b803567ffffffffffffffff81168114611140575f5ffd5b919050565b5f5f60408385031215611156575f5ffd5b61115f83611129565b946020939093013593505050565b80358015158114611140575f5ffd5b5f5f5f6060848603121561118e575f5ffd5b61119784611129565b9250602084013591506111ac6040850161116d565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156111da575f5ffd5b82356111e5816110fa565b9150602083013567ffffffffffffffff811115611200575f5ffd5b8301601f81018513611210575f5ffd5b803567ffffffffffffffff81111561122a5761122a6111b5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611259576112596111b5565b604052818152828201602001871015611270575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f604083850312156112a0575f5ffd5b823591506112b06020840161116d565b90509250929050565b5f5f5f606084860312156112cb575f5ffd5b6112d484611129565b92506020840135915060408401356112eb816110fa565b809150509250925092565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215611437575f5ffd5b5051919050565b5f6020828403121561144e575f5ffd5b815161064d816110fa565b5f5b8381101561147357818101518382015260200161145b565b50505f910152565b5f825161148c818460208701611459565b9190910192915050565b602081525f82518060208401526114b4816040850160208701611459565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220086d22e71c4d170ad7ce74f948ce47f2f39076babb18c7b950d99c756006877464736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000010002": { - "contractName": "RollupAddressManager", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x6f603ad772aee14bf097b20bcdc2c1ce5646bfcfbe0e42c192e55416269268c9": "0x0000000000000000000000001670000000000000000000000000000000010001", - "0xee78643889fcb54c297d0ecf866d9df7d829a8c978e52394d135cdb40a501e38": "0x0000000000000000000000001670000000000000000000000000000000000001", - "0xd724ebf31fb7ffa376a4d5d51b51967009df0c86a4dfef5f55507cde2eb36739": "0x0000000000000000000000001670000000000000000000000000000000000005", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000010002" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0xbB21206518394cd6DaF38A6C31A3B1461b77CBC8": { - "contractName": "LibNetwork", - "storage": {}, - "code": "0x730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212204213774d0b1a3b266888223284a425ae694a8c5e97b18403ec7f442200eae55a64736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010099": { - "contractName": "RegularERC20", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x526567756c617245524332300000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x52474c0000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000001f4000", - "0x1fe6b582a6b4d9b61da9024a045cb9bafc343b4b12713ba001e47b3500867413": "0x00000000000000000000000000000000000000000000000000000000000fa000", - "0xaaa7f9b700b86a1f8ec5dacd0ca81e3b1ea8214dae2b1856095f9d44c1f5b380": "0x00000000000000000000000000000000000000000000000000000000000fa000" - }, - "code": "0x608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c8063395093511161006e578063395093511461011f57806370a082311461013257806395d89b411461015a578063a457c2d714610162578063a9059cbb14610175578063dd62ed3e14610188575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b261019b565b6040516100bf919061068a565b60405180910390f35b6100db6100d63660046106f0565b61022b565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b366004610718565b610244565b604051601281526020016100bf565b6100db61012d3660046106f0565b610267565b6100ef610140366004610752565b6001600160a01b03165f9081526020819052604090205490565b6100b2610288565b6100db6101703660046106f0565b610297565b6100db6101833660046106f0565b610316565b6100ef610196366004610772565b610323565b6060600380546101aa906107a3565b80601f01602080910402602001604051908101604052809291908181526020018280546101d6906107a3565b80156102215780601f106101f857610100808354040283529160200191610221565b820191905f5260205f20905b81548152906001019060200180831161020457829003601f168201915b5050505050905090565b5f3361023881858561034d565b60019150505b92915050565b5f33610251858285610470565b61025c8585856104e8565b506001949350505050565b5f336102388185856102798383610323565b61028391906107db565b61034d565b6060600480546101aa906107a3565b5f33816102a48286610323565b9050838110156103095760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61025c828686840361034d565b5f336102388185856104e8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610300565b6001600160a01b0382166104105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610300565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61047b8484610323565b90505f1981146104e257818110156104d55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610300565b6104e2848484840361034d565b50505050565b6001600160a01b03831661054c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610300565b6001600160a01b0382166105ae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610300565b6001600160a01b0383165f90815260208190526040902054818110156106255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610300565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104e2565b602081525f82518060208401525f5b818110156106b65760208186018101516040868401015201610699565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146106eb575f5ffd5b919050565b5f5f60408385031215610701575f5ffd5b61070a836106d5565b946020939093013593505050565b5f5f5f6060848603121561072a575f5ffd5b610733846106d5565b9250610741602085016106d5565b929592945050506040919091013590565b5f60208284031215610762575f5ffd5b61076b826106d5565b9392505050565b5f5f60408385031215610783575f5ffd5b61078c836106d5565b915061079a602084016106d5565b90509250929050565b600181811c908216806107b757607f821691505b6020821081036107d557634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561023e57634e487b7160e01b5f52601160045260245ffdfea2646970667358221220a1403924b9774521e0b2e4d325575d166c7612abf0d4b532ee23317cd4225a6b64736f6c634300081b0033", - "balance": "0x0" - } -}} diff --git a/packages/protocol/test/genesis/data/genesis_alloc.json b/packages/protocol/test/genesis/data/genesis_alloc.json deleted file mode 100644 index f1a0cdd0d91..00000000000 --- a/packages/protocol/test/genesis/data/genesis_alloc.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": { - "balance": "0x3635c9adc5dea00000" - }, - "0x79fcdef22feed20eddacbb2587640e45491b757f": { - "balance": "0x3635c9adc5dea00000" - }, - "0x0167000000000000000000000000000000000006": { - "contractName": "SharedAddressManagerImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x608060405260043610610126575f3560e01c80635c975abb116100a85780638da5cb5b1161006d5780638da5cb5b14610301578063a86f9d9e1461031e578063d8f4648f1461033d578063e07baba61461035c578063e30c39781461039b578063f2fde38b146103b8575f5ffd5b80635c975abb14610291578063715018a6146102b157806379ba5097146102c55780638456cb59146102d95780638abf6077146102ed575f5ffd5b80633ab76e9f116100ee5780633ab76e9f1461020a5780633eb6b8cf146102295780633f4ba83a146102485780634f1ef2861461025c57806352d1902d1461026f575f5ffd5b8063069489a21461012a57806319ab453c1461014057806328f713cc1461015f5780633075db56146101c75780633659cfe6146101eb575b5f5ffd5b348015610135575f5ffd5b5061013e6103d7565b005b34801561014b575f5ffd5b5061013e61015a36600461110e565b610487565b34801561016a575f5ffd5b506101aa610179366004611145565b67ffffffffffffffff919091165f90815260fb6020908152604080832093835292905220546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d2575f5ffd5b506101db61055f565b60405190151581526020016101be565b3480156101f6575f5ffd5b5061013e61020536600461110e565b610577565b348015610215575f5ffd5b506097546101aa906001600160a01b031681565b348015610234575f5ffd5b506101aa61024336600461117c565b61063e565b348015610253575f5ffd5b5061013e610654565b61013e61026a3660046111c9565b610668565b34801561027a575f5ffd5b5061028361071d565b6040519081526020016101be565b34801561029c575f5ffd5b506101db60c954610100900460ff1660021490565b3480156102bc575f5ffd5b5061013e6107ce565b3480156102d0575f5ffd5b5061013e6107df565b3480156102e4575f5ffd5b5061013e610856565b3480156102f8575f5ffd5b506101aa610869565b34801561030c575f5ffd5b506033546001600160a01b03166101aa565b348015610329575f5ffd5b506101aa61033836600461128f565b610877565b348015610348575f5ffd5b5061013e6103573660046112b9565b610883565b348015610367575f5ffd5b5060c9546103829062010000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101be565b3480156103a6575f5ffd5b506065546001600160a01b03166101aa565b3480156103c3575f5ffd5b5061013e6103d236600461110e565b610961565b6103df6109d2565b5f54600290610100900460ff161580156103ff57505f5460ff8083169116105b6104245760405162461bcd60e51b815260040161041b906112f6565b60405180910390fd5b5f8054609780546001600160a01b0319163017905561ffff191660ff83169081176101001761ff0019169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b5f54610100900460ff16158080156104a557505f54600160ff909116105b806104be5750303b1580156104be57505f5460ff166001145b6104da5760405162461bcd60e51b815260040161041b906112f6565b5f805460ff1916600117905580156104fb575f805461ff0019166101001790555b61050482610a2c565b609780546001600160a01b03191630179055801561055b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f600261056e60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000061630036105bf5760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000000066001600160a01b03166105f1610a8a565b6001600160a01b0316146106175760405162461bcd60e51b815260040161041b90611390565b61062081610aa5565b604080515f8082526020820190925261063b91839190610aad565b50565b5f61064a848484610c1c565b90505b9392505050565b61065c610c6f565b610666335f610d00565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000061630036106b05760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000000066001600160a01b03166106e2610a8a565b6001600160a01b0316146107085760405162461bcd60e51b815260040161041b90611390565b61071182610aa5565b61055b82826001610aad565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000000000616146107bc5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161041b565b505f5160206114c95f395f51905f5290565b6107d66109d2565b6106665f610d19565b60655433906001600160a01b0316811461084d5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161041b565b61063b81610d19565b61085e610d32565b610666336001610d00565b5f610872610a8a565b905090565b5f61064d468484610c1c565b61088b6109d2565b67ffffffffffffffff83165f90815260fb602090815260408083208584529091529020546001600160a01b039081169082168190036108dd5760405163a883089360e01b815260040160405180910390fd5b67ffffffffffffffff84165f81815260fb6020908152604080832087845282529182902080546001600160a01b0319166001600160a01b038781169182179092558351908152908516918101919091528592917f500dcd607a98daece9bccc2511bf6032471252929de73caf507aae0e082f8453910160405180910390a350505050565b6109696109d2565b606580546001600160a01b0383166001600160a01b0319909116811790915561099a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b031633146106665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161041b565b5f54610100900460ff16610a525760405162461bcd60e51b815260040161041b906113dc565b610a5a610da3565b610a786001600160a01b03821615610a725781610d19565b33610d19565b5060c9805461ff001916610100179055565b5f5160206114c95f395f51905f52546001600160a01b031690565b61063b6109d2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610ae557610ae083610dc9565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610b3f575060408051601f3d908101601f19168201909252610b3c91810190611427565b60015b610ba25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161041b565b5f5160206114c95f395f51905f528114610c105760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161041b565b50610ae0838383610e64565b5f610c278484610e8e565b905081158015610c3e57506001600160a01b038116155b1561064d57604051632b0d65db60e01b815267ffffffffffffffff851660048201526024810184905260440161041b565b610c8360c954610100900460ff1660021490565b610ca05760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff0019909116620100004267ffffffffffffffff1602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b604051630c2b8f8f60e11b815260040160405180910390fd5b606580546001600160a01b031916905561063b81610f39565b610d4660c954610100900460ff1660021490565b15610d645760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610cf6565b5f54610100900460ff166106665760405162461bcd60e51b815260040161041b906113dc565b6001600160a01b0381163b610e365760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161041b565b5f5160206114c95f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b610e6d83610f8a565b5f82511180610e795750805b15610ae057610e888383610fc9565b50505050565b6097545f906001600160a01b031680610eba57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b815267ffffffffffffffff85166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610f0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f31919061143e565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610f9381610dc9565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061064d83836040518060600160405280602781526020016114e96027913960605f5f856001600160a01b031685604051611005919061147b565b5f60405180830381855af49150503d805f811461103d576040519150601f19603f3d011682016040523d82523d5f602084013e611042565b606091505b50915091506110538683838761105d565b9695505050505050565b606083156110cb5782515f036110c4576001600160a01b0385163b6110c45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161041b565b5081610f31565b610f3183838151156110e05781518083602001fd5b8060405162461bcd60e51b815260040161041b9190611496565b6001600160a01b038116811461063b575f5ffd5b5f6020828403121561111e575f5ffd5b813561064d816110fa565b803567ffffffffffffffff81168114611140575f5ffd5b919050565b5f5f60408385031215611156575f5ffd5b61115f83611129565b946020939093013593505050565b80358015158114611140575f5ffd5b5f5f5f6060848603121561118e575f5ffd5b61119784611129565b9250602084013591506111ac6040850161116d565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156111da575f5ffd5b82356111e5816110fa565b9150602083013567ffffffffffffffff811115611200575f5ffd5b8301601f81018513611210575f5ffd5b803567ffffffffffffffff81111561122a5761122a6111b5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611259576112596111b5565b604052818152828201602001871015611270575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f604083850312156112a0575f5ffd5b823591506112b06020840161116d565b90509250929050565b5f5f5f606084860312156112cb575f5ffd5b6112d484611129565b92506020840135915060408401356112eb816110fa565b809150509250925092565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215611437575f5ffd5b5051919050565b5f6020828403121561144e575f5ffd5b815161064d816110fa565b5f5b8381101561147357818101518382015260200161145b565b50505f910152565b5f825161148c818460208701611459565b9190910192915050565b602081525f82518060208401526114b4816040850160208701611459565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220086d22e71c4d170ad7ce74f948ce47f2f39076babb18c7b950d99c756006877464736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000006": { - "contractName": "SharedAddressManager", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0xee78643889fcb54c297d0ecf866d9df7d829a8c978e52394d135cdb40a501e38": "0x0000000000000000000000001670000000000000000000000000000000000001", - "0x1b59c5b714a9474274d08839cd27e78ebbcde0eb67d55f88e6a8162fdf746fb6": "0x0000000000000000000000001670000000000000000000000000000000000002", - "0x86f2835ec2a9687ca2e2a16b9bca18cc21a3eb0801913c2c1024c94dae29a56f": "0x0000000000000000000000001670000000000000000000000000000000000003", - "0xceda61f04213e952bfa0631c1d6a46e0243feddef01b15830df6d44a883942ef": "0x0000000000000000000000001670000000000000000000000000000000000004", - "0xd724ebf31fb7ffa376a4d5d51b51967009df0c86a4dfef5f55507cde2eb36739": "0x0000000000000000000000001670000000000000000000000000000000000005", - "0x7c370492eefc4caa8cbb896169c5fc4597f28c57333bb43e31066f4f66652c55": "0x0000000000000000000000000167000000000000000000000000000000010096", - "0xe6965834a21a9e0a0de81d5e0ea99e149f660508a785a52be0ad77b96b5b1c5c": "0x0000000000000000000000000167000000000000000000000000000000010097", - "0x83e96d9214b47c6368e642dca9daced8ea339555eb83dac20d7cbfb0cc0f5c7b": "0x0000000000000000000000000167000000000000000000000000000000010098", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000006" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000001": { - "contractName": "BridgeImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x60806040526004361061021d575f3560e01c806382b5e8891161011e578063b8acae0e116100a8578063e07baba61161006d578063e07baba61461066b578063e30c3978146106a8578063eefbf17e146106c5578063f09a4016146106eb578063f2fde38b1461070a575f5ffd5b8063b8acae0e146105af578063be880c81146105ce578063c012fa77146105e4578063d0496d6a14610603578063d1aaa5df1461064b575f5ffd5b80638e3881a9116100ee5780638e3881a9146104fe578063913b16cb1461053c5780639efc7a2e1461055b578063a730cdfb1461057a578063a86f9d9e14610590575f5ffd5b806382b5e8891461049a5780638456cb59146104b95780638abf6077146104cd5780638da5cb5b146104e1575f5ffd5b80633f4ba83a116101aa5780635c975abb1161016f5780635c975abb146103ff57806360620c6b1461041f578063715018a61461043e57806379ba5097146104525780637cbadfaa14610466575f5ffd5b80633f4ba83a14610381578063422770fa146103955780634f1ef286146103b957806352d1902d146103cc5780635862f6e1146103e0575f5ffd5b80633075db56116101f05780633075db56146102ad5780633659cfe6146102d15780633ab76e9f146102f05780633c6cf473146103275780633eb6b8cf14610362575f5ffd5b80630432873c14610221578063069489a2146102425780631bdb0037146102565780632035065e14610280575b5f5ffd5b34801561022c575f5ffd5b5061024061023b366004612f67565b610729565b005b34801561024d575f5ffd5b50610240610a27565b610269610264366004612fb5565b610ade565b604051610277929190613141565b60405180910390f35b34801561028b575f5ffd5b5061029f61029a366004613159565b610e94565b604051610277929190613216565b3480156102b8575f5ffd5b506102c1611344565b6040519015158152602001610277565b3480156102dc575f5ffd5b506102406102eb366004613265565b61135c565b3480156102fb575f5ffd5b5060975461030f906001600160a01b031681565b6040516001600160a01b039091168152602001610277565b348015610332575f5ffd5b50610355610341366004613280565b60fc6020525f908152604090205460ff1681565b6040516102779190613297565b34801561036d575f5ffd5b5061030f61037c3660046132bb565b611423565b34801561038c575f5ffd5b50610240611439565b3480156103a0575f5ffd5b506103ab62030d4081565b604051908152602001610277565b6102406103c73660046133be565b61144d565b3480156103d7575f5ffd5b506103ab611506565b3480156103eb575f5ffd5b506102c16103fa366004613159565b6115b8565b34801561040a575f5ffd5b506102c160c954610100900460ff1660021490565b34801561042a575f5ffd5b506102c1610439366004612fb5565b611623565b348015610449575f5ffd5b506102406116f1565b34801561045d575f5ffd5b50610240611702565b348015610471575f5ffd5b50610485610480366004613280565b611779565b60405163ffffffff9091168152602001610277565b3480156104a5575f5ffd5b506102406104b4366004613265565b611791565b3480156104c4575f5ffd5b50610240611811565b3480156104d8575f5ffd5b5061030f611824565b3480156104ec575f5ffd5b506033546001600160a01b031661030f565b348015610509575f5ffd5b5061051d61051836600461340a565b611832565b6040805192151583526001600160a01b03909116602083015201610277565b348015610547575f5ffd5b50610240610556366004612fb5565b61185e565b348015610566575f5ffd5b50610240610575366004613159565b611a4d565b348015610585575f5ffd5b506104856201d4c081565b34801561059b575f5ffd5b5061030f6105aa366004613423565b611d51565b3480156105ba575f5ffd5b506102c16105c9366004613159565b611d5d565b3480156105d9575f5ffd5b50610485620c350081565b3480156105ef575f5ffd5b506103ab6105fe366004613546565b611dbe565b34801561060e575f5ffd5b50610617611ded565b60408051825181526020808401516001600160a01b031690820152918101516001600160401b031690820152606001610277565b348015610656575f5ffd5b506103ab610665366004613280565b60031890565b348015610676575f5ffd5b5060c954610690906201000090046001600160401b031681565b6040516001600160401b039091168152602001610277565b3480156106b3575f5ffd5b506065546001600160a01b031661030f565b3480156106d0575f5ffd5b5060fb5461069090600160401b90046001600160401b031681565b3480156106f6575f5ffd5b50610240610705366004613577565b611e94565b348015610715575f5ffd5b50610240610724366004613265565b611f5b565b61073960e0830160c0840161340a565b46816001600160401b03161461076257604051631c6c777560e31b815260040160405180910390fd5b61077260a084016080850161340a565b6001600160401b0381161580610790575046816001600160401b0316145b156107ae57604051631c6c777560e31b815260040160405180910390fd5b6107c260c954610100900460ff1660021490565b156107e05760405163bae6e2a960e01b815260040160405180910390fd5b60026107ee60c95460ff1690565b60ff160361080f5760405163dfc60d8560e01b815260040160405180910390fd5b6108196002611fcc565b5f6108266105fe866135a3565b9050610833816001611fe2565b610841856101200135612034565b61085e576040516335856fbd60e21b815260040160405180910390fd5b5f6108838661087e6d7369676e616c5f7365727669636560901b5f611d51565b6120d5565b156108ce576108c78661012001356188b860405180602001604052805f8152508960e00160208101906108b69190613265565b6001600160a01b03169291906121cc565b9050610948565b6108de60608701604088016135ae565b63ffffffff1615806108ed5750845b801561091b5750610905610100870160e08801613265565b6001600160a01b0316336001600160a01b031614155b15610939576040516372b6e1c360e11b815260040160405180910390fd5b61094586835a5f612209565b90505b801561095e5761095982600261232d565b610a15565b84156109fc5761096f82600361232d565b61098a6d7369676e616c5f7365727669636560901b5f611d51565b60405163019b28af60e61b81526003841860048201526001600160a01b0391909116906366ca2bc0906024016020604051808303815f875af11580156109d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f691906135c7565b50610a15565b60405163161e3ead60e01b815260040160405180910390fd5b5050610a216001611fcc565b50505050565b610a2f6123ea565b5f54600290610100900460ff16158015610a4f57505f5460ff8083169116105b610a745760405162461bcd60e51b8152600401610a6b906135de565b60405180910390fd5b5f805460fb805467ffffffffffffffff1916905560ff82815561010083815561ff001991851661ffff19909316831717169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201839052610140820152610b4460c0840160a08501613265565b6001600160a01b038116610b6b5760405163538ba4f960e01b815260040160405180910390fd5b610b7c610100850160e08601613265565b6001600160a01b038116610ba35760405163538ba4f960e01b815260040160405180910390fd5b610bb360e0860160c0870161340a565b6001600160401b0381161580610bd1575046816001600160401b0316145b15610bef57604051631c6c777560e31b815260040160405180910390fd5b610c0360c954610100900460ff1660021490565b15610c215760405163bae6e2a960e01b815260040160405180910390fd5b6002610c2f60c95460ff1690565b60ff1603610c505760405163dfc60d8560e01b815260040160405180910390fd5b610c5a6002611fcc565b610c6a60608701604088016135ae565b63ffffffff165f03610cb257610c86604087016020880161340a565b6001600160401b031615610cad5760405163c9f5178760e01b815260040160405180910390fd5b610cda565b610cbb86612444565b5f03610cda576040516308c2ad5360e01b815260040160405180910390fd5b5f610cee61051860e0890160c08a0161340a565b50905080610d0f57604051631c6c777560e31b815260040160405180910390fd5b34610d206040890160208a0161340a565b610d38906001600160401b03166101208a0135613640565b14610d5657604051634ac2abdf60e11b815260040160405180910390fd5b610d5f876135a3565b60fb8054919650600160401b9091046001600160401b0316906008610d8383613653565b82546101009290920a6001600160401b03818102199093169183160217909155908116865233606087015246166080860152610dbe85611dbe565b9550857fe33fd33b4f45b95b1c196242240c5b5233129d724b578f95b66ce8d8aae9351786604051610df0919061367d565b60405180910390a2610e136d7369676e616c5f7365727669636560901b5f611d51565b6001600160a01b03166366ca2bc0876040518263ffffffff1660e01b8152600401610e4091815260200190565b6020604051808303815f875af1158015610e5c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8091906135c7565b5050610e8c6001611fcc565b505050915091565b5f5f610eaa60c954610100900460ff1660021490565b15610ec85760405163bae6e2a960e01b815260040160405180910390fd5b6002610ed660c95460ff1690565b60ff1603610ef75760405163dfc60d8560e01b815260040160405180910390fd5b610f016002611fcc565b5f5a905046610f1660e0880160c0890161340a565b6001600160401b031614610f3d57604051631c6c777560e31b815260040160405180910390fd5b610f4d60a087016080880161340a565b6001600160401b03161580610f79575046610f6e60a088016080890161340a565b6001600160401b0316145b15610f9757604051631c6c777560e31b815260040160405180910390fd5b604080516080810182525f808252602082018190529181018290526060810191909152610fcb610100880160e08901613265565b6001600160a01b031633148015606083015261103a57610ff160608801604089016135ae565b63ffffffff165f03611016576040516372b6e1c360e11b815260040160405180910390fd5b62030d4085111561103a57604051631e3b03c960e01b815260040160405180910390fd5b5f6110476105fe896135a3565b9050611053815f611fe2565b5f61106f6d7369676e616c5f7365727669636560901b5f611d51565b63ffffffff881660208501529050611099818361109260a08d0160808e0161340a565b8b8b612497565b63ffffffff166040808501919091526110d8906110bb908b0160208c0161340a565b6110d3906001600160401b03166101208c0135613640565b612034565b6110f5576040516335856fbd60e21b815260040160405180910390fd5b5f6111008a836120d5565b1561111957506002955060019450610120890135611160565b5f8460600151611129575a611132565b6111328b612444565b90506111448b85838860600151612209565b1561115557600297505f965061115e565b60019750600296505b505b61117060408b0160208c0161340a565b6001600160401b0316156112c15761118e60408b0160208c0161340a565b6111a1906001600160401b031682613640565b9050836060015180156111c857506111bf60608b0160408c016135ae565b63ffffffff1615155b156112c157604084015163ffffffff16614e20025a6111f56111ee6101408e018e61368f565b9050612542565b63ffffffff9081168801919091036201d4c00181168087525f91839161121e9183919061256a16565b0390505f61123260608e0160408f016135ae565b63ffffffff168d602001602081019061124b919061340a565b6001600160401b0316830281611263576112636136d8565b0490505f48830290505f6112a78f6020016020810190611283919061340a565b6001600160401b03168484101561129f5784840160011c6112a1565b845b9061257f565b958690039590506112bb33826188b8612593565b50505050505b6112e9816188b86112d96101008e0160e08f01613265565b6001600160a01b03169190612593565b6112f3838861232d565b827f8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d8b86604051611325929190613870565b60405180910390a2505050505061133c6001611fcc565b935093915050565b5f600261135360c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000011630036113a45760405162461bcd60e51b8152600401610a6b906138c4565b7f00000000000000000000000001670000000000000000000000000000000000016001600160a01b03166113d66125d6565b6001600160a01b0316146113fc5760405162461bcd60e51b8152600401610a6b90613910565b611405816125f1565b604080515f80825260208201909252611420918391906125f9565b50565b5f61142f848484612763565b90505b9392505050565b6114416127b5565b61144b335f612845565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000011630036114955760405162461bcd60e51b8152600401610a6b906138c4565b7f00000000000000000000000001670000000000000000000000000000000000016001600160a01b03166114c76125d6565b6001600160a01b0316146114ed5760405162461bcd60e51b8152600401610a6b90613910565b6114f6826125f1565b611502828260016125f9565b5050565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000000000116146115a55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a6b565b505f516020613b2a5f395f51905f525b90565b5f466115ca60a086016080870161340a565b6001600160401b0316146115df57505f611432565b61142f6115fd6d7369676e616c5f7365727669636560901b5f611d51565b61160c6106656105fe886135a3565b61161c60e0880160c0890161340a565b86866128f2565b5f4661163560a084016080850161340a565b6001600160401b03161461164a57505f919050565b6116656d7369676e616c5f7365727669636560901b5f611d51565b6001600160a01b03166332676bc6306116806105fe866135a3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156116c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116eb919061395c565b92915050565b6116f96123ea565b61144b5f612974565b60655433906001600160a01b031681146117705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610a6b565b61142081612974565b5f620c350061178783612542565b6116eb9190613977565b806001600160a01b0381166117b95760405163538ba4f960e01b815260040160405180910390fd5b6040516317066a5760e21b81523060048201526001600160a01b03831690635c19a95c906024015f604051808303815f87803b1580156117f7575f5ffd5b505af1158015611809573d5f5f3e3d5ffd5b505050505050565b61181961298d565b61144b336001612845565b5f61182d6125d6565b905090565b5f5f611849836562726964676560d01b6001611423565b6001600160a01b038116151594909350915050565b61186e60e0820160c0830161340a565b46816001600160401b03161461189757604051631c6c777560e31b815260040160405180910390fd5b6118a760a083016080840161340a565b6001600160401b03811615806118c5575046816001600160401b0316145b156118e357604051631c6c777560e31b815260040160405180910390fd5b6118f760c954610100900460ff1660021490565b156119155760405163bae6e2a960e01b815260040160405180910390fd5b600261192360c95460ff1690565b60ff16036119445760405163dfc60d8560e01b815260040160405180910390fd5b61194e6002611fcc565b61195f610100840160e08501613265565b6001600160a01b0316336001600160a01b031614611990576040516372b6e1c360e11b815260040160405180910390fd5b5f61199d6105fe856135a3565b90506119aa816001611fe2565b6119b581600361232d565b6119d06d7369676e616c5f7365727669636560901b5f611d51565b60405163019b28af60e61b81526003831860048201526001600160a01b0391909116906366ca2bc0906024016020604051808303815f875af1158015611a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3c91906135c7565b5050611a486001611fcc565b505050565b611a5d60a084016080850161340a565b46816001600160401b031614611a8657604051631c6c777560e31b815260040160405180910390fd5b611a9660e0850160c0860161340a565b6001600160401b0381161580611ab4575046816001600160401b0316145b15611ad257604051631c6c777560e31b815260040160405180910390fd5b611ae660c954610100900460ff1660021490565b15611b045760405163bae6e2a960e01b815260040160405180910390fd5b6002611b1260c95460ff1690565b60ff1603611b335760405163dfc60d8560e01b815260040160405180910390fd5b611b3d6002611fcc565b5f611b4a6105fe876135a3565b9050611b56815f611fe2565b5f611b726d7369676e616c5f7365727669636560901b5f611d51565b604051631933b5e360e11b8152306004820152602481018490529091506001600160a01b038216906332676bc690604401602060405180830381865afa158015611bbe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be2919061395c565b611bff5760405163ab035ad560e01b815260040160405180910390fd5b611c1e8160038418611c1760e08b0160c08c0161340a565b8989612497565b50611c2a82600461232d565b611c38876101200135612034565b611c55576040516335856fbd60e21b815260040160405180910390fd5b611c7e62bc399d60e11b611c6f60808a0160608b01613265565b6001600160a01b0316906129fe565b15611d2257611c9d8230611c9860a08b0160808c0161340a565b612a8b565b611cad6080880160608901613265565b6001600160a01b0316630178733a88610120013589856040518463ffffffff1660e01b8152600401611ce0929190613993565b5f604051808303818588803b158015611cf7575f5ffd5b505af1158015611d09573d5f5f3e3d5ffd5b5050505050611d1d5f195f1b5f1980612a8b565b611d3e565b611d3e6101208801356188b86112d960c08b0160a08c01613265565b5050611d4a6001611fcc565b5050505050565b5f611432468484612763565b5f46611d6f60e0860160c0870161340a565b6001600160401b031614611d8457505f611432565b61142f611da26d7369676e616c5f7365727669636560901b5f611d51565b611dae6105fe876135a3565b61161c60a088016080890161340a565b5f81604051602001611dd091906139b4565b604051602081830303815290604052805190602001209050919050565b604080516060810182525f8082526020820181905291810191909152611e64604080516060810182525f8082526020820181905291810191909152506040805160608101825260fd54815260fe546001600160a01b0381166020830152600160a01b90046001600160401b03169181019190915290565b80519091501580611e76575080515f19145b156115b557604051635ceed17360e01b815260040160405180910390fd5b5f54610100900460ff1615808015611eb257505f54600160ff909116105b80611ecb5750303b158015611ecb57505f5460ff166001145b611ee75760405162461bcd60e51b8152600401610a6b906135de565b5f805460ff191660011790558015611f08575f805461ff0019166101001790555b611f128383612ae0565b8015611a48575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b611f636123ea565b606580546001600160a01b0383166001600160a01b03199091168117909155611f946033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b806004811115611ff457611ff46131ee565b5f83815260fc602052604090205460ff166004811115612016576120166131ee565b14611502576040516319d893ad60e21b815260040160405180910390fd5b5f5f6120516c38bab7ba30afb6b0b730b3b2b960991b6001611d51565b90506001600160a01b03811661206a5750600192915050565b6040516315c638fb60e31b81525f6004820152602481018490526001600160a01b0382169063ae31c7d8906044015f604051808303815f87803b1580156120af575f5ffd5b505af19250505080156120c0575060015b6120cc57505f92915050565b50600192915050565b5f806120e961012085016101008601613265565b6001600160a01b0316036120ff575060016116eb565b3061211261012085016101008601613265565b6001600160a01b031603612128575060016116eb565b6001600160a01b03821661214461012085016101008601613265565b6001600160a01b03160361215a575060016116eb565b600461216a61014085018561368f565b9050101580156121a15750637f07c94760e01b61218b61014085018561368f565b612194916139ea565b6001600160e01b03191614155b801561143257506114326121bd61012085016101008601613265565b6001600160a01b03163b151590565b5f6001600160a01b0385166121f457604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b5f3061221b6080870160608801613265565b6001600160a01b03160361223157612231613a22565b610120850135158015612251575061224d61014086018661368f565b1590505b1561225e57506001612325565b825f0361226c57505f612325565b612290846122806080880160608901613265565b611c9860a0890160808a0161340a565b5f6122a361012087016101008801613265565b90506101208601355f6122ba61014089018961368f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525084519495509384935083925090506020850186888cf194505a90508515612314576123148188612b1a565b6123205f198080612a8b565b505050505b949350505050565b80600481111561233f5761233f6131ee565b5f83815260fc602052604090205460ff166004811115612361576123616131ee565b0361237f576040516319d893ad60e21b815260040160405180910390fd5b5f82815260fc60205260409020805482919060ff191660018360048111156123a9576123a96131ee565b0217905550817f6c51882bc2ed67617f77a1e9b9a25d2caad8448647ecb093b357a603b2575634826040516123de9190613297565b60405180910390a25050565b6033546001600160a01b0316331461144b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a6b565b5f8061245e61245761014085018561368f565b9050611779565b63ffffffff1690508061248f61247a60608601604087016135ae565b63ffffffff168361256a90919063ffffffff16565b039392505050565b5f856001600160a01b031663910af6ed856124bc876562726964676560d01b5f611423565b8887876040518663ffffffff1660e01b81526004016124df959493929190613a36565b6020604051808303815f875af1925050508015612519575060408051601f3d908101601f19168201909252612516918101906135c7565b60015b612536576040516314504c7360e31b815260040160405180910390fd5b90505b95945050505050565b5f815f0361255157505f919050565b60046020601f8401046020026101a001901b9050919050565b5f8183116125785781611432565b5090919050565b5f81831161258d5782611432565b50919050565b815f0361259f57505050565b6125b983838360405180602001604052805f8152506121cc565b611a4857604051634c67134d60e11b815260040160405180910390fd5b5f516020613b2a5f395f51905f52546001600160a01b031690565b6114206123ea565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561262c57611a4883612b2e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612686575060408051601f3d908101601f19168201909252612683918101906135c7565b60015b6126e95760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a6b565b5f516020613b2a5f395f51905f5281146127575760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a6b565b50611a48838383612bc9565b5f61276e8484612bed565b90508115801561278557506001600160a01b038116155b1561143257604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610a6b565b6127c960c954610100900460ff1660021490565b6127e65760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6033546001600160a01b038381169116148061288d57506128786d636861696e5f7761746368646f6760901b6001611d51565b6001600160a01b0316826001600160a01b0316145b15612896575050565b8080156128d057506128bb6e6272696467655f7761746368646f6760881b6001611d51565b6001600160a01b0316826001600160a01b0316145b156128d9575050565b604051630d85cccf60e11b815260040160405180910390fd5b5f856001600160a01b031663ce9d082085612917876562726964676560d01b5f611423565b8887876040518663ffffffff1660e01b815260040161293a959493929190613a36565b5f6040518083038186803b158015612950575f5ffd5b505afa925050508015612961575060015b61296c57505f612539565b506001612539565b606580546001600160a01b031916905561142081612c8f565b6129a160c954610100900460ff1660021490565b156129bf5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161283b565b5f6001600160a01b0383163b612a1557505f6116eb565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa925050508015612a7f575060408051601f3d908101601f19168201909252612a7c9181019061395c565b60015b156116eb579392505050565b604080516060810182528481526001600160a01b03909316602084018190526001600160401b03909216920182905260fd9290925560fe8054600160a01b9092026001600160e01b0319909216909217179055565b806001600160a01b038116612b085760405163538ba4f960e01b815260040160405180910390fd5b612b1183612ce0565b611a4882612d3e565b612b25603f82613a77565b82101561150257fe5b6001600160a01b0381163b612b9b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a6b565b5f516020613b2a5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b612bd283612dae565b5f82511180612bde5750805b15611a4857610a218383612ded565b6097545f906001600160a01b031680612c1957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015612c6b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123259190613a96565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16612d065760405162461bcd60e51b8152600401610a6b90613ab1565b612d0e612e12565b612d2c6001600160a01b03821615612d265781612974565b33612974565b5060c9805461ff001916610100179055565b5f54610100900460ff16612d645760405162461bcd60e51b8152600401610a6b90613ab1565b6001600160401b03461115612d8c5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b612db781612b2e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606114328383604051806060016040528060278152602001613b4a60279139612e38565b5f54610100900460ff1661144b5760405162461bcd60e51b8152600401610a6b90613ab1565b60605f5f856001600160a01b031685604051612e549190613afc565b5f60405180830381855af49150503d805f8114612e8c576040519150601f19603f3d011682016040523d82523d5f602084013e612e91565b606091505b5091509150612ea286838387612eac565b9695505050505050565b60608315612f1a5782515f03612f13576001600160a01b0385163b612f135760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a6b565b5081612325565b6123258383815115612f2f5781518083602001fd5b8060405162461bcd60e51b8152600401610a6b9190613b17565b5f610160828403121561258d575f5ffd5b8015158114611420575f5ffd5b5f5f60408385031215612f78575f5ffd5b82356001600160401b03811115612f8d575f5ffd5b612f9985828601612f49565b9250506020830135612faa81612f5a565b809150509250929050565b5f60208284031215612fc5575f5ffd5b81356001600160401b03811115612fda575f5ffd5b61232584828501612f49565b5f5b83811015613000578181015183820152602001612fe8565b50505f910152565b5f815180845261301f816020860160208601612fe6565b601f01601f19169290920160200192915050565b80516001600160401b031682525f602082015161305b60208501826001600160401b03169052565b506040820151613073604085018263ffffffff169052565b50606082015161308e60608501826001600160a01b03169052565b5060808201516130a960808501826001600160401b03169052565b5060a08201516130c460a08501826001600160a01b03169052565b5060c08201516130df60c08501826001600160401b03169052565b5060e08201516130fa60e08501826001600160a01b03169052565b506101008201516131176101008501826001600160a01b03169052565b50610120820151610120840152610140820151610160610140850152612325610160850182613008565b828152604060208201525f61142f6040830184613033565b5f5f5f6040848603121561316b575f5ffd5b83356001600160401b03811115613180575f5ffd5b61318c86828701612f49565b93505060208401356001600160401b038111156131a7575f5ffd5b8401601f810186136131b7575f5ffd5b80356001600160401b038111156131cc575f5ffd5b8660208284010111156131dd575f5ffd5b939660209190910195509293505050565b634e487b7160e01b5f52602160045260245ffd5b60058110613212576132126131ee565b9052565b604081016132248285613202565b60048310613234576132346131ee565b8260208301529392505050565b6001600160a01b0381168114611420575f5ffd5b803561326081613241565b919050565b5f60208284031215613275575f5ffd5b813561143281613241565b5f60208284031215613290575f5ffd5b5035919050565b602081016116eb8284613202565b80356001600160401b0381168114613260575f5ffd5b5f5f5f606084860312156132cd575f5ffd5b6132d6846132a5565b92506020840135915060408401356132ed81612f5a565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b038111828210171561332f5761332f6132f8565b60405290565b5f82601f830112613344575f5ffd5b81356001600160401b0381111561335d5761335d6132f8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561338b5761338b6132f8565b6040528181528382016020018510156133a2575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156133cf575f5ffd5b82356133da81613241565b915060208301356001600160401b038111156133f4575f5ffd5b61340085828601613335565b9150509250929050565b5f6020828403121561341a575f5ffd5b611432826132a5565b5f5f60408385031215613434575f5ffd5b823591506020830135612faa81612f5a565b803563ffffffff81168114613260575f5ffd5b5f610160828403121561346a575f5ffd5b61347261330c565b905061347d826132a5565b815261348b602083016132a5565b602082015261349c60408301613446565b60408201526134ad60608301613255565b60608201526134be608083016132a5565b60808201526134cf60a08301613255565b60a08201526134e060c083016132a5565b60c08201526134f160e08301613255565b60e08201526135036101008301613255565b61010082015261012082810135908201526101408201356001600160401b0381111561352d575f5ffd5b61353984828501613335565b6101408301525092915050565b5f60208284031215613556575f5ffd5b81356001600160401b0381111561356b575f5ffd5b61232584828501613459565b5f5f60408385031215613588575f5ffd5b823561359381613241565b91506020830135612faa81613241565b5f6116eb3683613459565b5f602082840312156135be575f5ffd5b61143282613446565b5f602082840312156135d7575f5ffd5b5051919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156116eb576116eb61362c565b5f6001600160401b0382166001600160401b0381036136745761367461362c565b60010192915050565b602081525f6114326020830184613033565b5f5f8335601e198436030181126136a4575f5ffd5b8301803591506001600160401b038211156136bd575f5ffd5b6020019150368190038213156136d1575f5ffd5b9250929050565b634e487b7160e01b5f52601260045260245ffd5b5f5f8335601e19843603018112613701575f5ffd5b83016020810192503590506001600160401b0381111561371f575f5ffd5b8036038213156136d1575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61376f82613762836132a5565b6001600160401b03169052565b5f61377c602083016132a5565b6001600160401b0316602084015261379660408301613446565b63ffffffff1660408401526137ad60608301613255565b6001600160a01b031660608401526137c7608083016132a5565b6001600160401b031660808401526137e160a08301613255565b6001600160a01b031660a08401526137fb60c083016132a5565b6001600160401b031660c084015261381560e08301613255565b6001600160a01b031660e08401526138306101008301613255565b6001600160a01b031661010084015261012082810135908401526138586101408301836136ec565b6101606101408601526125396101608601828461372d565b60a081525f61388260a0830185613755565b905063ffffffff835116602083015263ffffffff602084015116604083015263ffffffff60408401511660608301526060830151151560808301529392505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b5f6020828403121561396c575f5ffd5b815161143281612f5a565b63ffffffff81811683821601908111156116eb576116eb61362c565b604081525f6139a56040830185613755565b90508260208301529392505050565b60408152600d60408201526c5441494b4f5f4d45535341474560981b6060820152608060208201525f6114326080830184613033565b80356001600160e01b03198116906004841015613a1b576001600160e01b0319600485900360031b81901b82161691505b5092915050565b634e487b7160e01b5f52600160045260245ffd5b6001600160401b038616815260018060a01b0385166020820152836040820152608060608201525f613a6c60808301848661372d565b979650505050505050565b5f82613a9157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613aa6575f5ffd5b815161143281613241565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251613b0d818460208701612fe6565b9190910192915050565b602081525f611432602083018461300856fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206ccb67f04aaf63488576bbb651d54656794e2eac08c3401a79a0cda25cd7f6e664736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000001": { - "contractName": "Bridge", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000001" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x033b2dc55cae685664a00000" - }, - "0x0167000000000000000000000000000000000002": { - "contractName": "ERC20VaultImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x6080604052600436106101ba575f3560e01c806367090ccf116100f25780639aa8605c11610092578063e07baba611610062578063e07baba6146104e3578063e30c397814610520578063f09a40161461053d578063f2fde38b1461055c575f5ffd5b80639aa8605c1461045e578063a86f9d9e1461048e578063b84d9ffe146104ad578063d56ad7ac146104cd575f5ffd5b80637f07c947116100cd5780637f07c947146104065780638456cb59146104195780638abf60771461042d5780638da5cb5b14610441575f5ffd5b806367090ccf1461039e578063715018a6146103de57806379ba5097146103f2575f5ffd5b80633659cfe61161015d5780633f4ba83a116101385780633f4ba83a146103435780634f1ef2861461035757806352d1902d1461036a5780635c975abb1461037e575f5ffd5b80633659cfe6146102e65780633ab76e9f146103055780633eb6b8cf14610324575f5ffd5b806306fdde031161019857806306fdde031461024c5780630e7eeb791461026c5780630ecd8be91461029b5780633075db56146102d2575f5ffd5b80630178733a146101be57806301ffc9a7146101d3578063066fe7b414610207575b5f5ffd5b6101d16101cc36600461330a565b61057b565b005b3480156101de575f5ffd5b506101f26101ed366004613350565b610709565b60405190151581526020015b60405180910390f35b348015610212575f5ffd5b5061023e61022136600461338b565b61013060209081525f928352604080842090915290825290205481565b6040519081526020016101fe565b348015610257575f5ffd5b506a195c98cc8c17dd985d5b1d60aa1b61023e565b348015610277575f5ffd5b506101f26102863660046133b9565b61012f6020525f908152604090205460ff1681565b3480156102a6575f5ffd5b506102ba6102b53660046133d4565b610759565b6040516001600160a01b0390911681526020016101fe565b3480156102dd575f5ffd5b506101f2610e67565b3480156102f1575f5ffd5b506101d16103003660046133b9565b610e7f565b348015610310575f5ffd5b506097546102ba906001600160a01b031681565b34801561032f575f5ffd5b506102ba61033e36600461343c565b610f4f565b34801561034e575f5ffd5b506101d1610f65565b6101d1610365366004613584565b610f79565b348015610375575f5ffd5b5061023e61102e565b348015610389575f5ffd5b506101f260c954610100900460ff1660021490565b3480156103a9575f5ffd5b506102ba6103b836600461338b565b61012e60209081525f92835260408084209091529082529020546001600160a01b031681565b3480156103e9575f5ffd5b506101d16110df565b3480156103fd575f5ffd5b506101d16110f0565b6101d16104143660046135d0565b611167565b348015610424575f5ffd5b506101d16112b7565b348015610438575f5ffd5b506102ba6112ca565b34801561044c575f5ffd5b506033546001600160a01b03166102ba565b348015610469575f5ffd5b5061047d6104783660046133b9565b6112d8565b6040516101fe959493929190613689565b348015610499575f5ffd5b506102ba6104a83660046136e2565b61142d565b6104c06104bb366004613705565b611439565b6040516101fe919061371e565b3480156104d8575f5ffd5b5061023e6276a70081565b3480156104ee575f5ffd5b5060c954610508906201000090046001600160401b031681565b6040516001600160401b0390911681526020016101fe565b34801561052b575f5ffd5b506065546001600160a01b03166102ba565b348015610548575f5ffd5b506101d161055736600461380e565b61187c565b348015610567575f5ffd5b506101d16105763660046133b9565b61198b565b61058f60c954610100900460ff1660021490565b156105ad5760405163bae6e2a960e01b815260040160405180910390fd5b60026105bb60c95460ff1690565b60ff16036105dc5760405163dfc60d8560e01b815260040160405180910390fd5b6105e660026119fc565b6105ee611a12565b505f6105fe61014084018461382a565b61060c916004908290613873565b810190610619919061389a565b90505f5f828060200190518101906106319190613946565b9350505091505f610655838760a001602081019061064f91906133b9565b84611b08565b905061067f61012087013561067060c0890160a08a016133b9565b6001600160a01b031690611bb0565b61068f60c0870160a088016133b9565b6001600160a01b0316857f3dea0f5955b148debf6212261e03bd80eaf8534bee43780452d16637dcc22dd5856020015184866040516106ef939291906001600160a01b039384168152919092166020820152604081019190915260600190565b60405180910390a35050505061070560016119fc565b5050565b5f6001600160e01b0319821662bc399d60e11b148061073857506001600160e01b03198216637f07c94760e01b145b8061075357506001600160e01b031982166301ffc9a760e01b145b92915050565b5f610762611bbb565b600261077060c95460ff1690565b60ff16036107915760405163dfc60d8560e01b815260040160405180910390fd5b61079b60026119fc565b6001600160a01b03821615806107d157506001600160a01b038281165f90815261012d6020526040902054600160401b90041615155b806107e457506001600160a01b0382163b155b156108025760405163dc63f98760e01b815260040160405180910390fd5b5f61081360408501602086016133b9565b6001600160a01b0316148061083c5750466108316020850185613a3a565b6001600160401b0316145b1561085a57604051638257f7f560e01b815260040160405180910390fd5b6001600160a01b0382165f90815261012f602052604090205460ff1615610894576040516375c42fc160e01b815260040160405180910390fd5b5f610130816108a66020870187613a3a565b6001600160401b031681526020019081526020015f205f8560200160208101906108d091906133b9565b6001600160a01b0316815260208101919091526040015f205490506108f86276a70082613a69565b4210156109185760405163231d35fb60e11b815260040160405180910390fd5b61012e5f6109296020870187613a3a565b6001600160401b031681526020019081526020015f205f85602001602081019061095391906133b9565b6001600160a01b03908116825260208201929092526040015f20541691508115610cb9576001600160a01b038281165f90815261012d60209081526040808320815160a08101835281546001600160401b0381168252600160401b810490961693810193909352600160e01b90940460ff1690820152600183018054929391926060840191906109e290613a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90613a7c565b8015610a595780601f10610a3057610100808354040283529160200191610a59565b820191905f5260205f20905b815481529060010190602001808311610a3c57829003601f168201915b50505050508152602001600282018054610a7290613a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9e90613a7c565b8015610ae95780601f10610ac057610100808354040283529160200191610ae9565b820191905f5260205f20905b815481529060010190602001808311610acc57829003601f168201915b505050505081525050905080604051602001610b059190613b13565b6040516020818303038152906040528051906020012085604051602001610b2c9190613b99565b6040516020818303038152906040528051906020012014610b6057604051632f9d1d7b60e11b815260040160405180910390fd5b6001600160a01b0383165f90815261012d6020526040812080546001600160e81b031916815590610b9460018301826132b2565b610ba1600283015f6132b2565b50506001600160a01b0383165f81815261012f60205260409020805460ff19166001179055610bd79063b8f2e0c560e01b611c15565b8015610bf85750610bf86001600160a01b03851663b8f2e0c560e01b611c15565b15610cb75760405163b8f2e0c560e01b81526001600160a01b0385811660048301525f602483015284169063b8f2e0c5906044015f604051808303815f87803b158015610c43575f5ffd5b505af1158015610c55573d5f5f3e3d5ffd5b505060405163b8f2e0c560e01b81526001600160a01b038681166004830152600160248301528716925063b8f2e0c591506044015f604051808303815f87803b158015610ca0575f5ffd5b505af1158015610cb2573d5f5f3e3d5ffd5b505050505b505b6001600160a01b0383165f90815261012d602052604090208490610cdd8282613d3c565b5083905061012e5f610cf26020880188613a3a565b6001600160401b031681526020019081526020015f205f866020016020810190610d1c91906133b9565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550426101305f865f016020810190610d759190613a3a565b6001600160401b031681526020019081526020015f205f866020016020810190610d9f91906133b9565b6001600160a01b03166001600160a01b031681526020019081526020015f2081905550836020016020810190610dd591906133b9565b6001600160a01b0316610deb6020860186613a3a565b6001600160401b03167f031d68e1805917560c34a5f55a7dd91bef98f911190ed02cdbb53caedae6c39d8486610e2460608a018a61382a565b610e3160808c018c61382a565b610e4160608e0160408f01613dfa565b604051610e549796959493929190613e15565b60405180910390a35061075360016119fc565b5f6002610e7660c95460ff1690565b60ff1614905090565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000002163003610ed05760405162461bcd60e51b8152600401610ec790613e6c565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000026001600160a01b0316610f02611ca2565b6001600160a01b031614610f285760405162461bcd60e51b8152600401610ec790613eb8565b610f3181611cbd565b604080515f80825260208201909252610f4c91839190611cc5565b50565b5f610f5b848484611e2f565b90505b9392505050565b610f6d611e81565b610f77335f611f11565b565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000002163003610fc15760405162461bcd60e51b8152600401610ec790613e6c565b7f00000000000000000000000001670000000000000000000000000000000000026001600160a01b0316610ff3611ca2565b6001600160a01b0316146110195760405162461bcd60e51b8152600401610ec790613eb8565b61102282611cbd565b61070582826001611cc5565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000000000216146110cd5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610ec7565b505f5160206149985f395f51905f5290565b6110e7611bbb565b610f775f611f19565b60655433906001600160a01b0316811461115e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610ec7565b610f4c81611f19565b61117b60c954610100900460ff1660021490565b156111995760405163bae6e2a960e01b815260040160405180910390fd5b60026111a760c95460ff1690565b60ff16036111c85760405163dfc60d8560e01b815260040160405180910390fd5b6111d260026119fc565b5f8080806111e285870187613f0f565b93509350935093505f6111f3611f32565b90506111fe83612051565b5f61120a868585611b08565b905061121f6001600160a01b03851634611bb0565b836001600160a01b0316856001600160a01b0316835f01517f75a051823424fc80e92556c41cb0ad977ae1dcb09c68a9c38acab86b11a69f8985604001518a60200151868960405161129f94939291906001600160401b039490941684526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a450505050505061070560016119fc565b6112bf61208d565b610f77336001611f11565b5f6112d3611ca2565b905090565b61012d6020525f9081526040902080546001820180546001600160401b03831693600160401b84046001600160a01b031693600160e01b900460ff1692909161132090613a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461134c90613a7c565b80156113975780601f1061136e57610100808354040283529160200191611397565b820191905f5260205f20905b81548152906001019060200180831161137a57829003601f168201915b5050505050908060020180546113ac90613a7c565b80601f01602080910402602001604051908101604052809291908181526020018280546113d890613a7c565b80156114235780601f106113fa57610100808354040283529160200191611423565b820191905f5260205f20905b81548152906001019060200180831161140657829003601f168201915b5050505050905085565b5f610f5e468484611e2f565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201929092526101408101919091526114a760c954610100900460ff1660021490565b156114c55760405163bae6e2a960e01b815260040160405180910390fd5b60026114d360c95460ff1690565b60ff16036114f45760405163dfc60d8560e01b815260040160405180910390fd5b6114fe60026119fc565b8160c001355f0361152257604051634299323b60e11b815260040160405180910390fd5b5f61153360a08401608085016133b9565b6001600160a01b03160361155a576040516303f8a7d360e01b815260040160405180910390fd5b61012f5f61156e60a08501608086016133b9565b6001600160a01b0316815260208101919091526040015f205460ff16156115a8576040516375c42fc160e01b815260040160405180910390fd5b6115b86080830160608401613a3a565b6001600160401b03163410156115e157604051630178ce0b60e31b815260040160405180910390fd5b5f5f5f6115ed856120fe565b6040805161016081019091525f8082529396509194509250602081016116196080890160608a01613a3a565b6001600160401b0316815260200161163760c0890160a08a01614014565b63ffffffff1681525f6020808301829052604083019190915233606083015260809091019061166890890189613a3a565b6001600160401b031681526020015f6001600160a01b031688602001602081019061169391906133b9565b6001600160a01b0316036116a757336116b7565b6116b76040890160208a016133b9565b6001600160a01b031681526020908101906116ee906116d8908a018a613a3a565b6a195c98cc8c17dd985d5b1d60aa1b5b5f610f4f565b6001600160a01b0316815260200161170c6080890160608a01613a3a565b61171f906001600160401b03163461402f565b815260200185905290505f61173d6562726964676560d01b8261142d565b6001600160a01b0316631bdb003734846040518363ffffffff1660e01b8152600401611769919061371e565b5f6040518083038185885af1158015611784573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f191682016040526117ac919081019061404d565b965090506117c060608801604089016133b9565b6001600160a01b03168660a001516001600160a01b0316827f256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d875f01518b5f01602081019061180f9190613a3a565b89602001518d608001602081019061182791906133b9565b604080516001600160401b0395861681529390941660208401526001600160a01b03918216838501521660608201526080810189905290519081900360a00190a4505050505061187760016119fc565b919050565b5f54610100900460ff161580801561189a57505f54600160ff909116105b806118b35750303b1580156118b357505f5460ff166001145b6119165760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610ec7565b5f805460ff191660011790558015611937575f805461ff0019166101001790555b6119418383612598565b8015611986575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b611993611bbb565b606580546001600160a01b0383166001600160a01b031990911681179091556119c46033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611a4381600161142d565b6001600160a01b0316336001600160a01b031614611a7457604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ab0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ad4919061416d565b60208101519092506001600160a01b03163314611b0457604051632583296b60e01b815260040160405180910390fd5b5090565b5f46845f01516001600160401b031603611b3b57506020830151611b366001600160a01b03821684846125d2565b611ba6565b611b4484612635565b6040516340c10f1960e01b81526001600160a01b03858116600483015260248201859052919250908216906340c10f19906044015f604051808303815f87803b158015611b8f575f5ffd5b505af1158015611ba1573d5f5f3e3d5ffd5b505050505b610f5e8183612677565b61070582825a612706565b6033546001600160a01b03163314610f775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ec7565b5f6001600160a01b0383163b611c2c57505f610753565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa925050508015611c96575060408051601f3d908101601f19168201909252611c93918101906141d5565b60015b15610753579392505050565b5f5160206149985f395f51905f52546001600160a01b031690565b610f4c611bbb565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611cf85761198683612749565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d52575060408051601f3d908101601f19168201909252611d4f918101906141f0565b60015b611db55760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610ec7565b5f5160206149985f395f51905f528114611e235760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610ec7565b506119868383836127e4565b5f611e3a848461280e565b905081158015611e5157506001600160a01b038116155b15610f5e57604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610ec7565b611e9560c954610100900460ff1660021490565b611eb25760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610705611bbb565b606580546001600160a01b0319169055610f4c816128b8565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611f6381600161142d565b6001600160a01b0316336001600160a01b031614611f9457604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611fd0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff4919061416d565b91505f61201483604001516116e86a195c98cc8c17dd985d5b1d60aa1b90565b9050806001600160a01b031683602001516001600160a01b03161461204c57604051632583296b60e01b815260040160405180910390fd5b505090565b6001600160a01b038116158061206f57506001600160a01b03811630145b15610f4c57604051635b50f3f960e01b815260040160405180910390fd5b6120a160c954610100900460ff1660021490565b156120bf5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611f07565b6040805160a0810182525f8082526020820181905291810191909152606081810181905260808201819052905f8061012d8161214060a08801608089016133b9565b6001600160a01b03908116825260208201929092526040015f208054909250600160401b90041615612376576040805160a08101825282546001600160401b0381168252600160401b81046001600160a01b03166020830152600160e01b900460ff1691810191909152600182018054839160608401916121c090613a7c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ec90613a7c565b80156122375780601f1061220e57610100808354040283529160200191612237565b820191905f5260205f20905b81548152906001019060200180831161221a57829003601f168201915b5050505050815260200160028201805461225090613a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461227c90613a7c565b80156122c75780601f1061229e576101008083540402835291602001916122c7565b820191905f5260205f20905b8154815290600101906020018083116122aa57829003601f168201915b505050505081525050925061230033308760c001358860800160208101906122ef91906133b9565b6001600160a01b0316929190612909565b61231060a08601608087016133b9565b604051630852cd8d60e31b815260c087013560048201526001600160a01b0391909116906342966c68906024015f604051808303815f87803b158015612354575f5ffd5b505af1158015612366573d5f5f3e3d5ffd5b505050508460c001359150612518565b6040518060a00160405280466001600160401b031681526020018660800160208101906123a391906133b9565b6001600160a01b031681526020016123c96123c460a0890160808a016133b9565b612941565b60ff1681526020016123e96123e460a0890160808a016133b9565b6129f5565b815260200161240661240160a0890160808a016133b9565b612a9f565b905292505f61241b60a08701608088016133b9565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038316906370a0823190602401602060405180830381865afa158015612462573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248691906141f0565b90506124a16001600160a01b038316333060c08b0135612909565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa1580156124e5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250991906141f0565b612513919061402f565b935050505b30637f07c947843361253060608a0160408b016133b9565b866040516020016125449493929190614207565b60408051601f19818403018152908290526125619160240161423c565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509350509193909250565b806001600160a01b0381166125c05760405163538ba4f960e01b815260040160405180910390fd5b6125c983612ae5565b61198682612b43565b6040516001600160a01b03831660248201526044810182905261198690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bb3565b80516001600160401b03165f90815261012e60209081526040808320828501516001600160a01b03908116855292529091205416806118775761075382612c86565b5f6126936c38bab7ba30afb6b0b730b3b2b960991b600161142d565b90506001600160a01b03811615611986576040516315c638fb60e31b81526001600160a01b0384811660048301526024820184905282169063ae31c7d8906044015f604051808303815f87803b1580156126eb575f5ffd5b505af11580156126fd573d5f5f3e3d5ffd5b50505050505050565b815f0361271257505050565b61272c83838360405180602001604052805f815250612e88565b61198657604051634c67134d60e11b815260040160405180910390fd5b6001600160a01b0381163b6127b65760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610ec7565b5f5160206149985f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6127ed83612ec5565b5f825111806127f95750805b15611986576128088383612f04565b50505050565b6097545f906001600160a01b03168061283a57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa15801561288c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b0919061424e565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526128089085906323b872dd60e01b906084016125fe565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916129869190614269565b5f60405180830381855afa9150503d805f81146129be576040519150601f19603f3d011682016040523d82523d5f602084013e6129c3565b606091505b50915091508180156129d6575080516020145b6129e15760126128b0565b808060200190518101906128b09190614284565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b03861691612a3b9190614269565b5f60405180830381855afa9150503d805f8114612a73576040519150601f19603f3d011682016040523d82523d5f602084013e612a78565b606091505b509150915081612a965760405180602001604052805f8152506128b0565b6128b081612f29565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b03861691612a3b9190614269565b5f54610100900460ff16612b0b5760405162461bcd60e51b8152600401610ec79061429f565b612b13613096565b612b316001600160a01b03821615612b2b5781611f19565b33611f19565b5060c9805461ff001916610100179055565b5f54610100900460ff16612b695760405162461bcd60e51b8152600401610ec79061429f565b6001600160401b03461115612b915760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f612c07826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130bc9092919063ffffffff16565b905080515f1480612c27575080806020019051810190612c2791906141d5565b6119865760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ec7565b5f5f612c9a6033546001600160a01b031690565b60975460208501518551604080880151606089015160808a01519251612cd097966001600160a01b0316959493906024016142ea565b60408051601f198184030181529190526020810180516001600160e01b031663bb86ef9360e01b1790529050612d166c0627269646765645f657263323609c1b5f61142d565b81604051612d23906132e9565b612d2e929190614355565b604051809103905ff080158015612d47573d5f5f3e3d5ffd5b506001600160a01b038082165f90815261012d602090815260409182902087518154928901519389015160ff16600160e01b0260ff60e01b1994909516600160401b026001600160e01b03199093166001600160401b03909116179190911791909116919091178155606085015191935084916001820190612dc99082614378565b5060808201516002820190612dde9082614378565b505083516001600160401b039081165f90815261012e6020908152604080832082890180516001600160a01b039081168652919093529281902080546001600160a01b0319168885169081179091559151885160608a015160808b0151848c01519451959850929095169516937fb6b427556e8cb0ebf9175da4bc48c64c4f56e44cfaf8c3ab5ebf8e2ea130907993612e7a9391929190614432565b60405180910390a450919050565b5f6001600160a01b038516612eb057604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b612ece81612749565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610f5e83836040518060600160405280602781526020016149b8602791396130ca565b60606040825110612f485781806020019051810190610753919061446a565b8151602003613083575f5b60208160ff16108015612f885750828160ff1681518110612f7657612f7661449b565b01602001516001600160f81b03191615155b15612f9f5780612f97816144af565b915050612f53565b5f8160ff166001600160401b03811115612fbb57612fbb61347b565b6040519080825280601f01601f191660200182016040528015612fe5576020820181803683370190505b5090505f91505b60208260ff161080156130215750838260ff168151811061300f5761300f61449b565b01602001516001600160f81b03191615155b15610f5e57838260ff168151811061303b5761303b61449b565b602001015160f81c60f81b818360ff168151811061305b5761305b61449b565b60200101906001600160f81b03191690815f1a9053508161307b816144af565b925050612fec565b505060408051602081019091525f815290565b5f54610100900460ff16610f775760405162461bcd60e51b8152600401610ec79061429f565b6060610f5b84845f8561313e565b60605f5f856001600160a01b0316856040516130e69190614269565b5f60405180830381855af49150503d805f811461311e576040519150601f19603f3d011682016040523d82523d5f602084013e613123565b606091505b509150915061313486838387613215565b9695505050505050565b60608247101561319f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ec7565b5f5f866001600160a01b031685876040516131ba9190614269565b5f6040518083038185875af1925050503d805f81146131f4576040519150601f19603f3d011682016040523d82523d5f602084013e6131f9565b606091505b509150915061320a87838387613215565b979650505050505050565b606083156132835782515f0361327c576001600160a01b0385163b61327c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ec7565b50816128b0565b6128b083838151156132985781518083602001fd5b8060405162461bcd60e51b8152600401610ec7919061423c565b5080546132be90613a7c565b5f825580601f106132cd575050565b601f0160209004905f5260205f2090810190610f4c91906132f6565b6104ca806144ce83390190565b5b80821115611b04575f81556001016132f7565b5f5f6040838503121561331b575f5ffd5b82356001600160401b03811115613330575f5ffd5b83016101608186031215613342575f5ffd5b946020939093013593505050565b5f60208284031215613360575f5ffd5b81356001600160e01b031981168114610f5e575f5ffd5b6001600160a01b0381168114610f4c575f5ffd5b5f5f6040838503121561339c575f5ffd5b8235915060208301356133ae81613377565b809150509250929050565b5f602082840312156133c9575f5ffd5b8135610f5e81613377565b5f5f604083850312156133e5575f5ffd5b82356001600160401b038111156133fa575f5ffd5b830160a0818603121561340b575f5ffd5b915060208301356133ae81613377565b6001600160401b0381168114610f4c575f5ffd5b8015158114610f4c575f5ffd5b5f5f5f6060848603121561344e575f5ffd5b83356134598161341b565b92506020840135915060408401356134708161342f565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b03811182821017156134b1576134b161347b565b60405290565b60405161016081016001600160401b03811182821017156134b1576134b161347b565b604051601f8201601f191681016001600160401b03811182821017156135025761350261347b565b604052919050565b5f6001600160401b038211156135225761352261347b565b50601f01601f191660200190565b5f82601f83011261353f575f5ffd5b8135602083015f6135576135528461350a565b6134da565b905082815285838301111561356a575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f60408385031215613595575f5ffd5b82356135a081613377565b915060208301356001600160401b038111156135ba575f5ffd5b6135c685828601613530565b9150509250929050565b5f5f602083850312156135e1575f5ffd5b82356001600160401b038111156135f6575f5ffd5b8301601f81018513613606575f5ffd5b80356001600160401b0381111561361b575f5ffd5b85602082840101111561362c575f5ffd5b6020919091019590945092505050565b5f5b8381101561365657818101518382015260200161363e565b50505f910152565b5f815180845261367581602086016020860161363c565b601f01601f19169290920160200192915050565b6001600160401b03861681526001600160a01b038516602082015260ff8416604082015260a0606082018190525f906136c49083018561365e565b82810360808401526136d6818561365e565b98975050505050505050565b5f5f604083850312156136f3575f5ffd5b8235915060208301356133ae8161342f565b5f60e0828403128015613716575f5ffd5b509092915050565b602081526137386020820183516001600160401b03169052565b5f602083015161375360408401826001600160401b03169052565b50604083015163ffffffff811660608401525060608301516001600160a01b03811660808401525060808301516001600160401b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160401b03811660e08401525060e08301516001600160a01b038116610100840152506101008301516001600160a01b03811661012084015250610120830151610140830152610140830151610160808401526128b061018084018261365e565b5f5f6040838503121561381f575f5ffd5b823561340b81613377565b5f5f8335601e1984360301811261383f575f5ffd5b8301803591506001600160401b03821115613858575f5ffd5b60200191503681900382131561386c575f5ffd5b9250929050565b5f5f85851115613881575f5ffd5b8386111561388d575f5ffd5b5050820193919092039150565b5f602082840312156138aa575f5ffd5b81356001600160401b038111156138bf575f5ffd5b6128b084828501613530565b80516118778161341b565b805161187781613377565b60ff81168114610f4c575f5ffd5b8051611877816138e1565b5f82601f830112613909575f5ffd5b8151602083015f61391c6135528461350a565b905082815285838301111561392f575f5ffd5b61393d83602083018461363c565b95945050505050565b5f5f5f5f60808587031215613959575f5ffd5b84516001600160401b0381111561396e575f5ffd5b850160a0818803121561397f575f5ffd5b61398761348f565b81516139928161341b565b815260208201516139a281613377565b60208201526139b3604083016138ef565b604082015260608201516001600160401b038111156139d0575f5ffd5b6139dc898285016138fa565b60608301525060808201516001600160401b038111156139fa575f5ffd5b613a06898285016138fa565b6080830152509450613a1c9050602086016138d6565b9250613a2a604086016138d6565b6060959095015193969295505050565b5f60208284031215613a4a575f5ffd5b8135610f5e8161341b565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561075357610753613a55565b600181811c90821680613a9057607f821691505b602082108103613aae57634e487b7160e01b5f52602260045260245ffd5b50919050565b6001600160401b03815116825260018060a01b03602082015116602083015260ff60408201511660408301525f606082015160a06060850152613afa60a085018261365e565b90506080830151848203608086015261393d828261365e565b602081525f610f5e6020830184613ab4565b8035611877816138e1565b5f5f8335601e19843603018112613b45575f5ffd5b83016020810192503590506001600160401b03811115613b63575f5ffd5b80360382131561386c575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f8235613ba98161341b565b6001600160401b0381166020840152506020830135613bc781613377565b6001600160a01b0316604083810191909152830135613be5816138e1565b60ff8116606084015250613bfc6060840184613b30565b60a06080850152613c1160c085018284613b71565b915050613c216080850185613b30565b848303601f190160a0860152613134838284613b71565b601f82111561198657805f5260205f20601f840160051c81016020851015613c5d5750805b601f840160051c820191505b81811015613c7c575f8155600101613c69565b5050505050565b6001600160401b03831115613c9a57613c9a61347b565b613cae83613ca88354613a7c565b83613c38565b5f601f841160018114613cdf575f8515613cc85750838201355b5f19600387901b1c1916600186901b178355613c7c565b5f83815260208120601f198716915b82811015613d0e5786850135825560209485019460019092019101613cee565b5086821015613d2a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135613d478161341b565b6001600160401b03811690508154816001600160401b031982161783556020840135613d7281613377565b6001600160e01b031991909116909117604091821b68010000000000000000600160e01b03161782555f90830135613da9816138e1565b825460ff60e01b191660e09190911b60ff60e01b1617825550613dcf606083018361382a565b613ddd818360018601613c83565b5050613dec608083018361382a565b612808818360028601613c83565b5f60208284031215613e0a575f5ffd5b8135610f5e816138e1565b6001600160a01b0388811682528716602082015260a0604082018190525f90613e419083018789613b71565b8281036060840152613e54818688613b71565b91505060ff8316608083015298975050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b803561187781613377565b5f5f5f5f60808587031215613f22575f5ffd5b84356001600160401b03811115613f37575f5ffd5b850160a08188031215613f48575f5ffd5b613f5061348f565b8135613f5b8161341b565b81526020820135613f6b81613377565b6020820152613f7c60408301613b25565b604082015260608201356001600160401b03811115613f99575f5ffd5b613fa589828501613530565b60608301525060808201356001600160401b03811115613fc3575f5ffd5b613fcf89828501613530565b6080830152509450613fe5905060208601613f04565b9250613ff360408601613f04565b9396929550929360600135925050565b63ffffffff81168114610f4c575f5ffd5b5f60208284031215614024575f5ffd5b8135610f5e81614003565b8181038181111561075357610753613a55565b805161187781614003565b5f5f6040838503121561405e575f5ffd5b825160208401519092506001600160401b0381111561407b575f5ffd5b8301610160818603121561408d575f5ffd5b6140956134b7565b61409e826138cb565b81526140ac602083016138cb565b60208201526140bd60408301614042565b60408201526140ce606083016138d6565b60608201526140df608083016138cb565b60808201526140f060a083016138d6565b60a082015261410160c083016138cb565b60c082015261411260e083016138d6565b60e082015261412461010083016138d6565b61010082015261012082810151908201526101408201516001600160401b0381111561414e575f5ffd5b61415a878285016138fa565b6101408301525080925050509250929050565b5f606082840312801561417e575f5ffd5b50604051606081016001600160401b03811182821017156141a1576141a161347b565b6040528251815260208301516141b681613377565b602082015260408301516141c98161341b565b60408201529392505050565b5f602082840312156141e5575f5ffd5b8151610f5e8161342f565b5f60208284031215614200575f5ffd5b5051919050565b608081525f6142196080830187613ab4565b6001600160a01b0395861660208401529390941660408201526060015292915050565b602081525f610f5e602083018461365e565b5f6020828403121561425e575f5ffd5b8151610f5e81613377565b5f825161427a81846020870161363c565b9190910192915050565b5f60208284031215614294575f5ffd5b8151610f5e816138e1565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0388811682528781166020830152861660408201526001600160401b038516606082015260ff8416608082015260e060a082018190525f906143359083018561365e565b82810360c0840152614347818561365e565b9a9950505050505050505050565b6001600160a01b03831681526040602082018190525f90610f5b9083018461365e565b81516001600160401b038111156143915761439161347b565b6143a58161439f8454613a7c565b84613c38565b6020601f8211600181146143d7575f83156143c05750848201515b5f19600385901b1c1916600184901b178455613c7c565b5f84815260208120601f198516915b8281101561440657878501518255602094850194600190920191016143e6565b508482101561442357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b606081525f614444606083018661365e565b8281036020840152614456818661365e565b91505060ff83166040830152949350505050565b5f6020828403121561447a575f5ffd5b81516001600160401b0381111561448f575f5ffd5b6128b0848285016138fa565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036144c4576144c4613a55565b6001019291505056fe60806040526040516104ca3803806104ca833981016040819052610022916102d2565b61002d82825f610034565b50506103ed565b61003d8361005f565b5f825111806100495750805b1561005a57610058838361009e565b505b505050565b610068816100ca565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606100c383836040518060600160405280602781526020016104a36027913961017d565b9392505050565b6001600160a01b0381163b61013c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f856001600160a01b03168560405161019991906103a0565b5f60405180830381855af49150503d805f81146101d1576040519150601f19603f3d011682016040523d82523d5f602084013e6101d6565b606091505b5090925090506101e8868383876101f2565b9695505050505050565b606083156102605782515f03610259576001600160a01b0385163b6102595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610133565b508161026a565b61026a8383610272565b949350505050565b8151156102825781518083602001fd5b8060405162461bcd60e51b815260040161013391906103bb565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102ca5781810151838201526020016102b2565b50505f910152565b5f5f604083850312156102e3575f5ffd5b82516001600160a01b03811681146102f9575f5ffd5b60208401519092506001600160401b03811115610314575f5ffd5b8301601f81018513610324575f5ffd5b80516001600160401b0381111561033d5761033d61029c565b604051601f8201601f19908116603f011681016001600160401b038111828210171561036b5761036b61029c565b604052818152828201602001871015610382575f5ffd5b6103938260208301602086016102b0565b8093505050509250929050565b5f82516103b18184602087016102b0565b9190910192915050565b602081525f82518060208401526103d98160408501602087016102b0565b601f01601f19169190910160400192915050565b60aa806103f95f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220b8d385d4f2d6cc75f0553b0f75a9defc23ce602bcb05516f25f5e40cac657bef64736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000002": { - "contractName": "ERC20Vault", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000201", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000002" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000003": { - "contractName": "ERC721VaultImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x60806040526004361061017b575f3560e01c806367090ccf116100cd5780638da5cb5b11610087578063e07baba611610062578063e07baba614610449578063e30c397814610486578063f09a4016146104a3578063f2fde38b146104c2575f5ffd5b80638da5cb5b146103de5780639aa8605c146103fb578063a86f9d9e1461042a575f5ffd5b806367090ccf1461033b578063715018a61461037b57806379ba50971461038f5780637f07c947146103a35780638456cb59146103b65780638abf6077146103ca575f5ffd5b80633659cfe6116101385780633f4ba83a116101135780633f4ba83a146102e05780634f1ef286146102f457806352d1902d146103075780635c975abb1461031b575f5ffd5b80633659cfe61461026b5780633ab76e9f1461028a5780633eb6b8cf146102c1575f5ffd5b80630178733a1461017f57806301ffc9a71461019457806306fdde03146101c8578063150b7a02146101f35780631f59a830146102375780633075db5614610257575b5f5ffd5b61019261018d3660046128ea565b6104e1565b005b34801561019f575f5ffd5b506101b36101ae366004612930565b610694565b60405190151581526020015b60405180910390f35b3480156101d3575f5ffd5b506b195c98cdcc8c57dd985d5b1d60a21b5b6040519081526020016101bf565b3480156101fe575f5ffd5b5061021e61020d3660046129ba565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101bf565b61024a610245366004612a27565b6106e4565b6040516101bf9190612aab565b348015610262575f5ffd5b506101b3610b6a565b348015610276575f5ffd5b50610192610285366004612b9b565b610b82565b348015610295575f5ffd5b506097546102a9906001600160a01b031681565b6040516001600160a01b0390911681526020016101bf565b3480156102cc575f5ffd5b506102a96102db366004612be2565b610c52565b3480156102eb575f5ffd5b50610192610c68565b610192610302366004612d4d565b610c7c565b348015610312575f5ffd5b506101e5610d31565b348015610326575f5ffd5b506101b360c954610100900460ff1660021490565b348015610346575f5ffd5b506102a9610355366004612d99565b61012e60209081525f92835260408084209091529082529020546001600160a01b031681565b348015610386575f5ffd5b50610192610de2565b34801561039a575f5ffd5b50610192610df3565b6101926103b1366004612dc7565b610e6a565b3480156103c1575f5ffd5b50610192610fd3565b3480156103d5575f5ffd5b506102a9610fe6565b3480156103e9575f5ffd5b506033546001600160a01b03166102a9565b348015610406575f5ffd5b5061041a610415366004612b9b565b610ff4565b6040516101bf9493929190612e05565b348015610435575f5ffd5b506102a9610444366004612e54565b61113f565b348015610454575f5ffd5b5060c95461046e906201000090046001600160401b031681565b6040516001600160401b0390911681526020016101bf565b348015610491575f5ffd5b506065546001600160a01b03166102a9565b3480156104ae575f5ffd5b506101926104bd366004612e77565b61114b565b3480156104cd575f5ffd5b506101926104dc366004612b9b565b61125a565b6104f560c954610100900460ff1660021490565b156105135760405163bae6e2a960e01b815260040160405180910390fd5b600261052160c95460ff1690565b60ff16036105425760405163dfc60d8560e01b815260040160405180910390fd5b61054c60026112cb565b6105546112e1565b505f610564610140840184612ea3565b610572916004908290612ee5565b81019061057f9190612f0c565b90505f5f828060200190518101906105979190613026565b9350505091505f6105bb838760a00160208101906105b59190612b9b565b846113d7565b90506105e56101208701356105d660c0890160a08a01612b9b565b6001600160a01b03169061154e565b6105f560c0870160a08801612b9b565b6001600160a01b0316857fe48bef18455e47bca14864ab6e82dffa29df148b051c09de95aec44ecf13598c8560200151848687516001600160401b0381111561064057610640612c21565b604051908082528060200260200182016040528015610669578160200160208202803683370190505b5060405161067a9493929190613165565b60405180910390a35050505061069060016112cb565b5050565b5f6001600160e01b0319821662bc399d60e11b14806106c357506001600160e01b03198216637f07c94760e01b145b806106de57506001600160e01b031982166301ffc9a760e01b145b92915050565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915261075260c954610100900460ff1660021490565b156107705760405163bae6e2a960e01b815260040160405180910390fd5b61077982613219565b8060e00151518160c0015151146107a35760405163196e8a4160e31b815260040160405180910390fd5b60808101516001600160a01b03166107ce576040516303f8a7d360e01b815260040160405180910390fd5b60026107dc60c95460ff1690565b60ff16036107fd5760405163dfc60d8560e01b815260040160405180910390fd5b61080760026112cb565b61081760808401606085016132ec565b6001600160401b031634101561084057604051630178ce0b60e31b815260040160405180910390fd5b5f5b61084f60c0850185613307565b90508110156108a35761086560e0850185613307565b828181106108755761087561334c565b905060200201355f1461089b57604051634299323b60e11b815260040160405180910390fd5b600101610842565b506108ce6380ac58cd60e01b6108bf60a0860160808701612b9b565b6001600160a01b031690611559565b6108eb57604051633ee915f560e11b815260040160405180910390fd5b5f5f6108f6856115e6565b6040805161016081019091525f808252929450909250602081016109206080890160608a016132ec565b6001600160401b0316815260200161093e60c0890160a08a01613360565b63ffffffff1681525f6020808301829052604083019190915233606083015260809091019061096f908901896132ec565b6001600160401b031681526020015f6001600160a01b031688602001602081019061099a9190612b9b565b6001600160a01b0316036109ae57336109be565b6109be6040890160208a01612b9b565b6001600160a01b031681526020908101906109f6906109df908a018a6132ec565b6b195c98cdcc8c57dd985d5b1d60a21b5b5f610c52565b6001600160a01b03168152602001610a146080890160608a016132ec565b610a27906001600160401b03163461338f565b815260200184905290505f610a456562726964676560d01b8261113f565b6001600160a01b0316631bdb003734846040518363ffffffff1660e01b8152600401610a719190612aab565b5f6040518083038185885af1158015610a8c573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052610ab491908101906133ad565b96509050610ac86060880160408901612b9b565b6001600160a01b03168660a001516001600160a01b0316827fabbf62a1459339f9ac59136d313a5ccd83d2706cc6d4c04d90642520169144dc8960c0015187602001518c6080016020810190610b1e9190612b9b565b610b2b60c08f018f613307565b8f8060e00190610b3b9190613307565b604051610b4e97969594939291906134fd565b60405180910390a450505050610b6460016112cb565b50919050565b5f6002610b7960c95460ff1690565b60ff1614905090565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000003163003610bd35760405162461bcd60e51b8152600401610bca90613559565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000036001600160a01b0316610c05611ac8565b6001600160a01b031614610c2b5760405162461bcd60e51b8152600401610bca906135a5565b610c3481611ae3565b604080515f80825260208201909252610c4f91839190611aeb565b50565b5f610c5e848484611c55565b90505b9392505050565b610c70611ca7565b610c7a335f611d37565b565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000003163003610cc45760405162461bcd60e51b8152600401610bca90613559565b7f00000000000000000000000001670000000000000000000000000000000000036001600160a01b0316610cf6611ac8565b6001600160a01b031614610d1c5760405162461bcd60e51b8152600401610bca906135a5565b610d2582611ae3565b61069082826001611aeb565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000000031614610dd05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610bca565b505f516020613ff95f395f51905f5290565b610dea611d3b565b610c7a5f611d95565b60655433906001600160a01b03168114610e615760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610bca565b610c4f81611d95565b610e7e60c954610100900460ff1660021490565b15610e9c5760405163bae6e2a960e01b815260040160405180910390fd5b6002610eaa60c95460ff1690565b60ff1603610ecb5760405163dfc60d8560e01b815260040160405180910390fd5b610ed560026112cb565b5f808080610ee5858701876135f1565b93509350935093505f610ef6611dae565b9050610f0183611ece565b5f610f0d8685856113d7565b9050610f226001600160a01b0385163461154e565b836001600160a01b0316856001600160a01b0316835f01517f895f73e418d1bbbad2a311d085fad00e5d98a960e9f2afa4b942071d39bec43a85604001518a6020015186898a516001600160401b03811115610f8057610f80612c21565b604051908082528060200260200182016040528015610fa9578160200160208202803683370190505b50604051610fbb9594939291906136ea565b60405180910390a450505050505061069060016112cb565b610fdb611f0a565b610c7a336001611d37565b5f610fef611ac8565b905090565b61012d6020525f9081526040902080546001820180546001600160401b03831693600160401b9093046001600160a01b031692919061103290613742565b80601f016020809104026020016040519081016040528092919081815260200182805461105e90613742565b80156110a95780601f10611080576101008083540402835291602001916110a9565b820191905f5260205f20905b81548152906001019060200180831161108c57829003601f168201915b5050505050908060020180546110be90613742565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea90613742565b80156111355780601f1061110c57610100808354040283529160200191611135565b820191905f5260205f20905b81548152906001019060200180831161111857829003601f168201915b5050505050905084565b5f610c61468484611c55565b5f54610100900460ff161580801561116957505f54600160ff909116105b806111825750303b15801561118257505f5460ff166001145b6111e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bca565b5f805460ff191660011790558015611206575f805461ff0019166101001790555b6112108383611f7b565b8015611255575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b611262611d3b565b606580546001600160a01b0383166001600160a01b031990911681179091556112936033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b61131281600161113f565b6001600160a01b0316336001600160a01b03161461134357604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561137f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113a39190613774565b60208101519092506001600160a01b031633146113d357604051632583296b60e01b815260040160405180910390fd5b5090565b5f46845f01516001600160401b03160361149d575060208301515f5b825181101561149757816001600160a01b03166342842e0e308686858151811061141f5761141f61334c565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b158015611476575f5ffd5b505af1158015611488573d5f5f3e3d5ffd5b505050508060010190506113f3565b50610c61565b6114a684611fb5565b90505f5b825181101561154657816001600160a01b03166340c10f19858584815181106114d5576114d561334c565b60200260200101516040518363ffffffff1660e01b815260040161150e9291906001600160a01b03929092168252602082015260400190565b5f604051808303815f87803b158015611525575f5ffd5b505af1158015611537573d5f5f3e3d5ffd5b505050508060010190506114aa565b509392505050565b61069082825a611ffc565b5f6001600160a01b0383163b61157057505f6106de565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa9250505080156115da575060408051601f3d908101601f191682019092526115d7918101906137dc565b60015b156106de579392505050565b604080516080810182525f808252602082015260609181018290528082018290525f61012d8161161c60a0870160808801612b9b565b6001600160a01b03908116825260208201929092526040015f208054909250600160401b900416156118fd576040805160808101825282546001600160401b0381168252600160401b90046001600160a01b0316602082015260018301805491928492908401919061168d90613742565b80601f01602080910402602001604051908101604052809291908181526020018280546116b990613742565b80156117045780601f106116db57610100808354040283529160200191611704565b820191905f5260205f20905b8154815290600101906020018083116116e757829003601f168201915b5050505050815260200160028201805461171d90613742565b80601f016020809104026020016040519081016040528092919081815260200182805461174990613742565b80156117945780601f1061176b57610100808354040283529160200191611794565b820191905f5260205f20905b81548152906001019060200180831161177757829003601f168201915b50505050508152505091505f5b6117ae60c0860186613307565b90508110156118f7576117c760a0860160808701612b9b565b6001600160a01b03166342842e0e33306117e460c08a018a613307565b868181106117f4576117f461334c565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015611848575f5ffd5b505af115801561185a573d5f5f3e3d5ffd5b5061186f9250505060a0860160808701612b9b565b6001600160a01b03166342966c6861188a60c0880188613307565b8481811061189a5761189a61334c565b905060200201356040518263ffffffff1660e01b81526004016118bf91815260200190565b5f604051808303815f87803b1580156118d6575f5ffd5b505af11580156118e8573d5f5f3e3d5ffd5b505050508060010190506117a1565b50611a3d565b6040518060800160405280466001600160401b0316815260200185608001602081019061192a9190612b9b565b6001600160a01b0316815260200161195061194b60a0880160808901612b9b565b61203f565b815260200161196d61196860a0880160808901612b9b565b6120f1565b905291505f5b61198060c0860186613307565b9050811015611a3b5761199960a0860160808701612b9b565b6001600160a01b03166342842e0e33306119b660c08a018a613307565b868181106119c6576119c661334c565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015611a1a575f5ffd5b505af1158015611a2c573d5f5f3e3d5ffd5b50505050806001019050611973565b505b5030637f07c9478233611a566060880160408901612b9b565b611a6360c0890189613307565b604051602001611a779594939291906137f7565b60408051601f1981840301815290829052611a9491602401613888565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509150915091565b5f516020613ff95f395f51905f52546001600160a01b031690565b610c4f611d3b565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611b1e5761125583612137565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b78575060408051601f3d908101601f19168201909252611b759181019061389a565b60015b611bdb5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610bca565b5f516020613ff95f395f51905f528114611c495760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610bca565b506112558383836121d2565b5f611c6084846121fc565b905081158015611c7757506001600160a01b038116155b15610c6157604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610bca565b611cbb60c954610100900460ff1660021490565b611cd85760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6106905b6033546001600160a01b03163314610c7a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bca565b606580546001600160a01b0319169055610c4f8161229e565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611ddf81600161113f565b6001600160a01b0316336001600160a01b031614611e1057604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e709190613774565b91505f611e9183604001516109f06b195c98cdcc8c57dd985d5b1d60a21b90565b9050806001600160a01b031683602001516001600160a01b031614611ec957604051632583296b60e01b815260040160405180910390fd5b505090565b6001600160a01b0381161580611eec57506001600160a01b03811630145b15610c4f57604051635b50f3f960e01b815260040160405180910390fd5b611f1e60c954610100900460ff1660021490565b15611f3c5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611d2d565b806001600160a01b038116611fa35760405163538ba4f960e01b815260040160405180910390fd5b611fac836122ef565b6112558261234d565b80516001600160401b03165f90815261012e60209081526040808320828501516001600160a01b0390811685529252909120541680611ff7576106de826123bd565b919050565b815f0361200857505050565b61202283838360405180602001604052805f815250612598565b61125557604051634c67134d60e11b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169161208591906138b1565b5f60405180830381855afa9150503d805f81146120bd576040519150601f19603f3d011682016040523d82523d5f602084013e6120c2565b606091505b5091509150816120e05760405180602001604052805f8152506120e9565b6120e9816125d5565b949350505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169161208591906138b1565b6001600160a01b0381163b6121a45760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610bca565b5f516020613ff95f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b6121db83612742565b5f825111806121e75750805b15611255576121f68383612781565b50505050565b6097545f906001600160a01b03168061222857604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa15801561227a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e991906138cc565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166123155760405162461bcd60e51b8152600401610bca906138e7565b61231d6127a6565b61233b6001600160a01b038216156123355781611d95565b33611d95565b5060c9805461ff001916610100179055565b5f54610100900460ff166123735760405162461bcd60e51b8152600401610bca906138e7565b6001600160401b0346111561239b5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f6123d16033546001600160a01b031690565b609754602085015185516040808801516060890151915161240296956001600160a01b031694939290602401613932565b60408051601f198184030181529190526020810180516001600160e01b03166377c6257360e11b17905290506124496d627269646765645f65726337323160901b5f61113f565b81604051612456906128dd565b612461929190613993565b604051809103905ff08015801561247a573d5f5f3e3d5ffd5b506001600160a01b038082165f90815261012d60209081526040918290208751815492890151909416600160401b026001600160e01b03199092166001600160401b0390941693909317178255850151919350849160018201906124de9082613a01565b50606082015160028201906124f39082613a01565b505083516001600160401b039081165f90815261012e6020908152604080832082890180516001600160a01b039081168652919093529281902080546001600160a01b03191688851690811790915591518851828a015160608b01519351949750919094169493909316927f44977f2d30fe1e3aee2c1476f2f95aaacaf34e44b9359c403da01fcc93fd751b9261258a9290613abb565b60405180910390a450919050565b5f6001600160a01b0385166125c057604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b606060408251106125f457818060200190518101906106de9190613adf565b815160200361272f575f5b60208160ff161080156126345750828160ff16815181106126225761262261334c565b01602001516001600160f81b03191615155b1561264b578061264381613b10565b9150506125ff565b5f8160ff166001600160401b0381111561266757612667612c21565b6040519080825280601f01601f191660200182016040528015612691576020820181803683370190505b5090505f91505b60208260ff161080156126cd5750838260ff16815181106126bb576126bb61334c565b01602001516001600160f81b03191615155b15610c6157838260ff16815181106126e7576126e761334c565b602001015160f81c60f81b818360ff16815181106127075761270761334c565b60200101906001600160f81b03191690815f1a9053508161272781613b10565b925050612698565b505060408051602081019091525f815290565b61274b81612137565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610c618383604051806060016040528060278152602001614019602791396127cc565b5f54610100900460ff16610c7a5760405162461bcd60e51b8152600401610bca906138e7565b60605f5f856001600160a01b0316856040516127e891906138b1565b5f60405180830381855af49150503d805f8114612820576040519150601f19603f3d011682016040523d82523d5f602084013e612825565b606091505b509150915061283686838387612840565b9695505050505050565b606083156128ae5782515f036128a7576001600160a01b0385163b6128a75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bca565b50816120e9565b6120e983838151156128c35781518083602001fd5b8060405162461bcd60e51b8152600401610bca9190613888565b6104ca80613b2f83390190565b5f5f604083850312156128fb575f5ffd5b82356001600160401b03811115612910575f5ffd5b83016101608186031215612922575f5ffd5b946020939093013593505050565b5f60208284031215612940575f5ffd5b81356001600160e01b031981168114610c61575f5ffd5b6001600160a01b0381168114610c4f575f5ffd5b8035611ff781612957565b5f5f83601f840112612986575f5ffd5b5081356001600160401b0381111561299c575f5ffd5b6020830191508360208285010111156129b3575f5ffd5b9250929050565b5f5f5f5f5f608086880312156129ce575f5ffd5b85356129d981612957565b945060208601356129e981612957565b93506040860135925060608601356001600160401b03811115612a0a575f5ffd5b612a1688828901612976565b969995985093965092949392505050565b5f60208284031215612a37575f5ffd5b81356001600160401b03811115612a4c575f5ffd5b82016101008185031215610c61575f5ffd5b5f5b83811015612a78578181015183820152602001612a60565b50505f910152565b5f8151808452612a97816020860160208601612a5e565b601f01601f19169290920160200192915050565b60208152612ac56020820183516001600160401b03169052565b5f6020830151612ae060408401826001600160401b03169052565b50604083015163ffffffff811660608401525060608301516001600160a01b03811660808401525060808301516001600160401b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160401b03811660e08401525060e08301516001600160a01b038116610100840152506101008301516001600160a01b03811661012084015250610120830151610140830152610140830151610160808401526120e9610180840182612a80565b5f60208284031215612bab575f5ffd5b8135610c6181612957565b6001600160401b0381168114610c4f575f5ffd5b8035611ff781612bb6565b8015158114610c4f575f5ffd5b5f5f5f60608486031215612bf4575f5ffd5b8335612bff81612bb6565b9250602084013591506040840135612c1681612bd5565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612c5757612c57612c21565b60405290565b60405161010081016001600160401b0381118282101715612c5757612c57612c21565b60405161016081016001600160401b0381118282101715612c5757612c57612c21565b604051601f8201601f191681016001600160401b0381118282101715612ccb57612ccb612c21565b604052919050565b5f6001600160401b03821115612ceb57612ceb612c21565b50601f01601f191660200190565b5f82601f830112612d08575f5ffd5b8135602083015f612d20612d1b84612cd3565b612ca3565b9050828152858383011115612d33575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f60408385031215612d5e575f5ffd5b8235612d6981612957565b915060208301356001600160401b03811115612d83575f5ffd5b612d8f85828601612cf9565b9150509250929050565b5f5f60408385031215612daa575f5ffd5b823591506020830135612dbc81612957565b809150509250929050565b5f5f60208385031215612dd8575f5ffd5b82356001600160401b03811115612ded575f5ffd5b612df985828601612976565b90969095509350505050565b6001600160401b03851681526001600160a01b03841660208201526080604082018190525f90612e3790830185612a80565b8281036060840152612e498185612a80565b979650505050505050565b5f5f60408385031215612e65575f5ffd5b823591506020830135612dbc81612bd5565b5f5f60408385031215612e88575f5ffd5b8235612e9381612957565b91506020830135612dbc81612957565b5f5f8335601e19843603018112612eb8575f5ffd5b8301803591506001600160401b03821115612ed1575f5ffd5b6020019150368190038213156129b3575f5ffd5b5f5f85851115612ef3575f5ffd5b83861115612eff575f5ffd5b5050820193919092039150565b5f60208284031215612f1c575f5ffd5b81356001600160401b03811115612f31575f5ffd5b6120e984828501612cf9565b8051611ff781612bb6565b8051611ff781612957565b5f82601f830112612f62575f5ffd5b8151602083015f612f75612d1b84612cd3565b9050828152858383011115612f88575f5ffd5b612f96836020830184612a5e565b95945050505050565b5f6001600160401b03821115612fb757612fb7612c21565b5060051b60200190565b5f82601f830112612fd0575f5ffd5b8151612fde612d1b82612f9f565b8082825260208201915060208360051b860101925085831115612fff575f5ffd5b602085015b8381101561301c578051835260209283019201613004565b5095945050505050565b5f5f5f5f60808587031215613039575f5ffd5b84516001600160401b0381111561304e575f5ffd5b85016080818803121561305f575f5ffd5b613067612c35565b815161307281612bb6565b8152602082015161308281612957565b602082015260408201516001600160401b0381111561309f575f5ffd5b6130ab89828501612f53565b60408301525060608201516001600160401b038111156130c9575f5ffd5b6130d589828501612f53565b60608301525094506130eb905060208601612f48565b92506130f960408601612f48565b915060608501516001600160401b03811115613113575f5ffd5b61311f87828801612fc1565b91505092959194509250565b5f8151808452602084019350602083015f5b8281101561315b57815186526020958601959091019060010161313d565b5093949350505050565b6001600160a01b038581168252841660208201526080604082018190525f906131909083018561312b565b8281036060840152612e49818561312b565b63ffffffff81168114610c4f575f5ffd5b8035611ff7816131a2565b5f82601f8301126131cd575f5ffd5b81356131db612d1b82612f9f565b8082825260208201915060208360051b8601019250858311156131fc575f5ffd5b602085015b8381101561301c578035835260209283019201613201565b5f610100823603121561322a575f5ffd5b613232612c5d565b61323b83612bca565b81526132496020840161296b565b602082015261325a6040840161296b565b604082015261326b60608401612bca565b606082015261327c6080840161296b565b608082015261328d60a084016131b3565b60a082015260c08301356001600160401b038111156132aa575f5ffd5b6132b6368286016131be565b60c08301525060e08301356001600160401b038111156132d4575f5ffd5b6132e0368286016131be565b60e08301525092915050565b5f602082840312156132fc575f5ffd5b8135610c6181612bb6565b5f5f8335601e1984360301811261331c575f5ffd5b8301803591506001600160401b03821115613335575f5ffd5b6020019150600581901b36038213156129b3575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613370575f5ffd5b8135610c61816131a2565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106de576106de61337b565b8051611ff7816131a2565b5f5f604083850312156133be575f5ffd5b825160208401519092506001600160401b038111156133db575f5ffd5b830161016081860312156133ed575f5ffd5b6133f5612c80565b6133fe82612f3d565b815261340c60208301612f3d565b602082015261341d604083016133a2565b604082015261342e60608301612f48565b606082015261343f60808301612f3d565b608082015261345060a08301612f48565b60a082015261346160c08301612f3d565b60c082015261347260e08301612f48565b60e08201526134846101008301612f48565b61010082015261012082810151908201526101408201516001600160401b038111156134ae575f5ffd5b6134ba87828501612f53565b6101408301525080925050509250929050565b8183525f6001600160fb1b038311156134e4575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160401b03881681526001600160a01b0387811660208301528616604082015260a0606082018190525f9061353890830186886134cd565b828103608084015261354b8185876134cd565b9a9950505050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b5f5f5f5f60808587031215613604575f5ffd5b84356001600160401b03811115613619575f5ffd5b85016080818803121561362a575f5ffd5b613632612c35565b813561363d81612bb6565b8152602082013561364d81612957565b602082015260408201356001600160401b0381111561366a575f5ffd5b61367689828501612cf9565b60408301525060608201356001600160401b03811115613694575f5ffd5b6136a089828501612cf9565b60608301525094506136b690506020860161296b565b92506136c46040860161296b565b915060608501356001600160401b038111156136de575f5ffd5b61311f878288016131be565b6001600160401b03861681526001600160a01b0385811660208301528416604082015260a0606082018190525f906137249083018561312b565b8281036080840152613736818561312b565b98975050505050505050565b600181811c9082168061375657607f821691505b602082108103610b6457634e487b7160e01b5f52602260045260245ffd5b5f6060828403128015613785575f5ffd5b50604051606081016001600160401b03811182821017156137a8576137a8612c21565b6040528251815260208301516137bd81612957565b602082015260408301516137d081612bb6565b60408201529392505050565b5f602082840312156137ec575f5ffd5b8151610c6181612bd5565b608081526001600160401b03865116608082015260018060a01b0360208701511660a08201525f6040870151608060c0840152613838610100840182612a80565b90506060880151607f198483030160e08501526138558282612a80565b6001600160a01b0389811660208701528816604086015291506138759050565b82810360608401526137368185876134cd565b602081525f610c616020830184612a80565b5f602082840312156138aa575f5ffd5b5051919050565b5f82516138c2818460208701612a5e565b9190910192915050565b5f602082840312156138dc575f5ffd5b8151610c6181612957565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0387811682528681166020830152851660408201526001600160401b038416606082015260c0608082018190525f9061397490830185612a80565b82810360a08401526139868185612a80565b9998505050505050505050565b6001600160a01b03831681526040602082018190525f90610c5e90830184612a80565b601f82111561125557805f5260205f20601f840160051c810160208510156139db5750805b601f840160051c820191505b818110156139fa575f81556001016139e7565b5050505050565b81516001600160401b03811115613a1a57613a1a612c21565b613a2e81613a288454613742565b846139b6565b6020601f821160018114613a60575f8315613a495750848201515b5f19600385901b1c1916600184901b1784556139fa565b5f84815260208120601f198516915b82811015613a8f5787850151825560209485019460019092019101613a6f565b5084821015613aac57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b604081525f613acd6040830185612a80565b8281036020840152612f968185612a80565b5f60208284031215613aef575f5ffd5b81516001600160401b03811115613b04575f5ffd5b6120e984828501612f53565b5f60ff821660ff8103613b2557613b2561337b565b6001019291505056fe60806040526040516104ca3803806104ca833981016040819052610022916102d2565b61002d82825f610034565b50506103ed565b61003d8361005f565b5f825111806100495750805b1561005a57610058838361009e565b505b505050565b610068816100ca565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606100c383836040518060600160405280602781526020016104a36027913961017d565b9392505050565b6001600160a01b0381163b61013c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f856001600160a01b03168560405161019991906103a0565b5f60405180830381855af49150503d805f81146101d1576040519150601f19603f3d011682016040523d82523d5f602084013e6101d6565b606091505b5090925090506101e8868383876101f2565b9695505050505050565b606083156102605782515f03610259576001600160a01b0385163b6102595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610133565b508161026a565b61026a8383610272565b949350505050565b8151156102825781518083602001fd5b8060405162461bcd60e51b815260040161013391906103bb565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102ca5781810151838201526020016102b2565b50505f910152565b5f5f604083850312156102e3575f5ffd5b82516001600160a01b03811681146102f9575f5ffd5b60208401519092506001600160401b03811115610314575f5ffd5b8301601f81018513610324575f5ffd5b80516001600160401b0381111561033d5761033d61029c565b604051601f8201601f19908116603f011681016001600160401b038111828210171561036b5761036b61029c565b604052818152828201602001871015610382575f5ffd5b6103938260208301602086016102b0565b8093505050509250929050565b5f82516103b18184602087016102b0565b9190910192915050565b602081525f82518060208401526103d98160408501602087016102b0565b601f01601f19169190910160400192915050565b60aa806103f95f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122055e523a48576516437df6fcf2810806cc0aeefb1755d2891dc02a161b66f632464736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000003": { - "contractName": "ERC721Vault", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000003" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000004": { - "contractName": "ERC1155VaultImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x608060405260043610610195575f3560e01c8063715018a6116100e7578063a86f9d9e11610087578063e30c397811610062578063e30c3978146104a4578063f09a4016146104c1578063f23a6e61146104e0578063f2fde38b1461050c575f5ffd5b8063a86f9d9e14610401578063bc197c8114610420578063e07baba614610467575f5ffd5b80638456cb59116100c25780638456cb591461038d5780638abf6077146103a15780638da5cb5b146103b55780639aa8605c146103d2575f5ffd5b8063715018a61461035257806379ba5097146103665780637f07c9471461037a575f5ffd5b80633ab76e9f116101525780634f1ef2861161012d5780634f1ef286146102cb57806352d1902d146102de5780635c975abb146102f257806367090ccf14610312575f5ffd5b80633ab76e9f146102615780633eb6b8cf146102985780633f4ba83a146102b7575f5ffd5b80630178733a1461019957806301ffc9a7146101ae57806306fdde03146101e25780631f59a8301461020e5780633075db561461022e5780633659cfe614610242575b5f5ffd5b6101ac6101a7366004612861565b61052b565b005b3480156101b9575f5ffd5b506101cd6101c83660046128a7565b6106a1565b60405190151581526020015b60405180910390f35b3480156101ed575f5ffd5b506c195c98cc4c4d4d57dd985d5b1d609a1b5b6040519081526020016101d9565b61022161021c3660046128ce565b6106c0565b6040516101d99190612952565b348015610239575f5ffd5b506101cd610b47565b34801561024d575f5ffd5b506101ac61025c366004612a61565b610b5f565b34801561026c575f5ffd5b50609754610280906001600160a01b031681565b6040516001600160a01b0390911681526020016101d9565b3480156102a3575f5ffd5b506102806102b2366004612aa8565b610c2f565b3480156102c2575f5ffd5b506101ac610c45565b6101ac6102d9366004612c13565b610c59565b3480156102e9575f5ffd5b50610200610d0e565b3480156102fd575f5ffd5b506101cd60c954610100900460ff1660021490565b34801561031d575f5ffd5b5061028061032c366004612c5f565b61012e60209081525f92835260408084209091529082529020546001600160a01b031681565b34801561035d575f5ffd5b506101ac610dbf565b348015610371575f5ffd5b506101ac610dd0565b6101ac610388366004612cd1565b610e47565b348015610398575f5ffd5b506101ac610f73565b3480156103ac575f5ffd5b50610280610f86565b3480156103c0575f5ffd5b506033546001600160a01b0316610280565b3480156103dd575f5ffd5b506103f16103ec366004612a61565b610f94565b6040516101d99493929190612d0f565b34801561040c575f5ffd5b5061028061041b366004612d5e565b6110df565b34801561042b575f5ffd5b5061044e61043a366004612dc1565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b031990911681526020016101d9565b348015610472575f5ffd5b5060c95461048c906201000090046001600160401b031681565b6040516001600160401b0390911681526020016101d9565b3480156104af575f5ffd5b506065546001600160a01b0316610280565b3480156104cc575f5ffd5b506101ac6104db366004612e81565b6110eb565b3480156104eb575f5ffd5b5061044e6104fa366004612ead565b63f23a6e6160e01b9695505050505050565b348015610517575f5ffd5b506101ac610526366004612a61565b611202565b61053f60c954610100900460ff1660021490565b1561055d5760405163bae6e2a960e01b815260040160405180910390fd5b600261056b60c95460ff1690565b60ff160361058c5760405163dfc60d8560e01b815260040160405180910390fd5b6105966002611273565b61059e611289565b505f6105ae610140840184612f23565b6105bc916004908290612f65565b8101906105c99190612f8c565b90505f5f5f838060200190518101906105e291906130a6565b94509450505092505f610609848860a00160208101906106029190612a61565b858561137f565b905061063361012088013561062460c08a0160a08b01612a61565b6001600160a01b03169061146f565b61064360c0880160a08901612a61565b6001600160a01b0316867fe48bef18455e47bca14864ab6e82dffa29df148b051c09de95aec44ecf13598c8660200151848787604051610686949392919061320e565b60405180910390a3505050505061069d6001611273565b5050565b5f6106ab8261147a565b806106ba57506106ba826114c9565b92915050565b60408051610160810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925261014081019190915261072e60c954610100900460ff1660021490565b1561074c5760405163bae6e2a960e01b815260040160405180910390fd5b610755826132c2565b8060e00151518160c00151511461077f5760405163196e8a4160e31b815260040160405180910390fd5b60808101516001600160a01b03166107aa576040516303f8a7d360e01b815260040160405180910390fd5b60026107b860c95460ff1690565b60ff16036107d95760405163dfc60d8560e01b815260040160405180910390fd5b6107e36002611273565b6107f36080840160608501613395565b6001600160401b031634101561081c57604051630178ce0b60e31b815260040160405180910390fd5b5f5b61082b60e08501856133b0565b905081101561087f5761084160e08501856133b0565b82818110610851576108516133f5565b905060200201355f0361087757604051634299323b60e11b815260040160405180910390fd5b60010161081e565b506108aa636cdb3d1360e11b61089b60a0860160808701612a61565b6001600160a01b0316906114fd565b6108c757604051633ee915f560e11b815260040160405180910390fd5b5f5f6108d28561158a565b6040805161016081019091525f808252929450909250602081016108fc6080890160608a01613395565b6001600160401b0316815260200161091a60c0890160a08a01613409565b63ffffffff1681525f6020808301829052604083019190915233606083015260809091019061094b90890189613395565b6001600160401b031681526020015f6001600160a01b03168860200160208101906109769190612a61565b6001600160a01b03160361098a573361099a565b61099a6040890160208a01612a61565b6001600160a01b031681526020908101906109d3906109bb908a018a613395565b6c195c98cc4c4d4d57dd985d5b1d609a1b5b5f610c2f565b6001600160a01b031681526020016109f16080890160608a01613395565b610a04906001600160401b031634613438565b815260200184905290505f610a226562726964676560d01b826110df565b6001600160a01b0316631bdb003734846040518363ffffffff1660e01b8152600401610a4e9190612952565b5f6040518083038185885af1158015610a69573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052610a919190810190613456565b96509050610aa56060880160408901612a61565b6001600160a01b03168660a001516001600160a01b0316827fabbf62a1459339f9ac59136d313a5ccd83d2706cc6d4c04d90642520169144dc8960c0015187602001518c6080016020810190610afb9190612a61565b610b0860c08f018f6133b0565b8f8060e00190610b1891906133b0565b604051610b2b97969594939291906135a6565b60405180910390a450505050610b416001611273565b50919050565b5f6002610b5660c95460ff1690565b60ff1614905090565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000004163003610bb05760405162461bcd60e51b8152600401610ba790613602565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000046001600160a01b0316610be2611a4a565b6001600160a01b031614610c085760405162461bcd60e51b8152600401610ba79061364e565b610c1181611a65565b604080515f80825260208201909252610c2c91839190611a6d565b50565b5f610c3b848484611bd7565b90505b9392505050565b610c4d611c29565b610c57335f611cb9565b565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000000004163003610ca15760405162461bcd60e51b8152600401610ba790613602565b7f00000000000000000000000001670000000000000000000000000000000000046001600160a01b0316610cd3611a4a565b6001600160a01b031614610cf95760405162461bcd60e51b8152600401610ba79061364e565b610d0282611a65565b61069d82826001611a6d565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000000041614610dad5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610ba7565b505f5160206141d45f395f51905f5290565b610dc7611cbd565b610c575f611d17565b60655433906001600160a01b03168114610e3e5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610ba7565b610c2c81611d17565b610e5b60c954610100900460ff1660021490565b15610e795760405163bae6e2a960e01b815260040160405180910390fd5b6002610e8760c95460ff1690565b60ff1603610ea85760405163dfc60d8560e01b815260040160405180910390fd5b610eb26002611273565b5f80808080610ec38688018861369a565b945094509450945094505f610ed6611d30565b9050610ee184611e51565b5f610eee8786868661137f565b9050610f036001600160a01b0386163461146f565b846001600160a01b0316866001600160a01b0316835f01517f895f73e418d1bbbad2a311d085fad00e5d98a960e9f2afa4b942071d39bec43a85604001518b60200151868a8a604051610f5a9594939291906137bb565b60405180910390a45050505050505061069d6001611273565b610f7b611e8d565b610c57336001611cb9565b5f610f8f611a4a565b905090565b61012d6020525f9081526040902080546001820180546001600160401b03831693600160401b9093046001600160a01b0316929190610fd290613813565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe90613813565b80156110495780601f1061102057610100808354040283529160200191611049565b820191905f5260205f20905b81548152906001019060200180831161102c57829003601f168201915b50505050509080600201805461105e90613813565b80601f016020809104026020016040519081016040528092919081815260200182805461108a90613813565b80156110d55780601f106110ac576101008083540402835291602001916110d5565b820191905f5260205f20905b8154815290600101906020018083116110b857829003601f168201915b5050505050905084565b5f610c3e468484611bd7565b5f54610100900460ff161580801561110957505f54600160ff909116105b806111225750303b15801561112257505f5460ff166001145b6111855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610ba7565b5f805460ff1916600117905580156111a6575f805461ff0019166101001790555b6111b08383611efe565b6111b8611f38565b80156111fd575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61120a611cbd565b606580546001600160a01b0383166001600160a01b0319909116811790915561123b6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60c9805460ff191660ff92909216919091179055565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b6112ba8160016110df565b6001600160a01b0316336001600160a01b0316146112eb57604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611327573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134b9190613845565b60208101519092506001600160a01b0316331461137b57604051632583296b60e01b815260040160405180910390fd5b5090565b5f46855f01516001600160401b0316036113fd57506020840151604051631759616b60e11b81526001600160a01b03821690632eb2c2d6906113cb9030908890889088906004016138ad565b5f604051808303815f87803b1580156113e2575f5ffd5b505af11580156113f4573d5f5f3e3d5ffd5b50505050611467565b61140685611f5e565b60405163d81d0a1560e01b81529091506001600160a01b0382169063d81d0a159061143990879087908790600401613906565b5f604051808303815f87803b158015611450575f5ffd5b505af1158015611462573d5f5f3e3d5ffd5b505050505b949350505050565b61069d82825a611fa5565b5f6001600160e01b0319821662bc399d60e11b14806114a957506001600160e01b03198216637f07c94760e01b145b806106ba57506001600160e01b031982166301ffc9a760e01b1492915050565b5f6001600160e01b03198216630271189760e51b14806106ba57506301ffc9a760e01b6001600160e01b03198316146106ba565b5f6001600160a01b0383163b61151457505f6106ba565b6040516301ffc9a760e01b81526001600160e01b0319831660048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa92505050801561157e575060408051601f3d908101601f1916820190925261157b9181019061393b565b60015b156106ba579392505050565b604080516080810182525f808252602082015260609181018290528082018290525f61012d816115c060a0870160808801612a61565b6001600160a01b03908116825260208201929092526040015f208054909250600160401b900416156118b3576040805160808101825282546001600160401b0381168252600160401b90046001600160a01b0316602082015260018301805491928492908401919061163190613813565b80601f016020809104026020016040519081016040528092919081815260200182805461165d90613813565b80156116a85780601f1061167f576101008083540402835291602001916116a8565b820191905f5260205f20905b81548152906001019060200180831161168b57829003601f168201915b505050505081526020016002820180546116c190613813565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed90613813565b80156117385780601f1061170f57610100808354040283529160200191611738565b820191905f5260205f20905b81548152906001019060200180831161171b57829003601f168201915b50505050508152505091508360800160208101906117569190612a61565b6001600160a01b0316632eb2c2d6333061177360c08901896133b0565b61178060e08b018b6133b0565b6040518763ffffffff1660e01b81526004016117a196959493929190613956565b5f604051808303815f87803b1580156117b8575f5ffd5b505af11580156117ca573d5f5f3e3d5ffd5b505050505f5b6117dd60c08601866133b0565b90508110156118ad576117f660a0860160808701612a61565b6001600160a01b031663b390c0ab61181160c08801886133b0565b84818110611821576118216133f5565b90506020020135878060e0019061183891906133b0565b85818110611848576118486133f5565b905060200201356040518363ffffffff1660e01b8152600401611875929190918252602082015260400190565b5f604051808303815f87803b15801561188c575f5ffd5b505af115801561189e573d5f5f3e3d5ffd5b505050508060010190506117d0565b506119b0565b6040518060800160405280466001600160401b031681526020018560800160208101906118e09190612a61565b6001600160a01b0316815260200161190661190160a0880160808901612a61565b611fe8565b815260200161192361191e60a0880160808901612a61565b612092565b9052915061193760a0850160808601612a61565b6001600160a01b0316632eb2c2d6333061195460c08901896133b0565b61196160e08b018b6133b0565b6040518763ffffffff1660e01b815260040161198296959493929190613956565b5f604051808303815f87803b158015611999575f5ffd5b505af11580156119ab573d5f5f3e3d5ffd5b505050505b5030637f07c94782336119c96060880160408901612a61565b6119d660c08901896133b0565b6119e360e08b018b6133b0565b6040516020016119f997969594939291906139b3565b60408051601f1981840301815290829052611a1691602401613a63565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509150915091565b5f5160206141d45f395f51905f52546001600160a01b031690565b610c2c611cbd565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611aa0576111fd836120d8565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611afa575060408051601f3d908101601f19168201909252611af791810190613a75565b60015b611b5d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610ba7565b5f5160206141d45f395f51905f528114611bcb5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610ba7565b506111fd838383612173565b5f611be2848461219d565b905081158015611bf957506001600160a01b038116155b15610c3e57604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610ba7565b611c3d60c954610100900460ff1660021490565b611c5a5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61069d5b6033546001600160a01b03163314610c575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba7565b606580546001600160a01b0319169055610c2c8161223f565b604080516060810182525f80825260208201819052918101919091526562726964676560d01b611d618160016110df565b6001600160a01b0316336001600160a01b031614611d9257604051630d85cccf60e11b815260040160405180910390fd5b336001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611dce573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611df29190613845565b91505f611e1483604001516109cd6c195c98cc4c4d4d57dd985d5b1d609a1b90565b9050806001600160a01b031683602001516001600160a01b031614611e4c57604051632583296b60e01b815260040160405180910390fd5b505090565b6001600160a01b0381161580611e6f57506001600160a01b03811630145b15610c2c57604051635b50f3f960e01b815260040160405180910390fd5b611ea160c954610100900460ff1660021490565b15611ebf5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611caf565b806001600160a01b038116611f265760405163538ba4f960e01b815260040160405180910390fd5b611f2f83612290565b6111fd826122ee565b5f54610100900460ff16610c575760405162461bcd60e51b8152600401610ba790613a8c565b80516001600160401b03165f90815261012e60209081526040808320828501516001600160a01b0390811685529252909120541680611fa0576106ba8261235e565b919050565b815f03611fb157505050565b611fcb83838360405180602001604052805f81525061253a565b6111fd57604051634c67134d60e11b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169161202e9190613ad7565b5f60405180830381855afa9150503d805f8114612066576040519150601f19603f3d011682016040523d82523d5f602084013e61206b565b606091505b5091509150816120895760405180602001604052805f815250611467565b61146781612577565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169161202e9190613ad7565b6001600160a01b0381163b6121455760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610ba7565b5f5160206141d45f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b61217c836126e4565b5f825111806121885750805b156111fd576121978383612723565b50505050565b6097545f906001600160a01b0316806121c957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa15801561221b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114679190613af2565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166122b65760405162461bcd60e51b8152600401610ba790613a8c565b6122be611f38565b6122dc6001600160a01b038216156122d65781611d17565b33611d17565b5060c9805461ff001916610100179055565b5f54610100900460ff166123145760405162461bcd60e51b8152600401610ba790613a8c565b6001600160401b0346111561233c5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f6123726033546001600160a01b031690565b60975460208501518551604080880151606089015191516123a396956001600160a01b031694939290602401613b0d565b60408051601f198184030181529190526020810180516001600160e01b03166377c6257360e11b17905290506123eb6e627269646765645f6572633131353560881b5f6110df565b816040516123f890612854565b612403929190613b6e565b604051809103905ff08015801561241c573d5f5f3e3d5ffd5b506001600160a01b038082165f90815261012d60209081526040918290208751815492890151909416600160401b026001600160e01b03199092166001600160401b0390941693909317178255850151919350849160018201906124809082613bdc565b50606082015160028201906124959082613bdc565b505083516001600160401b039081165f90815261012e6020908152604080832082890180516001600160a01b039081168652919093529281902080546001600160a01b03191688851690811790915591518851828a015160608b01519351949750919094169493909316927f44977f2d30fe1e3aee2c1476f2f95aaacaf34e44b9359c403da01fcc93fd751b9261252c9290613c96565b60405180910390a450919050565b5f6001600160a01b03851661256257604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b6060604082511061259657818060200190518101906106ba9190613cba565b81516020036126d1575f5b60208160ff161080156125d65750828160ff16815181106125c4576125c46133f5565b01602001516001600160f81b03191615155b156125ed57806125e581613ceb565b9150506125a1565b5f8160ff166001600160401b0381111561260957612609612ae7565b6040519080825280601f01601f191660200182016040528015612633576020820181803683370190505b5090505f91505b60208260ff1610801561266f5750838260ff168151811061265d5761265d6133f5565b01602001516001600160f81b03191615155b15610c3e57838260ff1681518110612689576126896133f5565b602001015160f81c60f81b818360ff16815181106126a9576126a96133f5565b60200101906001600160f81b03191690815f1a905350816126c981613ceb565b92505061263a565b505060408051602081019091525f815290565b6126ed816120d8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610c3e83836040518060600160405280602781526020016141f46027913960605f5f856001600160a01b03168560405161275f9190613ad7565b5f60405180830381855af49150503d805f8114612797576040519150601f19603f3d011682016040523d82523d5f602084013e61279c565b606091505b50915091506127ad868383876127b7565b9695505050505050565b606083156128255782515f0361281e576001600160a01b0385163b61281e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ba7565b5081611467565b611467838381511561283a5781518083602001fd5b8060405162461bcd60e51b8152600401610ba79190613a63565b6104ca80613d0a83390190565b5f5f60408385031215612872575f5ffd5b82356001600160401b03811115612887575f5ffd5b83016101608186031215612899575f5ffd5b946020939093013593505050565b5f602082840312156128b7575f5ffd5b81356001600160e01b031981168114610c3e575f5ffd5b5f602082840312156128de575f5ffd5b81356001600160401b038111156128f3575f5ffd5b82016101008185031215610c3e575f5ffd5b5f5b8381101561291f578181015183820152602001612907565b50505f910152565b5f815180845261293e816020860160208601612905565b601f01601f19169290920160200192915050565b6020815261296c6020820183516001600160401b03169052565b5f602083015161298760408401826001600160401b03169052565b50604083015163ffffffff811660608401525060608301516001600160a01b03811660808401525060808301516001600160401b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160401b03811660e08401525060e08301516001600160a01b038116610100840152506101008301516001600160a01b0381166101208401525061012083015161014083015261014083015161016080840152611467610180840182612927565b6001600160a01b0381168114610c2c575f5ffd5b8035611fa081612a42565b5f60208284031215612a71575f5ffd5b8135610c3e81612a42565b6001600160401b0381168114610c2c575f5ffd5b8035611fa081612a7c565b8015158114610c2c575f5ffd5b5f5f5f60608486031215612aba575f5ffd5b8335612ac581612a7c565b9250602084013591506040840135612adc81612a9b565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612b1d57612b1d612ae7565b60405290565b60405161010081016001600160401b0381118282101715612b1d57612b1d612ae7565b60405161016081016001600160401b0381118282101715612b1d57612b1d612ae7565b604051601f8201601f191681016001600160401b0381118282101715612b9157612b91612ae7565b604052919050565b5f6001600160401b03821115612bb157612bb1612ae7565b50601f01601f191660200190565b5f82601f830112612bce575f5ffd5b8135602083015f612be6612be184612b99565b612b69565b9050828152858383011115612bf9575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f60408385031215612c24575f5ffd5b8235612c2f81612a42565b915060208301356001600160401b03811115612c49575f5ffd5b612c5585828601612bbf565b9150509250929050565b5f5f60408385031215612c70575f5ffd5b823591506020830135612c8281612a42565b809150509250929050565b5f5f83601f840112612c9d575f5ffd5b5081356001600160401b03811115612cb3575f5ffd5b602083019150836020828501011115612cca575f5ffd5b9250929050565b5f5f60208385031215612ce2575f5ffd5b82356001600160401b03811115612cf7575f5ffd5b612d0385828601612c8d565b90969095509350505050565b6001600160401b03851681526001600160a01b03841660208201526080604082018190525f90612d4190830185612927565b8281036060840152612d538185612927565b979650505050505050565b5f5f60408385031215612d6f575f5ffd5b823591506020830135612c8281612a9b565b5f5f83601f840112612d91575f5ffd5b5081356001600160401b03811115612da7575f5ffd5b6020830191508360208260051b8501011115612cca575f5ffd5b5f5f5f5f5f5f5f5f60a0898b031215612dd8575f5ffd5b8835612de381612a42565b97506020890135612df381612a42565b965060408901356001600160401b03811115612e0d575f5ffd5b612e198b828c01612d81565b90975095505060608901356001600160401b03811115612e37575f5ffd5b612e438b828c01612d81565b90955093505060808901356001600160401b03811115612e61575f5ffd5b612e6d8b828c01612c8d565b999c989b5096995094979396929594505050565b5f5f60408385031215612e92575f5ffd5b8235612e9d81612a42565b91506020830135612c8281612a42565b5f5f5f5f5f5f60a08789031215612ec2575f5ffd5b8635612ecd81612a42565b95506020870135612edd81612a42565b9450604087013593506060870135925060808701356001600160401b03811115612f05575f5ffd5b612f1189828a01612c8d565b979a9699509497509295939492505050565b5f5f8335601e19843603018112612f38575f5ffd5b8301803591506001600160401b03821115612f51575f5ffd5b602001915036819003821315612cca575f5ffd5b5f5f85851115612f73575f5ffd5b83861115612f7f575f5ffd5b5050820193919092039150565b5f60208284031215612f9c575f5ffd5b81356001600160401b03811115612fb1575f5ffd5b61146784828501612bbf565b8051611fa081612a7c565b8051611fa081612a42565b5f82601f830112612fe2575f5ffd5b8151602083015f612ff5612be184612b99565b9050828152858383011115613008575f5ffd5b613016836020830184612905565b95945050505050565b5f6001600160401b0382111561303757613037612ae7565b5060051b60200190565b5f82601f830112613050575f5ffd5b815161305e612be18261301f565b8082825260208201915060208360051b86010192508583111561307f575f5ffd5b602085015b8381101561309c578051835260209283019201613084565b5095945050505050565b5f5f5f5f5f60a086880312156130ba575f5ffd5b85516001600160401b038111156130cf575f5ffd5b8601608081890312156130e0575f5ffd5b6130e8612afb565b81516130f381612a7c565b8152602082015161310381612a42565b602082015260408201516001600160401b03811115613120575f5ffd5b61312c8a828501612fd3565b60408301525060608201516001600160401b0381111561314a575f5ffd5b6131568a828501612fd3565b606083015250955061316c905060208701612fc8565b935061317a60408701612fc8565b925060608601516001600160401b03811115613194575f5ffd5b6131a088828901613041565b92505060808601516001600160401b038111156131bb575f5ffd5b6131c788828901613041565b9150509295509295909350565b5f8151808452602084019350602083015f5b828110156132045781518652602095860195909101906001016131e6565b5093949350505050565b6001600160a01b038581168252841660208201526080604082018190525f90613239908301856131d4565b8281036060840152612d5381856131d4565b63ffffffff81168114610c2c575f5ffd5b8035611fa08161324b565b5f82601f830112613276575f5ffd5b8135613284612be18261301f565b8082825260208201915060208360051b8601019250858311156132a5575f5ffd5b602085015b8381101561309c5780358352602092830192016132aa565b5f61010082360312156132d3575f5ffd5b6132db612b23565b6132e483612a90565b81526132f260208401612a56565b602082015261330360408401612a56565b604082015261331460608401612a90565b606082015261332560808401612a56565b608082015261333660a0840161325c565b60a082015260c08301356001600160401b03811115613353575f5ffd5b61335f36828601613267565b60c08301525060e08301356001600160401b0381111561337d575f5ffd5b61338936828601613267565b60e08301525092915050565b5f602082840312156133a5575f5ffd5b8135610c3e81612a7c565b5f5f8335601e198436030181126133c5575f5ffd5b8301803591506001600160401b038211156133de575f5ffd5b6020019150600581901b3603821315612cca575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613419575f5ffd5b8135610c3e8161324b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106ba576106ba613424565b8051611fa08161324b565b5f5f60408385031215613467575f5ffd5b825160208401519092506001600160401b03811115613484575f5ffd5b83016101608186031215613496575f5ffd5b61349e612b46565b6134a782612fbd565b81526134b560208301612fbd565b60208201526134c66040830161344b565b60408201526134d760608301612fc8565b60608201526134e860808301612fbd565b60808201526134f960a08301612fc8565b60a082015261350a60c08301612fbd565b60c082015261351b60e08301612fc8565b60e082015261352d6101008301612fc8565b61010082015261012082810151908201526101408201516001600160401b03811115613557575f5ffd5b61356387828501612fd3565b6101408301525080925050509250929050565b8183525f6001600160fb1b0383111561358d575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160401b03881681526001600160a01b0387811660208301528616604082015260a0606082018190525f906135e19083018688613576565b82810360808401526135f4818587613576565b9a9950505050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b5f5f5f5f5f60a086880312156136ae575f5ffd5b85356001600160401b038111156136c3575f5ffd5b8601608081890312156136d4575f5ffd5b6136dc612afb565b81356136e781612a7c565b815260208201356136f781612a42565b602082015260408201356001600160401b03811115613714575f5ffd5b6137208a828501612bbf565b60408301525060608201356001600160401b0381111561373e575f5ffd5b61374a8a828501612bbf565b6060830152509550613760905060208701612a56565b935061376e60408701612a56565b925060608601356001600160401b03811115613788575f5ffd5b61379488828901613267565b92505060808601356001600160401b038111156137af575f5ffd5b6131c788828901613267565b6001600160401b03861681526001600160a01b0385811660208301528416604082015260a0606082018190525f906137f5908301856131d4565b828103608084015261380781856131d4565b98975050505050505050565b600181811c9082168061382757607f821691505b602082108103610b4157634e487b7160e01b5f52602260045260245ffd5b5f6060828403128015613856575f5ffd5b50604051606081016001600160401b038111828210171561387957613879612ae7565b60405282518152602083015161388e81612a42565b602082015260408301516138a181612a7c565b60408201529392505050565b6001600160a01b0385811682528416602082015260a0604082018190525f906138d8908301856131d4565b82810360608401526138ea81856131d4565b83810360809094019390935250505f8152602001949350505050565b6001600160a01b03841681526060602082018190525f90613929908301856131d4565b82810360408401526127ad81856131d4565b5f6020828403121561394b575f5ffd5b8151610c3e81612a9b565b6001600160a01b0387811682528616602082015260a0604082018190525f906139829083018688613576565b8281036060840152613995818587613576565b83810360809094019390935250505f81526020019695505050505050565b60a080825288516001600160401b03169082015260208801516001600160a01b031660c08201526040880151608060e08301525f906139f6610120840182612927565b905060608a0151609f1984830301610100850152613a148282612927565b915050613a2c602084018a6001600160a01b03169052565b6001600160a01b03881660408401528281036060840152613a4e818789613576565b905082810360808401526135f4818587613576565b602081525f610c3e6020830184612927565b5f60208284031215613a85575f5ffd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251613ae8818460208701612905565b9190910192915050565b5f60208284031215613b02575f5ffd5b8151610c3e81612a42565b6001600160a01b0387811682528681166020830152851660408201526001600160401b038416606082015260c0608082018190525f90613b4f90830185612927565b82810360a0840152613b618185612927565b9998505050505050505050565b6001600160a01b03831681526040602082018190525f90610c3b90830184612927565b601f8211156111fd57805f5260205f20601f840160051c81016020851015613bb65750805b601f840160051c820191505b81811015613bd5575f8155600101613bc2565b5050505050565b81516001600160401b03811115613bf557613bf5612ae7565b613c0981613c038454613813565b84613b91565b6020601f821160018114613c3b575f8315613c245750848201515b5f19600385901b1c1916600184901b178455613bd5565b5f84815260208120601f198516915b82811015613c6a5787850151825560209485019460019092019101613c4a565b5084821015613c8757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b604081525f613ca86040830185612927565b82810360208401526130168185612927565b5f60208284031215613cca575f5ffd5b81516001600160401b03811115613cdf575f5ffd5b61146784828501612fd3565b5f60ff821660ff8103613d0057613d00613424565b6001019291505056fe60806040526040516104ca3803806104ca833981016040819052610022916102d2565b61002d82825f610034565b50506103ed565b61003d8361005f565b5f825111806100495750805b1561005a57610058838361009e565b505b505050565b610068816100ca565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606100c383836040518060600160405280602781526020016104a36027913961017d565b9392505050565b6001600160a01b0381163b61013c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f856001600160a01b03168560405161019991906103a0565b5f60405180830381855af49150503d805f81146101d1576040519150601f19603f3d011682016040523d82523d5f602084013e6101d6565b606091505b5090925090506101e8868383876101f2565b9695505050505050565b606083156102605782515f03610259576001600160a01b0385163b6102595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610133565b508161026a565b61026a8383610272565b949350505050565b8151156102825781518083602001fd5b8060405162461bcd60e51b815260040161013391906103bb565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156102ca5781810151838201526020016102b2565b50505f910152565b5f5f604083850312156102e3575f5ffd5b82516001600160a01b03811681146102f9575f5ffd5b60208401519092506001600160401b03811115610314575f5ffd5b8301601f81018513610324575f5ffd5b80516001600160401b0381111561033d5761033d61029c565b604051601f8201601f19908116603f011681016001600160401b038111828210171561036b5761036b61029c565b604052818152828201602001871015610382575f5ffd5b6103938260208301602086016102b0565b8093505050509250929050565b5f82516103b18184602087016102b0565b9190910192915050565b602081525f82518060208401526103d98160408501602087016102b0565b601f01601f19169190910160400192915050565b60aa806103f95f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220e67f8ea00e362cad72cd2e8e61f89b237848f76dd2a93bc34c0064a232f8158c64736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000004": { - "contractName": "ERC1155Vault", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000004" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010096": { - "contractName": "BridgedERC20", - "storage": {}, - "code": "0x608060405260043610610233575f3560e01c806370a0823111610129578063a77f1516116100a8578063dd62ed3e1161006d578063dd62ed3e14610684578063e07baba6146106a3578063e30c3978146106e0578063f12506c1146106fd578063f2fde38b14610711575f5ffd5b8063a77f1516146105e7578063a86f9d9e14610608578063a9059cbb14610627578063b8f2e0c514610646578063bb86ef9314610665575f5ffd5b80638456cb59116100ee5780638456cb591461056f5780638abf6077146105835780638da5cb5b1461059757806395d89b41146105b4578063a457c2d7146105c8575f5ffd5b806370a08231146104d3578063715018a61461050757806379ba50971461051b5780637cf8ed0d1461052f5780637e4746341461054f575f5ffd5b806339509351116101b557806342966c681161017a57806342966c681461045757806349d12605146104765780634f1ef2861461048c57806352d1902d1461049f5780635c975abb146104b3575f5ffd5b806339509351146103af5780633ab76e9f146103ce5780633eb6b8cf146104055780633f4ba83a1461042457806340c10f1914610438575f5ffd5b806323b872dd116101fb57806323b872dd146102ea57806326afaadd146103095780633075db561461034d578063313ce567146103615780633659cfe61461038e575f5ffd5b806301ffc9a71461023757806306fdde031461026b578063095ea7b31461028c5780630ae74548146102ab57806318160ddd146102cc575b5f5ffd5b348015610242575f5ffd5b5061025661025136600461218c565b610730565b60405190151581526020015b60405180910390f35b348015610276575f5ffd5b5061027f6107d2565b60405161026291906121d5565b348015610297575f5ffd5b506102566102a636600461221b565b610862565b3480156102b6575f5ffd5b5061012f5461025690600160a01b900460ff1681565b3480156102d7575f5ffd5b5060fd545b604051908152602001610262565b3480156102f5575f5ffd5b50610256610304366004612245565b610879565b348015610314575f5ffd5b5061032e61012d5461012e546001600160a01b0390911691565b604080516001600160a01b039093168352602083019190915201610262565b348015610358575f5ffd5b5061025661089e565b34801561036c575f5ffd5b5061012d54600160a01b900460ff165b60405160ff9091168152602001610262565b348015610399575f5ffd5b506103ad6103a8366004612283565b6108b6565b005b3480156103ba575f5ffd5b506102566103c936600461221b565b610986565b3480156103d9575f5ffd5b506097546103ed906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b348015610410575f5ffd5b506103ed61041f3660046122b2565b6109a7565b34801561042f575f5ffd5b506103ad6109bb565b348015610443575f5ffd5b506103ad61045236600461221b565b6109cf565b348015610462575f5ffd5b506103ad6104713660046122f8565b610ae9565b348015610481575f5ffd5b506102dc61012e5481565b6103ad61049a366004612323565b610c26565b3480156104aa575f5ffd5b506102dc610cdb565b3480156104be575f5ffd5b5061025660c954610100900460ff1660021490565b3480156104de575f5ffd5b506102dc6104ed366004612283565b6001600160a01b03165f90815260fb602052604090205490565b348015610512575f5ffd5b506103ad610d8c565b348015610526575f5ffd5b506103ad610d9d565b34801561053a575f5ffd5b5061012d546103ed906001600160a01b031681565b34801561055a575f5ffd5b5061012f546103ed906001600160a01b031681565b34801561057a575f5ffd5b506103ad610e14565b34801561058e575f5ffd5b506103ed610e27565b3480156105a2575f5ffd5b506033546001600160a01b03166103ed565b3480156105bf575f5ffd5b5061027f610e35565b3480156105d3575f5ffd5b506102566105e236600461221b565b610e44565b3480156105f2575f5ffd5b5061012d5461037c90600160a01b900460ff1681565b348015610613575f5ffd5b506103ed6106223660046123e6565b610ec9565b348015610632575f5ffd5b5061025661064136600461221b565b610ed5565b348015610651575f5ffd5b506103ad610660366004612410565b610ee2565b348015610670575f5ffd5b506103ad61067f36600461247e565b61105f565b34801561068f575f5ffd5b506102dc61069e366004612544565b61121f565b3480156106ae575f5ffd5b5060c9546106c8906201000090046001600160401b031681565b6040516001600160401b039091168152602001610262565b3480156106eb575f5ffd5b506065546001600160a01b03166103ed565b348015610708575f5ffd5b50610256611249565b34801561071c575f5ffd5b506103ad61072b366004612283565b611274565b5f6001600160e01b0319821663093e326b60e21b148061076057506001600160e01b0319821663bb86ef9360e01b145b8061077b57506001600160e01b0319821663b8f2e0c560e01b145b8061079657506001600160e01b031982166336372b0760e01b145b806107b157506001600160e01b0319821663a219a02560e01b145b806107cc57506001600160e01b031982166301ffc9a760e01b145b92915050565b606060fe80546107e19061257b565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061257b565b80156108585780601f1061082f57610100808354040283529160200191610858565b820191905f5260205f20905b81548152906001019060200180831161083b57829003601f168201915b5050505050905090565b5f3361086f8185856112e5565b5060019392505050565b5f33610886858285611408565b610891858585611480565b60019150505b9392505050565b5f60026108ad60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100961630036109075760405162461bcd60e51b81526004016108fe906125b3565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000100966001600160a01b0316610939611634565b6001600160a01b03161461095f5760405162461bcd60e51b81526004016108fe906125ff565b6109688161164f565b604080515f8082526020820190925261098391839190611657565b50565b5f3361086f818585610998838361121f565b6109a2919061264b565b6112e5565b5f6109b38484846117c1565b949350505050565b6109c3611813565b6109cd335f6118a3565b565b6109e360c954610100900460ff1660021490565b15610a015760405163bae6e2a960e01b815260040160405180910390fd5b6002610a0f60c95460ff1690565b60ff1603610a305760405163dfc60d8560e01b815260040160405180910390fd5b610a3a60026118ab565b610a42611249565b15610a605760405163270bf77560e01b815260040160405180910390fd5b61012f546001600160a01b031633819003610ac757826001600160a01b0316816001600160a01b03167fe502aa3e015149f4b76a0b2b5394e3100903c4af27c3ddc98385395d3f55252684604051610aba91815260200190565b60405180910390a3610ad0565b610ad0336118c1565b610ada838361193d565b50610ae560016118ab565b5050565b610afd60c954610100900460ff1660021490565b15610b1b5760405163bae6e2a960e01b815260040160405180910390fd5b6002610b2960c95460ff1690565b60ff1603610b4a5760405163dfc60d8560e01b815260040160405180910390fd5b610b5460026118ab565b610b5c611249565b15610c095761012f546040518281526001600160a01b0390911690339082907f638edf84937fb2534b47cac985ea84d6ea4f4076315b56ea1c784d26b87e2bcb9060200160405180910390a36040516340c10f1960e01b8152336004820152602481018390526001600160a01b038216906340c10f19906044015f604051808303815f87803b158015610bed575f5ffd5b505af1158015610bff573d5f5f3e3d5ffd5b5050505050610c12565b610c12336118c1565b610c1c3382611a07565b61098360016118ab565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000010096163003610c6e5760405162461bcd60e51b81526004016108fe906125b3565b7f00000000000000000000000001670000000000000000000000000000000100966001600160a01b0316610ca0611634565b6001600160a01b031614610cc65760405162461bcd60e51b81526004016108fe906125ff565b610ccf8261164f565b610ae582826001611657565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000100961614610d7a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108fe565b505f5160206128085f395f51905f5290565b610d94611b44565b6109cd5f611b9e565b60655433906001600160a01b03168114610e0b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016108fe565b61098381611b9e565b610e1c611bb7565b6109cd3360016118a3565b5f610e30611634565b905090565b606060ff80546107e19061257b565b5f3381610e51828661121f565b905083811015610eb15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108fe565b610ebe82868684036112e5565b506001949350505050565b5f6108974684846117c1565b5f3361086f818585611480565b610ef660c954610100900460ff1660021490565b15610f145760405163bae6e2a960e01b815260040160405180910390fd5b6a195c98cc8c17dd985d5b1d60aa1b610f2e816001610ec9565b6001600160a01b0316336001600160a01b031614610f5f57604051630d85cccf60e11b815260040160405180910390fd5b6002610f6d60c95460ff1690565b60ff1603610f8e5760405163dfc60d8560e01b815260040160405180910390fd5b610f9860026118ab565b61012f546001600160a01b038481169116148015610fc9575061012f60149054906101000a900460ff161515821515145b15610fe75760405163c118d2f360e01b815260040160405180910390fd5b61012f80546001600160a01b0385166001600160a81b03199091168117600160a01b851515908102919091179092556040805191825260208201929092527fa6b6f959792843a48d9d03d13595f2de7c86ae0ce12ef0fa759dd911b205e565910160405180910390a161105a60016118ab565b505050565b5f54610100900460ff161580801561107d57505f54600160ff909116105b806110965750303b15801561109657505f5460ff166001145b6110f95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108fe565b5f805460ff19166001179055801561111a575f805461ff0019166101001790555b6111248888611c28565b61112e8a8a611c64565b61119f83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284375f92019190915250611c9e92505050565b61012d805461012e89905560ff8816600160a01b026001600160a81b03199091166001600160a01b038b16171790558015611213575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b039182165f90815260fc6020908152604080832093909416825291909152205490565b61012f545f906001600160a01b031615801590610e3057505061012f54600160a01b900460ff161590565b61127c611b44565b606580546001600160a01b0383166001600160a01b031990911681179091556112ad6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0383166113475760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fe565b6001600160a01b0382166113a85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fe565b6001600160a01b038381165f81815260fc602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f611413848461121f565b90505f19811461147a578181101561146d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fe565b61147a84848484036112e5565b50505050565b6001600160a01b0383166114e45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fe565b6001600160a01b0382166115465760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fe565b611551838383611cce565b6001600160a01b0383165f90815260fb6020526040902054818110156115c85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fe565b6001600160a01b038085165f81815260fb602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116279086815260200190565b60405180910390a361147a565b5f5160206128085f395f51905f52546001600160a01b031690565b610983611b44565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561168a5761105a83611d09565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156116e4575060408051601f3d908101601f191682019092526116e19181019061266a565b60015b6117475760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108fe565b5f5160206128085f395f51905f5281146117b55760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108fe565b5061105a838383611da4565b5f6117cc8484611dc8565b9050811580156117e357506001600160a01b038116155b1561089757604051632b0d65db60e01b81526001600160401b0385166004820152602481018490526044016108fe565b61182760c954610100900460ff1660021490565b6118445760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610ae5611b44565b60c9805460ff191660ff92909216919091179055565b6a195c98cc8c17dd985d5b1d60aa1b6118e26033546001600160a01b031690565b6001600160a01b0316336001600160a01b03161415801561191f5750611909816001610ec9565b6001600160a01b0316336001600160a01b031614155b15610ae557604051630d85cccf60e11b815260040160405180910390fd5b6001600160a01b0382166119935760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fe565b61199e5f8383611cce565b8060fd5f8282546119af919061264b565b90915550506001600160a01b0382165f81815260fb60209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216611a675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108fe565b611a72825f83611cce565b6001600160a01b0382165f90815260fb602052604090205481811015611ae55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108fe565b6001600160a01b0383165f81815260fb60209081526040808320868603905560fd80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6033546001600160a01b031633146109cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108fe565b606580546001600160a01b031916905561098381611e6a565b611bcb60c954610100900460ff1660021490565b15611be95760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611899565b6001600160a01b0382161580611c3c575080155b80611c4657504681145b15610ae55760405163c118d2f360e01b815260040160405180910390fd5b806001600160a01b038116611c8c5760405163538ba4f960e01b815260040160405180910390fd5b611c9583611ebb565b61105a82611f19565b5f54610100900460ff16611cc45760405162461bcd60e51b81526004016108fe90612681565b610ae58282611f89565b611ce260c954610100900460ff1660021490565b15611d005760405163bae6e2a960e01b815260040160405180910390fd5b61105a82611fc8565b6001600160a01b0381163b611d765760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108fe565b5f5160206128085f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611dad83611ff1565b5f82511180611db95750805b1561105a5761147a8383612030565b6097545f906001600160a01b031680611df457604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611e46573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b391906126cc565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16611ee15760405162461bcd60e51b81526004016108fe90612681565b611ee9612055565b611f076001600160a01b03821615611f015781611b9e565b33611b9e565b5060c9805461ff001916610100179055565b5f54610100900460ff16611f3f5760405162461bcd60e51b81526004016108fe90612681565b6001600160401b03461115611f675760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f54610100900460ff16611faf5760405162461bcd60e51b81526004016108fe90612681565b60fe611fbb8382612732565b5060ff61105a8282612732565b306001600160a01b0382160361098357604051630c292c9d60e21b815260040160405180910390fd5b611ffa81611d09565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061089783836040518060600160405280602781526020016128286027913961207b565b5f54610100900460ff166109cd5760405162461bcd60e51b81526004016108fe90612681565b60605f5f856001600160a01b03168560405161209791906127ec565b5f60405180830381855af49150503d805f81146120cf576040519150601f19603f3d011682016040523d82523d5f602084013e6120d4565b606091505b50915091506120e5868383876120ef565b9695505050505050565b6060831561215d5782515f03612156576001600160a01b0385163b6121565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108fe565b50816109b3565b6109b383838151156121725781518083602001fd5b8060405162461bcd60e51b81526004016108fe91906121d5565b5f6020828403121561219c575f5ffd5b81356001600160e01b031981168114610897575f5ffd5b5f5b838110156121cd5781810151838201526020016121b5565b50505f910152565b602081525f82518060208401526121f38160408501602087016121b3565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610983575f5ffd5b5f5f6040838503121561222c575f5ffd5b823561223781612207565b946020939093013593505050565b5f5f5f60608486031215612257575f5ffd5b833561226281612207565b9250602084013561227281612207565b929592945050506040919091013590565b5f60208284031215612293575f5ffd5b813561089781612207565b803580151581146122ad575f5ffd5b919050565b5f5f5f606084860312156122c4575f5ffd5b83356001600160401b03811681146122da575f5ffd5b9250602084013591506122ef6040850161229e565b90509250925092565b5f60208284031215612308575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612334575f5ffd5b823561233f81612207565b915060208301356001600160401b03811115612359575f5ffd5b8301601f81018513612369575f5ffd5b80356001600160401b038111156123825761238261230f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156123b0576123b061230f565b6040528181528282016020018710156123c7575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f604083850312156123f7575f5ffd5b823591506124076020840161229e565b90509250929050565b5f5f60408385031215612421575f5ffd5b823561242c81612207565b91506124076020840161229e565b5f5f83601f84011261244a575f5ffd5b5081356001600160401b03811115612460575f5ffd5b602083019150836020828501011115612477575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60e08a8c031215612496575f5ffd5b89356124a181612207565b985060208a01356124b181612207565b975060408a01356124c181612207565b965060608a0135955060808a013560ff811681146124dd575f5ffd5b945060a08a01356001600160401b038111156124f7575f5ffd5b6125038c828d0161243a565b90955093505060c08a01356001600160401b03811115612521575f5ffd5b61252d8c828d0161243a565b915080935050809150509295985092959850929598565b5f5f60408385031215612555575f5ffd5b823561256081612207565b9150602083013561257081612207565b809150509250929050565b600181811c9082168061258f57607f821691505b6020821081036125ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b808201808211156107cc57634e487b7160e01b5f52601160045260245ffd5b5f6020828403121561267a575f5ffd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f602082840312156126dc575f5ffd5b815161089781612207565b601f82111561105a57805f5260205f20601f840160051c8101602085101561270c5750805b601f840160051c820191505b8181101561272b575f8155600101612718565b5050505050565b81516001600160401b0381111561274b5761274b61230f565b61275f81612759845461257b565b846126e7565b6020601f821160018114612791575f831561277a5750848201515b5f19600385901b1c1916600184901b17845561272b565b5f84815260208120601f198516915b828110156127c057878501518255602094850194600190920191016127a0565b50848210156127dd57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82516127fd8184602087016121b3565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206de11e098828560ed8b32ec4c49b5259fec7bac640db1effdfd9fcc5e0efa77b64736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010097": { - "contractName": "BridgedERC721", - "storage": {}, - "code": "0x608060405260043610610207575f3560e01c80636352211e11610113578063a22cb4651161009d578063e07baba61161006d578063e07baba6146105c3578063e30c397814610600578063e985e9c51461061d578063ef8c4ae614610665578063f2fde38b14610684575f5ffd5b8063a22cb46514610547578063a86f9d9e14610566578063b88d4fde14610585578063c87b56dd146105a4575f5ffd5b80637cf8ed0d116100e35780637cf8ed0d146104ce5780638456cb59146104ee5780638abf6077146105025780638da5cb5b1461051657806395d89b4114610533575f5ffd5b80636352211e1461046857806370a0823114610487578063715018a6146104a657806379ba5097146104ba575f5ffd5b80633eb6b8cf1161019457806342966c681161016457806342966c68146103de57806349d12605146103fd5780634f1ef2861461042157806352d1902d146104345780635c975abb14610448575f5ffd5b80633eb6b8cf1461036d5780633f4ba83a1461038c57806340c10f19146103a057806342842e0e146103bf575f5ffd5b806323b872dd116101da57806323b872dd146102b857806326afaadd146102d75780633075db561461031b5780633659cfe61461032f5780633ab76e9f1461034e575f5ffd5b806301ffc9a71461020b57806306fdde031461023f578063081812fc14610260578063095ea7b314610297575b5f5ffd5b348015610216575f5ffd5b5061022a61022536600461253b565b6106a3565b60405190151581526020015b60405180910390f35b34801561024a575f5ffd5b506102536106e8565b60405161023691906125a3565b34801561026b575f5ffd5b5061027f61027a3660046125b5565b610779565b6040516001600160a01b039091168152602001610236565b3480156102a2575f5ffd5b506102b66102b13660046125e0565b61079f565b005b3480156102c3575f5ffd5b506102b66102d236600461260a565b6108b8565b3480156102e2575f5ffd5b506102fc61015f54610160546001600160a01b0390911691565b604080516001600160a01b039093168352602083019190915201610236565b348015610326575f5ffd5b5061022a6108e9565b34801561033a575f5ffd5b506102b6610349366004612648565b610901565b348015610359575f5ffd5b5060975461027f906001600160a01b031681565b348015610378575f5ffd5b5061027f610387366004612677565b6109c8565b348015610397575f5ffd5b506102b66109de565b3480156103ab575f5ffd5b506102b66103ba3660046125e0565b6109f2565b3480156103ca575f5ffd5b506102b66103d936600461260a565b610abd565b3480156103e9575f5ffd5b506102b66103f83660046125b5565b610ad7565b348015610408575f5ffd5b506104136101605481565b604051908152602001610236565b6102b661042f36600461275a565b610bd6565b34801561043f575f5ffd5b50610413610c8b565b348015610453575f5ffd5b5061022a60c954610100900460ff1660021490565b348015610473575f5ffd5b5061027f6104823660046125b5565b610d3c565b348015610492575f5ffd5b506104136104a1366004612648565b610d9c565b3480156104b1575f5ffd5b506102b6610e21565b3480156104c5575f5ffd5b506102b6610e32565b3480156104d9575f5ffd5b5061015f5461027f906001600160a01b031681565b3480156104f9575f5ffd5b506102b6610ea9565b34801561050d575f5ffd5b5061027f610ebc565b348015610521575f5ffd5b506033546001600160a01b031661027f565b34801561053e575f5ffd5b50610253610eca565b348015610552575f5ffd5b506102b66105613660046127a6565b610eda565b348015610571575f5ffd5b5061027f6105803660046127d9565b610ee5565b348015610590575f5ffd5b506102b661059f3660046127fa565b610ef1565b3480156105af575f5ffd5b506102536105be3660046125b5565b610f29565b3480156105ce575f5ffd5b5060c9546105e8906201000090046001600160401b031681565b6040516001600160401b039091168152602001610236565b34801561060b575f5ffd5b506065546001600160a01b031661027f565b348015610628575f5ffd5b5061022a610637366004612861565b6001600160a01b039182165f9081526101326020908152604080832093909416825291909152205460ff1690565b348015610670575f5ffd5b506102b661067f3660046128dc565b610f52565b34801561068f575f5ffd5b506102b661069e366004612648565b611104565b5f6001600160e01b0319821663093e326b60e21b14806106d357506001600160e01b031982166377c6257360e11b145b806106e257506106e282611175565b92915050565b606061012d80546106f890612989565b80601f016020809104026020016040519081016040528092919081815260200182805461072490612989565b801561076f5780601f106107465761010080835404028352916020019161076f565b820191905f5260205f20905b81548152906001019060200180831161075257829003601f168201915b5050505050905090565b5f610783826111c4565b505f90815261013160205260409020546001600160a01b031690565b5f6107a982610d3c565b9050806001600160a01b0316836001600160a01b03160361081b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061083757506108378133610637565b6108a95760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610812565b6108b38383611223565b505050565b6108c23382611291565b6108de5760405162461bcd60e51b8152600401610812906129c1565b6108b383838361130f565b5f60026108f860c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100971630036109495760405162461bcd60e51b815260040161081290612a0e565b7f00000000000000000000000001670000000000000000000000000000000100976001600160a01b031661097b611481565b6001600160a01b0316146109a15760405162461bcd60e51b815260040161081290612a5a565b6109aa8161149c565b604080515f808252602082019092526109c5918391906114a4565b50565b5f6109d484848461160e565b90505b9392505050565b6109e6611660565b6109f0335f6116f0565b565b610a0660c954610100900460ff1660021490565b15610a245760405163bae6e2a960e01b815260040160405180910390fd5b6b195c98cdcc8c57dd985d5b1d60a21b610a3f816001610ee5565b6001600160a01b0316336001600160a01b031614610a7057604051630d85cccf60e11b815260040160405180910390fd5b6002610a7e60c95460ff1690565b60ff1603610a9f5760405163dfc60d8560e01b815260040160405180910390fd5b610aa960026116f8565b610ab3838361170e565b6108b360016116f8565b6108b383838360405180602001604052805f815250610ef1565b610aeb60c954610100900460ff1660021490565b15610b095760405163bae6e2a960e01b815260040160405180910390fd5b6b195c98cdcc8c57dd985d5b1d60a21b610b24816001610ee5565b6001600160a01b0316336001600160a01b031614610b5557604051630d85cccf60e11b815260040160405180910390fd5b6002610b6360c95460ff1690565b60ff1603610b845760405163dfc60d8560e01b815260040160405180910390fd5b610b8e60026116f8565b33610b9883610d3c565b6001600160a01b031614610bbf5760405163358bf3d960e01b815260040160405180910390fd5b610bc882611727565b610bd260016116f8565b5050565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000010097163003610c1e5760405162461bcd60e51b815260040161081290612a0e565b7f00000000000000000000000001670000000000000000000000000000000100976001600160a01b0316610c50611481565b6001600160a01b031614610c765760405162461bcd60e51b815260040161081290612a5a565b610c7f8261149c565b610bd2828260016114a4565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000100971614610d2a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610812565b505f516020612e175f395f51905f5290565b5f81815261012f60205260408120546001600160a01b0316806106e25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610812565b5f6001600160a01b038216610e055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610812565b506001600160a01b03165f908152610130602052604090205490565b610e296117c9565b6109f05f611823565b60655433906001600160a01b03168114610ea05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610812565b6109c581611823565b610eb161183c565b6109f03360016116f0565b5f610ec5611481565b905090565b606061012e80546106f890612989565b610bd23383836118ad565b5f6109d746848461160e565b610efb3383611291565b610f175760405162461bcd60e51b8152600401610812906129c1565b610f238484848461197b565b50505050565b61015f54610160546060916106e2916001600160a01b0390911690610f4d856119ae565b611a3d565b5f54610100900460ff1615808015610f7057505f54600160ff909116105b80610f895750303b158015610f8957505f5460ff166001145b610fec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610812565b5f805460ff19166001179055801561100d575f805461ff0019166101001790555b6110178787611a87565b6110218989611ac3565b61109283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284375f92019190915250611afd92505050565b61015f80546001600160a01b0319166001600160a01b03891617905561016086905580156110f9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b61110c6117c9565b606580546001600160a01b0383166001600160a01b0319909116811790915561113d6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b031982166380ac58cd60e01b14806111a557506001600160e01b03198216635b5e139f60e01b145b806106e257506301ffc9a760e01b6001600160e01b03198316146106e2565b5f81815261012f60205260409020546001600160a01b03166109c55760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610812565b5f8181526101316020526040902080546001600160a01b0319166001600160a01b038416908117909155819061125882610d3c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f5f61129c83610d3c565b9050806001600160a01b0316846001600160a01b031614806112e357506001600160a01b038082165f908152610132602090815260408083209388168352929052205460ff165b806113075750836001600160a01b03166112fc84610779565b6001600160a01b0316145b949350505050565b826001600160a01b031661132282610d3c565b6001600160a01b0316146113485760405162461bcd60e51b815260040161081290612aa6565b6001600160a01b0382166113aa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610812565b6113b78383836001611b2d565b826001600160a01b03166113ca82610d3c565b6001600160a01b0316146113f05760405162461bcd60e51b815260040161081290612aa6565b5f8181526101316020908152604080832080546001600160a01b03199081169091556001600160a01b03878116808652610130855283862080545f190190559087168086528386208054600101905586865261012f90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f516020612e175f395f51905f52546001600160a01b031690565b6109c56117c9565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156114d7576108b383611b6d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611531575060408051601f3d908101601f1916820190925261152e91810190612aeb565b60015b6115945760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610812565b5f516020612e175f395f51905f5281146116025760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610812565b506108b3838383611c08565b5f6116198484611c2c565b90508115801561163057506001600160a01b038116155b156109d757604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610812565b61167460c954610100900460ff1660021490565b6116915760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610bd26117c9565b60c9805460ff191660ff92909216919091179055565b610bd2828260405180602001604052805f815250611cce565b5f61173182610d3c565b9050611740815f846001611b2d565b61174982610d3c565b5f8381526101316020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552610130845282852080545f1901905587855261012f909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6033546001600160a01b031633146109f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610812565b606580546001600160a01b03191690556109c581611d00565b61185060c954610100900460ff1660021490565b1561186e5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016116e6565b816001600160a01b0316836001600160a01b03160361190e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610812565b6001600160a01b038381165f8181526101326020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61198684848461130f565b61199284848484611d51565b610f235760405162461bcd60e51b815260040161081290612b02565b60605f6119ba83611e4e565b60010190505f816001600160401b038111156119d8576119d86126bd565b6040519080825280601f01601f191660200182016040528015611a02576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611a0c57509392505050565b6060611a53846001600160a01b03166014611f25565b611a5c846119ae565b83604051602001611a6f93929190612b54565b60405160208183030381529060405290509392505050565b6001600160a01b0382161580611a9b575080155b80611aa557504681145b15610bd25760405163c118d2f360e01b815260040160405180910390fd5b806001600160a01b038116611aeb5760405163538ba4f960e01b815260040160405180910390fd5b611af4836120ba565b6108b382612118565b5f54610100900460ff16611b235760405162461bcd60e51b815260040161081290612bdc565b610bd28282612188565b611b4160c954610100900460ff1660021490565b15611b5f5760405163bae6e2a960e01b815260040160405180910390fd5b611b68836121c9565b610f23565b6001600160a01b0381163b611bda5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610812565b5f516020612e175f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611c11836121f2565b5f82511180611c1d5750805b156108b357610f238383612231565b6097545f906001600160a01b031680611c5857604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611caa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113079190612c27565b611cd88383612256565b611ce45f848484611d51565b6108b35760405162461bcd60e51b815260040161081290612b02565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160a01b0384163b15611e4357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d94903390899088908890600401612c42565b6020604051808303815f875af1925050508015611dce575060408051601f3d908101601f19168201909252611dcb91810190612c74565b60015b611e29573d808015611dfb576040519150601f19603f3d011682016040523d82523d5f602084013e611e00565b606091505b5080515f03611e215760405162461bcd60e51b815260040161081290612b02565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611307565b506001949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e8c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611eb8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ed657662386f26fc10000830492506010015b6305f5e1008310611eee576305f5e100830492506008015b6127108310611f0257612710830492506004015b60648310611f14576064830492506002015b600a83106106e25760010192915050565b60605f611f33836002612ca3565b611f3e906002612cba565b6001600160401b03811115611f5557611f556126bd565b6040519080825280601f01601f191660200182016040528015611f7f576020820181803683370190505b509050600360fc1b815f81518110611f9957611f99612ccd565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110611fc757611fc7612ccd565b60200101906001600160f81b03191690815f1a9053505f611fe9846002612ca3565b611ff4906001612cba565b90505b600181111561206b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061202857612028612ccd565b1a60f81b82828151811061203e5761203e612ccd565b60200101906001600160f81b03191690815f1a90535060049490941c9361206481612ce1565b9050611ff7565b5083156109d75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610812565b5f54610100900460ff166120e05760405162461bcd60e51b815260040161081290612bdc565b6120e86123ef565b6121066001600160a01b038216156121005781611823565b33611823565b5060c9805461ff001916610100179055565b5f54610100900460ff1661213e5760405162461bcd60e51b815260040161081290612bdc565b6001600160401b034611156121665760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b5f54610100900460ff166121ae5760405162461bcd60e51b815260040161081290612bdc565b61012d6121bb8382612d41565b5061012e6108b38282612d41565b306001600160a01b038216036109c557604051630c292c9d60e21b815260040160405180910390fd5b6121fb81611b6d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606109d78383604051806060016040528060278152602001612e3760279139612415565b6001600160a01b0382166122ac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610812565b5f81815261012f60205260409020546001600160a01b0316156123115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610812565b61231e5f83836001611b2d565b5f81815261012f60205260409020546001600160a01b0316156123835760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610812565b6001600160a01b0382165f818152610130602090815260408083208054600101905584835261012f90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f54610100900460ff166109f05760405162461bcd60e51b815260040161081290612bdc565b60605f5f856001600160a01b0316856040516124319190612dfb565b5f60405180830381855af49150503d805f8114612469576040519150601f19603f3d011682016040523d82523d5f602084013e61246e565b606091505b509150915061247f86838387612489565b9695505050505050565b606083156124f75782515f036124f0576001600160a01b0385163b6124f05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610812565b5081611307565b611307838381511561250c5781518083602001fd5b8060405162461bcd60e51b815260040161081291906125a3565b6001600160e01b0319811681146109c5575f5ffd5b5f6020828403121561254b575f5ffd5b81356109d781612526565b5f5b83811015612570578181015183820152602001612558565b50505f910152565b5f815180845261258f816020860160208601612556565b601f01601f19169290920160200192915050565b602081525f6109d76020830184612578565b5f602082840312156125c5575f5ffd5b5035919050565b6001600160a01b03811681146109c5575f5ffd5b5f5f604083850312156125f1575f5ffd5b82356125fc816125cc565b946020939093013593505050565b5f5f5f6060848603121561261c575f5ffd5b8335612627816125cc565b92506020840135612637816125cc565b929592945050506040919091013590565b5f60208284031215612658575f5ffd5b81356109d7816125cc565b80358015158114612672575f5ffd5b919050565b5f5f5f60608486031215612689575f5ffd5b83356001600160401b038116811461269f575f5ffd5b9250602084013591506126b460408501612663565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126126e0575f5ffd5b81356001600160401b038111156126f9576126f96126bd565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612727576127276126bd565b60405281815283820160200185101561273e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561276b575f5ffd5b8235612776816125cc565b915060208301356001600160401b03811115612790575f5ffd5b61279c858286016126d1565b9150509250929050565b5f5f604083850312156127b7575f5ffd5b82356127c2816125cc565b91506127d060208401612663565b90509250929050565b5f5f604083850312156127ea575f5ffd5b823591506127d060208401612663565b5f5f5f5f6080858703121561280d575f5ffd5b8435612818816125cc565b93506020850135612828816125cc565b92506040850135915060608501356001600160401b03811115612849575f5ffd5b612855878288016126d1565b91505092959194509250565b5f5f60408385031215612872575f5ffd5b823561287d816125cc565b9150602083013561288d816125cc565b809150509250929050565b5f5f83601f8401126128a8575f5ffd5b5081356001600160401b038111156128be575f5ffd5b6020830191508360208285010111156128d5575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156128f3575f5ffd5b88356128fe816125cc565b9750602089013561290e816125cc565b9650604089013561291e816125cc565b95506060890135945060808901356001600160401b0381111561293f575f5ffd5b61294b8b828c01612898565b90955093505060a08901356001600160401b03811115612969575f5ffd5b6129758b828c01612898565b999c989b5096995094979396929594505050565b600181811c9082168061299d57607f821691505b6020821081036129bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b5f60208284031215612afb575f5ffd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6832ba3432b932bab69d60b91b81525f8451612b77816009850160208901612556565b600160fe1b6009918401918201528451612b9881600a840160208901612556565b600981830101915050712f746f6b656e5552493f75696e743235363d60701b60018201528351612bcf816013840160208801612556565b0160130195945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612c37575f5ffd5b81516109d7816125cc565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061247f90830184612578565b5f60208284031215612c84575f5ffd5b81516109d781612526565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176106e2576106e2612c8f565b808201808211156106e2576106e2612c8f565b634e487b7160e01b5f52603260045260245ffd5b5f81612cef57612cef612c8f565b505f190190565b601f8211156108b357805f5260205f20601f840160051c81016020851015612d1b5750805b601f840160051c820191505b81811015612d3a575f8155600101612d27565b5050505050565b81516001600160401b03811115612d5a57612d5a6126bd565b612d6e81612d688454612989565b84612cf6565b6020601f821160018114612da0575f8315612d895750848201515b5f19600385901b1c1916600184901b178455612d3a565b5f84815260208120601f198516915b82811015612dcf5787850151825560209485019460019092019101612daf565b5084821015612dec57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f8251612e0c818460208701612556565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212205ca793a2312f9b2fc8fc6bda4c8492cc141ddbe707fcc60e6d2cb7bff225a87a64736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010098": { - "contractName": "BridgedERC1155", - "storage": {}, - "code": "0x6080604052600436106101e5575f3560e01c8063715018a611610108578063a86f9d9e1161009d578063e30c39781161006d578063e30c39781461056f578063e985e9c51461058c578063ef8c4ae6146105d4578063f242432a146105f3578063f2fde38b14610612575f5ffd5b8063a86f9d9e146104d5578063b390c0ab146104f4578063d81d0a1514610513578063e07baba614610532575f5ffd5b80638abf6077116100d85780638abf6077146104715780638da5cb5b1461048557806395d89b41146104a2578063a22cb465146104b6575f5ffd5b8063715018a61461041557806379ba5097146104295780637cf8ed0d1461043d5780638456cb591461045d575f5ffd5b80633ab76e9f1161017e5780634e1273f41161014e5780634e1273f4146103a25780634f1ef286146103ce57806352d1902d146103e15780635c975abb146103f5575f5ffd5b80633ab76e9f146103225780633eb6b8cf146103595780633f4ba83a1461037857806349d126051461038c575f5ffd5b806326afaadd116101b957806326afaadd1461028a5780632eb2c2d6146102ce5780633075db56146102ef5780633659cfe614610303575f5ffd5b8062fdd58e146101e957806301ffc9a71461021b57806306fdde031461024a5780630e89341c1461026b575b5f5ffd5b3480156101f4575f5ffd5b506102086102033660046126ae565b610631565b6040519081526020015b60405180910390f35b348015610226575f5ffd5b5061023a6102353660046126ed565b6106cb565b6040519015158152602001610212565b348015610255575f5ffd5b5061025e61070a565b6040516102129190612755565b348015610276575f5ffd5b5061025e610285366004612767565b610797565b348015610295575f5ffd5b506102af61015f54610160546001600160a01b0390911691565b604080516001600160a01b039093168352602083019190915201610212565b3480156102d9575f5ffd5b506102ed6102e83660046128c0565b61082a565b005b3480156102fa575f5ffd5b5061023a610876565b34801561030e575f5ffd5b506102ed61031d366004612970565b61088e565b34801561032d575f5ffd5b50609754610341906001600160a01b031681565b6040516001600160a01b039091168152602001610212565b348015610364575f5ffd5b5061034161037336600461299f565b610955565b348015610383575f5ffd5b506102ed61096b565b348015610397575f5ffd5b506102086101605481565b3480156103ad575f5ffd5b506103c16103bc3660046129e5565b61097f565b6040516102129190612aee565b6102ed6103dc366004612b00565b610a9e565b3480156103ec575f5ffd5b50610208610b57565b348015610400575f5ffd5b5061023a60c954610100900460ff1660021490565b348015610420575f5ffd5b506102ed610c09565b348015610434575f5ffd5b506102ed610c1a565b348015610448575f5ffd5b5061015f54610341906001600160a01b031681565b348015610468575f5ffd5b506102ed610c91565b34801561047c575f5ffd5b50610341610ca4565b348015610490575f5ffd5b506033546001600160a01b0316610341565b3480156104ad575f5ffd5b5061025e610cb2565b3480156104c1575f5ffd5b506102ed6104d0366004612b42565b610cc0565b3480156104e0575f5ffd5b506103416104ef366004612b75565b610ccb565b3480156104ff575f5ffd5b506102ed61050e366004612b96565b610cd7565b34801561051e575f5ffd5b506102ed61052d366004612bfd565b610da9565b34801561053d575f5ffd5b5060c954610557906201000090046001600160401b031681565b6040516001600160401b039091168152602001610212565b34801561057a575f5ffd5b506065546001600160a01b0316610341565b348015610597575f5ffd5b5061023a6105a6366004612c7d565b6001600160a01b039182165f90815261012e6020908152604080832093909416825291909152205460ff1690565b3480156105df575f5ffd5b506102ed6105ee366004612cf1565b610eed565b3480156105fe575f5ffd5b506102ed61060d366004612d9e565b61106d565b34801561061d575f5ffd5b506102ed61062c366004612970565b6110b2565b5f6001600160a01b0383166106a05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f81815261012d602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6001600160e01b03198216634d22606360e01b14806106fb57506001600160e01b031982166377c6257360e11b145b806106c557506106c582611123565b610162805461071890612df5565b80601f016020809104026020016040519081016040528092919081815260200182805461074490612df5565b801561078f5780601f106107665761010080835404028352916020019161078f565b820191905f5260205f20905b81548152906001019060200180831161077257829003601f168201915b505050505081565b606061012f80546107a790612df5565b80601f01602080910402602001604051908101604052809291908181526020018280546107d390612df5565b801561081e5780601f106107f55761010080835404028352916020019161081e565b820191905f5260205f20905b81548152906001019060200180831161080157829003601f168201915b50505050509050919050565b6001600160a01b038516331480610846575061084685336105a6565b6108625760405162461bcd60e51b815260040161069790612e2d565b61086f8585858585611172565b5050505050565b5f600261088560c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100981630036108d65760405162461bcd60e51b815260040161069790612e7b565b7f00000000000000000000000001670000000000000000000000000000000100986001600160a01b031661090861130d565b6001600160a01b03161461092e5760405162461bcd60e51b815260040161069790612ec7565b61093781611328565b604080515f8082526020820190925261095291839190611330565b50565b5f61096184848461149a565b90505b9392505050565b6109736114ec565b61097d335f61157c565b565b606081518351146109e45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610697565b5f83516001600160401b038111156109fe576109fe61277e565b604051908082528060200260200182016040528015610a27578160200160208202803683370190505b5090505f5b8451811015610a9657610a71858281518110610a4a57610a4a612f13565b6020026020010151858381518110610a6457610a64612f13565b6020026020010151610631565b828281518110610a8357610a83612f13565b6020908102919091010152600101610a2c565b509392505050565b6001600160a01b037f0000000000000000000000000167000000000000000000000000000000010098163003610ae65760405162461bcd60e51b815260040161069790612e7b565b7f00000000000000000000000001670000000000000000000000000000000100986001600160a01b0316610b1861130d565b6001600160a01b031614610b3e5760405162461bcd60e51b815260040161069790612ec7565b610b4782611328565b610b5382826001611330565b5050565b5f306001600160a01b037f00000000000000000000000001670000000000000000000000000000000100981614610bf65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610697565b505f5160206134ec5f395f51905f525b90565b610c11611580565b61097d5f6115da565b60655433906001600160a01b03168114610c885760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610697565b610952816115da565b610c996115f3565b61097d33600161157c565b5f610cad61130d565b905090565b610161805461071890612df5565b610b53338383611664565b5f61096446848461149a565b610ceb60c954610100900460ff1660021490565b15610d095760405163bae6e2a960e01b815260040160405180910390fd5b6c195c98cc4c4d4d57dd985d5b1d609a1b610d25816001610ccb565b6001600160a01b0316336001600160a01b031614610d5657604051630d85cccf60e11b815260040160405180910390fd5b6002610d6460c95460ff1690565b60ff1603610d855760405163dfc60d8560e01b815260040160405180910390fd5b610d8f6002611744565b610d9a33848461175a565b610da46001611744565b505050565b610dbd60c954610100900460ff1660021490565b15610ddb5760405163bae6e2a960e01b815260040160405180910390fd5b6c195c98cc4c4d4d57dd985d5b1d609a1b610df7816001610ccb565b6001600160a01b0316336001600160a01b031614610e2857604051630d85cccf60e11b815260040160405180910390fd5b6002610e3660c95460ff1690565b60ff1603610e575760405163dfc60d8560e01b815260040160405180910390fd5b610e616002611744565b610edb868686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284375f920182905250604080516020810190915290815292506118ee915050565b610ee56001611744565b505050505050565b5f54610100900460ff1615808015610f0b57505f54600160ff909116105b80610f245750303b158015610f2457505f5460ff166001145b610f875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610697565b5f805460ff191660011790558015610fa8575f805461ff0019166101001790555b610fb28787611a70565b610fbc8989611aac565b610fdd610fd8888860405180602001604052805f815250611ae6565b611b30565b61015f80546001600160a01b0319166001600160a01b03891617905561016086905561016161100d858783612f6b565b5061016261101c838583612f6b565b508015611062575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6001600160a01b038516331480611089575061108985336105a6565b6110a55760405162461bcd60e51b815260040161069790612e2d565b61086f8585858585611b5f565b6110ba611580565b606580546001600160a01b0383166001600160a01b031990911681179091556110eb6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6001600160e01b03198216636cdb3d1360e11b148061115357506001600160e01b031982166303a24d0760e21b145b806106c557506301ffc9a760e01b6001600160e01b03198316146106c5565b81518351146111935760405162461bcd60e51b815260040161069790613024565b6001600160a01b0384166111b95760405162461bcd60e51b81526004016106979061306c565b336111c8818787878787611c8e565b5f5b84518110156112a7575f8582815181106111e6576111e6612f13565b602002602001015190505f85838151811061120357611203612f13565b6020908102919091018101515f84815261012d835260408082206001600160a01b038e1683529093529190912054909150818110156112545760405162461bcd60e51b8152600401610697906130b1565b5f83815261012d602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061129390849061310f565b9091555050600190930192506111ca915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112f7929190613122565b60405180910390a4610ee5818787878787611cce565b5f5160206134ec5f395f51905f52546001600160a01b031690565b610952611580565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561136357610da483611e28565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156113bd575060408051601f3d908101601f191682019092526113ba9181019061314f565b60015b6114205760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610697565b5f5160206134ec5f395f51905f52811461148e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610697565b50610da4838383611ec3565b5f6114a58484611eed565b9050811580156114bc57506001600160a01b038116155b1561096457604051632b0d65db60e01b81526001600160401b038516600482015260248101849052604401610697565b61150060c954610100900460ff1660021490565b61151d5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610b535b6033546001600160a01b0316331461097d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610697565b606580546001600160a01b031916905561095281611f97565b61160760c954610100900460ff1660021490565b156116255760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611572565b816001600160a01b0316836001600160a01b0316036116d75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610697565b6001600160a01b038381165f81815261012e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60c9805460ff191660ff92909216919091179055565b6001600160a01b0383166117bc5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610697565b335f6117c784611fe8565b90505f6117d384611fe8565b90506117f183875f858560405180602001604052805f815250611c8e565b5f85815261012d602090815260408083206001600160a01b038a168452909152902054848110156118705760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610697565b5f86815261012d602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091525f90525b50505050505050565b6001600160a01b03841661194e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610697565b815183511461196f5760405162461bcd60e51b815260040161069790613024565b3361197e815f87878787611c8e565b5f5b8451811015611a0a5783818151811061199b5761199b612f13565b602002602001015161012d5f8784815181106119b9576119b9612f13565b602002602001015181526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f8282546119fd919061310f565b9091555050600101611980565b50846001600160a01b03165f6001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a5a929190613122565b60405180910390a461086f815f87878787611cce565b6001600160a01b0382161580611a84575080155b80611a8e57504681145b15610b535760405163c118d2f360e01b815260040160405180910390fd5b806001600160a01b038116611ad45760405163538ba4f960e01b815260040160405180910390fd5b611add83612031565b610da48261208f565b6060611afc846001600160a01b031660146120ff565b611b0584612294565b83604051602001611b1893929190613166565b60405160208183030381529060405290509392505050565b5f54610100900460ff16611b565760405162461bcd60e51b8152600401610697906131ee565b61095281612323565b6001600160a01b038416611b855760405162461bcd60e51b81526004016106979061306c565b335f611b9085611fe8565b90505f611b9c85611fe8565b9050611bac838989858589611c8e565b5f86815261012d602090815260408083206001600160a01b038c16845290915290205485811015611bef5760405162461bcd60e51b8152600401610697906130b1565b5f87815261012d602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611c2e90849061310f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611062848a8a8a8a8a612352565b611ca260c954610100900460ff1660021490565b15611cc05760405163bae6e2a960e01b815260040160405180910390fd5b611cc98461240c565b610ee5565b6001600160a01b0384163b15610ee55760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611d129089908990889088908890600401613239565b6020604051808303815f875af1925050508015611d4c575060408051601f3d908101601f19168201909252611d4991810190613296565b60015b611df857611d586132b1565b806308c379a003611d915750611d6c6132c9565b80611d775750611d93565b8060405162461bcd60e51b81526004016106979190612755565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610697565b6001600160e01b0319811663bc197c8160e01b146118e55760405162461bcd60e51b815260040161069790613343565b6001600160a01b0381163b611e955760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610697565b5f5160206134ec5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611ecc83612435565b5f82511180611ed85750805b15610da457611ee78383612474565b50505050565b6097545f906001600160a01b031680611f1957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8f919061338b565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040805160018082528183019092526060915f91906020808301908036833701905050905082815f8151811061202057612020612f13565b602090810291909101015292915050565b5f54610100900460ff166120575760405162461bcd60e51b8152600401610697906131ee565b61205f612499565b61207d6001600160a01b0382161561207757816115da565b336115da565b5060c9805461ff001916610100179055565b5f54610100900460ff166120b55760405162461bcd60e51b8152600401610697906131ee565b6001600160401b034611156120dd5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b60605f61210d8360026133a6565b61211890600261310f565b6001600160401b0381111561212f5761212f61277e565b6040519080825280601f01601f191660200182016040528015612159576020820181803683370190505b509050600360fc1b815f8151811061217357612173612f13565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106121a1576121a1612f13565b60200101906001600160f81b03191690815f1a9053505f6121c38460026133a6565b6121ce90600161310f565b90505b6001811115612245576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061220257612202612f13565b1a60f81b82828151811061221857612218612f13565b60200101906001600160f81b03191690815f1a90535060049490941c9361223e816133bd565b90506121d1565b5083156109645760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610697565b60605f6122a0836124bf565b60010190505f816001600160401b038111156122be576122be61277e565b6040519080825280601f01601f1916602001820160405280156122e8576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846122f257509392505050565b5f54610100900460ff166123495760405162461bcd60e51b8152600401610697906131ee565b61095281612596565b6001600160a01b0384163b15610ee55760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061239690899089908890889088906004016133d2565b6020604051808303815f875af19250505080156123d0575060408051601f3d908101601f191682019092526123cd91810190613296565b60015b6123dc57611d586132b1565b6001600160e01b0319811663f23a6e6160e01b146118e55760405162461bcd60e51b815260040161069790613343565b306001600160a01b0382160361095257604051630c292c9d60e21b815260040160405180910390fd5b61243e81611e28565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610964838360405180606001604052806027815260200161350c602791396125a3565b5f54610100900460ff1661097d5760405162461bcd60e51b8152600401610697906131ee565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106124fd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612529576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061254757662386f26fc10000830492506010015b6305f5e100831061255f576305f5e100830492506008015b612710831061257357612710830492506004015b60648310612585576064830492506002015b600a83106106c55760010192915050565b61012f610b538282613416565b60605f5f856001600160a01b0316856040516125bf91906134d0565b5f60405180830381855af49150503d805f81146125f7576040519150601f19603f3d011682016040523d82523d5f602084013e6125fc565b606091505b509150915061260d86838387612617565b9695505050505050565b606083156126855782515f0361267e576001600160a01b0385163b61267e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610697565b5081611f8f565b611f8f8383815115611d775781518083602001fd5b6001600160a01b0381168114610952575f5ffd5b5f5f604083850312156126bf575f5ffd5b82356126ca8161269a565b946020939093013593505050565b6001600160e01b031981168114610952575f5ffd5b5f602082840312156126fd575f5ffd5b8135610964816126d8565b5f5b8381101561272257818101518382015260200161270a565b50505f910152565b5f8151808452612741816020860160208601612708565b601f01601f19169290920160200192915050565b602081525f610964602083018461272a565b5f60208284031215612777575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156127b7576127b761277e565b6040525050565b5f6001600160401b038211156127d6576127d661277e565b5060051b60200190565b5f82601f8301126127ef575f5ffd5b81356127fa816127be565b6040516128078282612792565b80915082815260208101915060208360051b86010192508583111561282a575f5ffd5b602085015b8381101561284757803583526020928301920161282f565b5095945050505050565b5f82601f830112612860575f5ffd5b81356001600160401b038111156128795761287961277e565b604051612890601f8301601f191660200182612792565b8181528460208386010111156128a4575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f60a086880312156128d4575f5ffd5b85356128df8161269a565b945060208601356128ef8161269a565b935060408601356001600160401b03811115612909575f5ffd5b612915888289016127e0565b93505060608601356001600160401b03811115612930575f5ffd5b61293c888289016127e0565b92505060808601356001600160401b03811115612957575f5ffd5b61296388828901612851565b9150509295509295909350565b5f60208284031215612980575f5ffd5b81356109648161269a565b8035801515811461299a575f5ffd5b919050565b5f5f5f606084860312156129b1575f5ffd5b83356001600160401b03811681146129c7575f5ffd5b9250602084013591506129dc6040850161298b565b90509250925092565b5f5f604083850312156129f6575f5ffd5b82356001600160401b03811115612a0b575f5ffd5b8301601f81018513612a1b575f5ffd5b8035612a26816127be565b604051612a338282612792565b80915082815260208101915060208360051b850101925087831115612a56575f5ffd5b6020840193505b82841015612a81578335612a708161269a565b825260209384019390910190612a5d565b945050505060208301356001600160401b03811115612a9e575f5ffd5b612aaa858286016127e0565b9150509250929050565b5f8151808452602084019350602083015f5b82811015612ae4578151865260209586019590910190600101612ac6565b5093949350505050565b602081525f6109646020830184612ab4565b5f5f60408385031215612b11575f5ffd5b8235612b1c8161269a565b915060208301356001600160401b03811115612b36575f5ffd5b612aaa85828601612851565b5f5f60408385031215612b53575f5ffd5b8235612b5e8161269a565b9150612b6c6020840161298b565b90509250929050565b5f5f60408385031215612b86575f5ffd5b82359150612b6c6020840161298b565b5f5f60408385031215612ba7575f5ffd5b50508035926020909101359150565b5f5f83601f840112612bc6575f5ffd5b5081356001600160401b03811115612bdc575f5ffd5b6020830191508360208260051b8501011115612bf6575f5ffd5b9250929050565b5f5f5f5f5f60608688031215612c11575f5ffd5b8535612c1c8161269a565b945060208601356001600160401b03811115612c36575f5ffd5b612c4288828901612bb6565b90955093505060408601356001600160401b03811115612c60575f5ffd5b612c6c88828901612bb6565b969995985093965092949392505050565b5f5f60408385031215612c8e575f5ffd5b8235612c998161269a565b91506020830135612ca98161269a565b809150509250929050565b5f5f83601f840112612cc4575f5ffd5b5081356001600160401b03811115612cda575f5ffd5b602083019150836020828501011115612bf6575f5ffd5b5f5f5f5f5f5f5f5f60c0898b031215612d08575f5ffd5b8835612d138161269a565b97506020890135612d238161269a565b96506040890135612d338161269a565b95506060890135945060808901356001600160401b03811115612d54575f5ffd5b612d608b828c01612cb4565b90955093505060a08901356001600160401b03811115612d7e575f5ffd5b612d8a8b828c01612cb4565b999c989b5096995094979396929594505050565b5f5f5f5f5f60a08688031215612db2575f5ffd5b8535612dbd8161269a565b94506020860135612dcd8161269a565b9350604086013592506060860135915060808601356001600160401b03811115612957575f5ffd5b600181811c90821680612e0957607f821691505b602082108103612e2757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b601f821115610da457805f5260205f20601f840160051c81016020851015612f4c5750805b601f840160051c820191505b8181101561086f575f8155600101612f58565b6001600160401b03831115612f8257612f8261277e565b612f9683612f908354612df5565b83612f27565b5f601f841160018114612fc7575f8515612fb05750838201355b5f19600387901b1c1916600186901b17835561086f565b5f83815260208120601f198716915b82811015612ff65786850135825560209485019460019092019101612fd6565b5086821015613012575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106c5576106c56130fb565b604081525f6131346040830185612ab4565b82810360208401526131468185612ab4565b95945050505050565b5f6020828403121561315f575f5ffd5b5051919050565b6832ba3432b932bab69d60b91b81525f8451613189816009850160208901612708565b600160fe1b60099184019182015284516131aa81600a840160208901612708565b600981830101915050712f746f6b656e5552493f75696e743235363d60701b600182015283516131e1816013840160208801612708565b0160130195945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f9061326490830186612ab4565b82810360608401526132768186612ab4565b9050828103608084015261328a818561272a565b98975050505050505050565b5f602082840312156132a6575f5ffd5b8151610964816126d8565b5f60033d1115610c065760045f5f3e505f5160e01c90565b5f60443d10156132d65790565b6040513d600319016004823e80513d60248201116001600160401b03821117156132ff57505090565b80820180516001600160401b0381111561331a575050505090565b3d8401600319018282016020011115613334575050505090565b610a9660208285010185612792565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b5f6020828403121561339b575f5ffd5b81516109648161269a565b80820281158282048414176106c5576106c56130fb565b5f816133cb576133cb6130fb565b505f190190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f9061340b9083018461272a565b979650505050505050565b81516001600160401b0381111561342f5761342f61277e565b6134438161343d8454612df5565b84612f27565b6020601f821160018114613475575f831561345e5750848201515b5f19600385901b1c1916600184901b17845561086f565b5f84815260208120601f198516915b828110156134a45787850151825560209485019460019092019101613484565b50848210156134c157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82516134e1818460208701612708565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220056c58b99db557dce285f996f441ca995a4a77b2754e41fc6af5e46a7185c22664736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000000005": { - "contractName": "SignalServiceImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x6080604052600436106101c5575f3560e01c806379ba5097116100f2578063a86f9d9e11610092578063e30c397811610062578063e30c39781461052f578063f09a40161461054c578063f2fde38b1461056b578063fe9fbb801461058a575f5ffd5b8063a86f9d9e1461048e578063ce9d0820146104ad578063dfc8ff1d146104cc578063e07baba61461050a575f5ffd5b80638da5cb5b116100cd5780638da5cb5b14610414578063910af6ed1461043157806391f3f74b146104505780639b527cfa1461046f575f5ffd5b806379ba5097146103d85780638456cb59146103ec5780638abf607714610400575f5ffd5b80633eb6b8cf1161016857806352d1902d1161013857806352d1902d146103715780635c975abb1461038557806366ca2bc0146103a5578063715018a6146103c4575f5ffd5b80633eb6b8cf146102fe5780633f4ba83a1461031d5780634f1ef286146103315780634f90a67414610344575f5ffd5b8063355bcc3d116101a3578063355bcc3d146102325780633659cfe6146102895780633ab76e9f146102a85780633ced0e08146102df575f5ffd5b80632d1fb389146101c95780633075db56146101ea57806332676bc614610213575b5f5ffd5b3480156101d4575f5ffd5b506101e86101e336600461351b565b6105b8565b005b3480156101f5575f5ffd5b506101fe61065e565b60405190151581526020015b60405180910390f35b34801561021e575f5ffd5b506101fe61022d36600461354e565b610676565b34801561023d575f5ffd5b5061027161024c36600461358e565b60fb60209081525f92835260408084209091529082529020546001600160401b031681565b6040516001600160401b03909116815260200161020a565b348015610294575f5ffd5b506101e86102a33660046135a8565b61068c565b3480156102b3575f5ffd5b506097546102c7906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b3480156102ea575f5ffd5b506101fe6102f93660046135c3565b61075c565b348015610309575f5ffd5b506102c7610318366004613604565b6107a3565b348015610328575f5ffd5b506101e86107b9565b6101e861033f366004613714565b6107cd565b34801561034f575f5ffd5b5061036361035e3660046135c3565b610886565b60405190815260200161020a565b34801561037c575f5ffd5b506103636108cc565b348015610390575f5ffd5b506101fe60c954610100900460ff1660021490565b3480156103b0575f5ffd5b506103636103bf366004613760565b61097d565b3480156103cf575f5ffd5b506101e8610989565b3480156103e3575f5ffd5b506101e861099a565b3480156103f7575f5ffd5b506101e8610a11565b34801561040b575f5ffd5b506102c7610a24565b34801561041f575f5ffd5b506033546001600160a01b03166102c7565b34801561043c575f5ffd5b5061036361044b366004613777565b610a32565b34801561045b575f5ffd5b5061036361046a36600461380c565b610b0d565b34801561047a575f5ffd5b50610363610489366004613848565b610b78565b348015610499575f5ffd5b506102c76104a8366004613878565b610ba4565b3480156104b8575f5ffd5b506101e86104c7366004613777565b610bb0565b3480156104d7575f5ffd5b506104eb6104e6366004613848565b610bc6565b604080516001600160401b03909316835260208301919091520161020a565b348015610515575f5ffd5b5060c954610271906201000090046001600160401b031681565b34801561053a575f5ffd5b506065546001600160a01b03166102c7565b348015610557575f5ffd5b506101e8610566366004613899565b610c5a565b348015610576575f5ffd5b506101e86105853660046135a8565b610d69565b348015610595575f5ffd5b506101fe6105a43660046135a8565b60fc6020525f908152604090205460ff1681565b6105c0610dda565b6001600160a01b0382165f90815260fc602052604090205481151560ff909116151503610600576040516398f26f4560e01b815260040160405180910390fd5b6001600160a01b0382165f81815260fc6020908152604091829020805460ff191685151590811790915591519182527f4c0079b9bcd37cd5d29a13938effd97c881798cbc6bd52a3026a29d94b27d1bf910160405180910390a25050565b5f600261066d60c95460ff1690565b60ff1614905090565b5f6106818383610e34565b151590505b92915050565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000051630036106dd5760405162461bcd60e51b81526004016106d4906138d0565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000000056001600160a01b031661070f610e96565b6001600160a01b0316146107355760405162461bcd60e51b81526004016106d49061391c565b61073e81610eb1565b604080515f8082526020820190925261075991839190610eb9565b50565b5f8180820361077e5760405163ec73295960e01b815260040160405180910390fd5b5f61078a878787610b78565b9050836107973083610e34565b14979650505050505050565b5f6107af848484611023565b90505b9392505050565b6107c1611075565b6107cb335f611105565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000000051630036108155760405162461bcd60e51b81526004016106d4906138d0565b7f00000000000000000000000001670000000000000000000000000000000000056001600160a01b0316610847610e96565b6001600160a01b03161461086d5760405162461bcd60e51b81526004016106d49061391c565b61087682610eb1565b61088282826001610eb9565b5050565b335f90815260fc602052604081205460ff166108b557604051631f67751f60e01b815260040160405180910390fd5b6108c18585858561111e565b90505b949350505050565b5f306001600160a01b037f0000000000000000000000000167000000000000000000000000000000000005161461096b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106d4565b505f516020613eb05f395f51905f5290565b5f610686338384611200565b610991610dda565b6107cb5f6112d9565b60655433906001600160a01b03168114610a085760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016106d4565b610759816112d9565b610a196112f2565b6107cb336001611105565b5f610a2d610e96565b905090565b5f610a4760c954610100900460ff1660021490565b15610a655760405163bae6e2a960e01b815260040160405180910390fd5b6002610a7360c95460ff1690565b60ff1603610a945760405163dfc60d8560e01b815260040160405180910390fd5b60c9805460ff191660021790555f610ab187878787876001611363565b90505f5b8151811015610af457610ae0828281518110610ad357610ad3613968565b602002602001015161181f565b610aea9084613990565b9250600101610ab5565b505060c9805460ff191660011790555b95945050505050565b6040516514d251d3905360d21b60208201526001600160c01b031960c085901b1660268201526bffffffffffffffffffffffff19606084901b16602e820152604281018290525f906062015b6040516020818303038152906040528051906020012090509392505050565b604080516001600160401b03808616602083015291810184905290821660608201525f90608001610b59565b5f6107b2468484611023565b610bbe85858585855f611363565b505050505050565b5f5f826001600160401b03165f03610c02576001600160401b038086165f90815260fb6020908152604080832088845290915290205416610c04565b825b91506001600160401b03821615610c52575f610c21868685610b78565b9050610c2d3082610e34565b91505f829003610c505760405163738afa0560e01b815260040160405180910390fd5b505b935093915050565b5f54610100900460ff1615808015610c7857505f54600160ff909116105b80610c915750303b158015610c9157505f5460ff166001145b610cf45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106d4565b5f805460ff191660011790558015610d15575f805461ff0019166101001790555b610d1f8383611963565b8015610d64575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d71610dda565b606580546001600160a01b0383166001600160a01b03199091168117909155610da26033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b031633146107cb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d4565b5f826001600160a01b038116610e5d5760405163538ba4f960e01b815260040160405180910390fd5b825f819003610e7f5760405163ec73295960e01b815260040160405180910390fd5b5f610e8b468787610b0d565b549695505050505050565b5f516020613eb05f395f51905f52546001600160a01b031690565b610759610dda565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610eec57610d648361199d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f46575060408051601f3d908101601f19168201909252610f43918101906139a3565b60015b610fa95760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106d4565b5f516020613eb05f395f51905f5281146110175760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106d4565b50610d64838383611a38565b5f61102e8484611a62565b90508115801561104557506001600160a01b038116155b156107b257604051632b0d65db60e01b81526001600160401b0385166004820152602481018490526044016106d4565b61108960c954610100900460ff1660021490565b6110a65760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b604051630c2b8f8f60e11b815260040160405180910390fd5b5f61112a858585610b78565b9050611137308284611200565b506001600160401b038581165f90815260fb60209081526040808320888452909152902054818516911610156111a1576001600160401b038581165f90815260fb602090815260408083208884529091529020805467ffffffffffffffff19169185169190911790555b83836001600160401b0316866001600160401b03167fde247c825b1fb2d7ff9e0e771cba6f9e757ad04479fcdc135d88ae91fd50b37d85856040516111f0929190918252602082015260400190565b60405180910390a4949350505050565b5f836001600160a01b0381166112295760405163538ba4f960e01b815260040160405180910390fd5b835f81900361124b5760405163ec73295960e01b815260040160405180910390fd5b835f81900361126d5760405163ec73295960e01b815260040160405180910390fd5b611278468888610b0d565b858155604080516001600160a01b038a16815260208101899052908101829052606081018790529094507f0ad2d108660a211f47bf7fb43a0443cae181624995d3d42b88ee6879d200e9739060800160405180910390a15050509392505050565b606580546001600160a01b031916905561075981611b04565b61130660c954610100900460ff1660021490565b156113245760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016110fb565b6060856001600160a01b03811661138d5760405163538ba4f960e01b815260040160405180910390fd5b855f8190036113af5760405163ec73295960e01b815260040160405180910390fd5b5f6113bc86880188613a77565b905080515f036113df57604051630b92daef60e21b815260040160405180910390fd5b5f600182516113ee9190613bbd565b6001600160401b038111156114055761140561363d565b60405190808252806020026020018201604052801561142e578160200160208202803683370190505b50905085156114c15781516001600160401b038111156114505761145061363d565b6040519080825280602002602001820160405280156114bd57816020015b6114aa6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a081018290529060c082015290565b81526020019060019003908161146e5790505b5094505b8a8a8a805f6114e2856d7369676e616c5f7365727669636560901b836107a3565b9050306001600160a01b0382160361150d57604051637556223560e11b815260040160405180910390fd5b6115456040805160c0810182525f80825260208201819052918101829052906060820190815260200160608152602001606081525090565b5f5f5f5f5b8b518110156117d3578b818151811061156557611565613968565b602002602001015194505f5b818110156115cf57855f01516001600160401b03168c828151811061159857611598613968565b60200260200101516001600160401b0316036115c7576040516348362c2760e11b815260040160405180910390fd5b600101611571565b506115de8a8a8a8a898b611b55565b93508a5181149150811561161e5784516001600160401b03164614611616576040516338bf822760e21b815260040160405180910390fd5b3095506116c9565b845f01518b828151811061163457611634613968565b6001600160401b0392831660209182029290920101528551161580611662575084516001600160401b031646145b1561168057604051637556223560e11b815260040160405180910390fd5b845161169e906d7369676e616c5f7365727669636560901b5f6107a3565b9550306001600160a01b038716036116c957604051637556223560e11b815260040160405180910390fd5b608085015151151592508f1561175d576040518060e00160405280866040015181526020018581526020018b6001600160401b0316815260200186602001516001600160401b03168152602001841515815260200183151581526020018660600151600381111561173c5761173c613bd0565b8152508f828151811061175157611751613968565b60200260200101819052505b6117b88a8461178c577fc6cdc4f2acf13acb10f410085b821f7b7113b303e9a4799023f928317396aaf56117ae565b7f73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da1695b8760200151610b78565b604086015186519b509699509750949550879460010161154a565b508515806117ea57506117e63088610e34565b8614155b156118085760405163738afa0560e01b815260040160405180910390fd5b505050505050505050505050509695505050505050565b5f8060038360c00151600381111561183957611839613bd0565b148061185a575060028360c00151600381111561185857611858613bd0565b145b905080801561186a575082608001515b801561187857508260a00151155b156118ba57600191506118b883604001517f73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da1698560600151865f015161111e565b505b5f60038460c0015160038111156118d3576118d3613bd0565b14806118f4575060018460c0015160038111156118f2576118f2613bd0565b145b9050808015611910575083608001518061191057508360a00151155b1561195c57611920600184613990565b925061195a84604001517fc6cdc4f2acf13acb10f410085b821f7b7113b303e9a4799023f928317396aaf58660600151876020015161111e565b505b5050919050565b806001600160a01b03811661198b5760405163538ba4f960e01b815260040160405180910390fd5b61199483611bf4565b610d6482611c52565b6001600160a01b0381163b611a0a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106d4565b5f516020613eb05f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611a4183611cc2565b5f82511180611a4d5750805b15610d6457611a5c8383611d01565b50505050565b6097545f906001600160a01b031680611a8e57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611ae0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c49190613be4565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f856001600160a01b038116611b7e5760405163538ba4f960e01b815260040160405180910390fd5b855f819003611ba05760405163ec73295960e01b815260040160405180910390fd5b855f819003611bc25760405163ec73295960e01b815260040160405180910390fd5b611be6866040015186611bd68d8d8d610b0d565b8a8a608001518b60a00151611d26565b9a9950505050505050505050565b5f54610100900460ff16611c1a5760405162461bcd60e51b81526004016106d490613bff565b611c22611e33565b611c406001600160a01b03821615611c3a57816112d9565b336112d9565b5060c9805461ff001916610100179055565b5f54610100900460ff16611c785760405162461bcd60e51b81526004016106d490613bff565b6001600160401b03461115611ca05760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b611ccb8161199d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606107b28383604051806060016040528060278152602001613ed060279139611e59565b5f82515f14611dce576040516bffffffffffffffffffffffff19606088901b1660208201525f90611d6a90603401604051602081830303815290604052858a611ecd565b905080515f03611d8d57604051630414cd5b60e31b815260040160405180910390fd5b5f611d9782611ee6565b9050611dbc81600281518110611daf57611daf613968565b6020026020010151611ef9565b611dc590613c4a565b92505050611dd1565b50855b5f611e0886604051602001611de891815260200190565b60408051601f19818403018152919052611e0187611f78565b8585611f8b565b905080611e2857604051638d9a4db360e01b815260040160405180910390fd5b509695505050505050565b5f54610100900460ff166107cb5760405162461bcd60e51b81526004016106d490613bff565b60605f5f856001600160a01b031685604051611e759190613c92565b5f60405180830381855af49150503d805f8114611ead576040519150601f19603f3d011682016040523d82523d5f602084013e611eb2565b606091505b5091509150611ec386838387611fa4565b9695505050505050565b60605f611ed98561201c565b9050610b0481858561204e565b6060610686611ef4836128bc565b61290e565b60605f5f5f611f0785612a8c565b919450925090505f816001811115611f2157611f21613bd0565b14611f3f576040516307fe6cb960e21b815260040160405180910390fd5b611f498284613990565b855114611f6957604051630b8aa6f760e31b815260040160405180910390fd5b610b0485602001518484612d6f565b6060610686611f8683612dff565b612f13565b5f5f611f968661201c565b9050611ec381868686612f6b565b606083156120125782515f0361200b576001600160a01b0385163b61200b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106d4565b50816108c4565b6108c48383612f91565b6060818051906020012060405160200161203891815260200190565b6040516020818303038152906040529050919050565b60605f8451116120985760405162461bcd60e51b81526020600482015260156024820152744d65726b6c65547269653a20656d707479206b657960581b60448201526064016106d4565b5f6120a284612fbb565b90505f6120ae8661309e565b90505f846040516020016120c491815260200190565b60408051601f1981840301815291905290505f805b8451811015612865575f8582815181106120f5576120f5613968565b6020026020010151905084518311156121675760405162461bcd60e51b815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201526d0e8c2d840d6caf240d8cadccee8d60931b60648201526084016106d4565b825f0361220557805180516020918201206040516121b49261218e92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6122005760405162461bcd60e51b815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016106d4565b6122fb565b80515160201161228b578051805160209182012060405161222f9261218e92910190815260200190565b6122005760405162461bcd60e51b815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e6044820152660c2d840d0c2e6d60cb1b60648201526084016106d4565b8051845160208087019190912082519190920120146122fb5760405162461bcd60e51b815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f646044820152650ca40d0c2e6d60d31b60648201526084016106d4565b61230760106001613990565b8160200151510361249f5784518303612439576123348160200151601081518110611daf57611daf613968565b96505f8751116123ac5760405162461bcd60e51b815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016106d4565b600186516123ba9190613bbd565b821461242e5760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016106d4565b5050505050506107b2565b5f85848151811061244c5761244c613968565b602001015160f81c60f81b60f81c90505f82602001518260ff168151811061247657612476613968565b60200260200101519050612489816130ff565b9550612496600186613990565b9450505061285c565b600281602001515103612803575f6124b682613123565b90505f815f815181106124cb576124cb613968565b016020015160f81c90505f6124e1600283613cc1565b6124ec906002613ce2565b90505f6124fc848360ff16613146565b90505f6125098a89613146565b90505f612516838361317b565b90508083511461258e5760405162461bcd60e51b815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016106d4565b60ff8516600214806125a3575060ff85166003145b15612743578082511461261e5760405162461bcd60e51b815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016106d4565b6126388760200151600181518110611daf57611daf613968565b9c505f8d51116126b05760405162461bcd60e51b815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016106d4565b60018c516126be9190613bbd565b88146127325760405162461bcd60e51b815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016106d4565b5050505050505050505050506107b2565b60ff85161580612756575060ff85166001145b1561279557612782876020015160018151811061277557612775613968565b60200260200101516130ff565b995061278e818a613990565b98506127f8565b60405162461bcd60e51b815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f64652077697468604482015271040c2dc40eadcd6dcdeeedc40e0e4caccd2f60731b60648201526084016106d4565b50505050505061285c565b60405162461bcd60e51b815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e706172736561604482015267626c65206e6f646560c01b60648201526084016106d4565b506001016120d9565b5060405162461bcd60e51b815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c656044820152646d656e747360d81b60648201526084016106d4565b604080518082019091525f808252602082015281515f036128f057604051635ab458fb60e01b815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60605f5f5f61291c85612a8c565b91945092509050600181600181111561293757612937613bd0565b14612955576040516325ce355f60e11b815260040160405180910390fd5b84516129618385613990565b1461297f57604051630b8aa6f760e31b815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091525f80825260208201528152602001906001900390816129965790505093505f835b8651811015612a80575f5f612a056040518060400160405280858c5f01516129e99190613bbd565b8152602001858c602001516129fe9190613990565b9052612a8c565b509150915060405180604001604052808383612a219190613990565b8152602001848b60200151612a369190613990565b815250888581518110612a4b57612a4b613968565b6020908102919091010152612a61600185613990565b9350612a6d8183613990565b612a779084613990565b925050506129c1565b50845250919392505050565b5f5f5f835f01515f03612ab257604051635ab458fb60e01b815260040160405180910390fd5b602084015180515f1a607f8111612ad4575f60015f9450945094505050612d68565b60b78111612b69575f612ae8608083613bbd565b905080875f015111612b0d576040516366c9448560e01b815260040160405180910390fd5b6001838101516001600160f81b0319169082148015612b395750600160ff1b6001600160f81b03198216105b15612b575760405163babb01dd60e01b815260040160405180910390fd5b506001955093505f9250612d68915050565b60bf8111612c47575f612b7d60b783613bbd565b905080875f015111612ba2576040516366c9448560e01b815260040160405180910390fd5b60018301516001600160f81b0319165f819003612bd25760405163babb01dd60e01b815260040160405180910390fd5b600184015160088302610100031c60378111612c015760405163babb01dd60e01b815260040160405180910390fd5b612c0b8184613990565b895111612c2b576040516366c9448560e01b815260040160405180910390fd5b612c36836001613990565b975095505f9450612d689350505050565b60f78111612c91575f612c5b60c083613bbd565b905080875f015111612c80576040516366c9448560e01b815260040160405180910390fd5b600195509350849250612d68915050565b5f612c9d60f783613bbd565b905080875f015111612cc2576040516366c9448560e01b815260040160405180910390fd5b60018301516001600160f81b0319165f819003612cf25760405163babb01dd60e01b815260040160405180910390fd5b600184015160088302610100031c60378111612d215760405163babb01dd60e01b815260040160405180910390fd5b612d2b8184613990565b895111612d4b576040516366c9448560e01b815260040160405180910390fd5b612d56836001613990565b9750955060019450612d689350505050565b9193909250565b6060816001600160401b03811115612d8957612d8961363d565b6040519080825280601f01601f191660200182016040528015612db3576020820181803683370190505b50905081156107b2575f612dc78486613990565b9050602082015f5b84811015612de7578281015182820152602001612dcf565b84811115612df5575f858301525b5050509392505050565b60605f82604051602001612e1591815260200190565b60408051601f1981840301815291905290505f5b6020811015612e6157818181518110612e4457612e44613968565b01602001516001600160f81b0319165f03612e6157600101612e29565b612e6c816020613bbd565b6001600160401b03811115612e8357612e8361363d565b6040519080825280601f01601f191660200182016040528015612ead576020820181803683370190505b5092505f5b835181101561195a578282612ec681613cfb565b935081518110612ed857612ed8613968565b602001015160f81c60f81b848281518110612ef557612ef5613968565b60200101906001600160f81b03191690815f1a905350600101612eb2565b606081516001148015612f3f57506080825f81518110612f3557612f35613968565b016020015160f81c105b15612f48575090565b612f54825160806131fe565b82604051602001612038929190613d13565b919050565b5f6108c184612f7b87868661204e565b8051602091820120825192909101919091201490565b815115612fa15781518083602001fd5b8060405162461bcd60e51b81526004016106d49190613d41565b8051606090806001600160401b03811115612fd857612fd861363d565b60405190808252806020026020018201604052801561301d57816020015b6040805180820190915260608082526020820152815260200190600190039081612ff65790505b5091505f5b8181101561195c57604051806040016040528085838151811061304757613047613968565b6020026020010151815260200161307686848151811061306957613069613968565b6020026020010151611ee6565b81525083828151811061308b5761308b613968565b6020908102919091010152600101613022565b606080604051905082518060011b603f8101601f191683016040528083525060208401602083015f5b838110156130f4578060011b8201818401515f1a8060041c8253600f8116600183015350506001016130c7565b509295945050505050565b60606020825f01511061311a5761311582611ef9565b610686565b610686826133a3565b606061068661314183602001515f81518110611daf57611daf613968565b61309e565b606082518210613164575060408051602081019091525f8152610686565b6107b283838486516131769190613bbd565b6133b7565b5f5f825184511061318d578251613190565b83515b90505b80821080156131e757508282815181106131af576131af613968565b602001015160f81c60f81b6001600160f81b0319168483815181106131d6576131d6613968565b01602001516001600160f81b031916145b156131f757816001019150613193565b5092915050565b6060603883101561326257604080516001808252818301909252906020820181803683370190505090506132328284613d73565b60f81b815f8151811061324757613247613968565b60200101906001600160f81b03191690815f1a905350610686565b5f60015b6132708186613d8c565b15613296578161327f81613cfb565b925061328f905061010082613d9f565b9050613266565b6132a1826001613990565b6001600160401b038111156132b8576132b861363d565b6040519080825280601f01601f1916602001820160405280156132e2576020820181803683370190505b5092506132ef8483613d73565b6132fa906037613d73565b60f81b835f8151811061330f5761330f613968565b60200101906001600160f81b03191690815f1a905350600190505b81811161339b5761010061333e8284613bbd565b61334a90610100613e91565b6133549087613d8c565b61335e9190613e9c565b60f81b83828151811061337357613373613968565b60200101906001600160f81b03191690815f1a9053508061339381613cfb565b91505061332a565b505092915050565b606061068682602001515f845f0151612d6f565b60608182601f0110156133fd5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106d4565b8282840110156134405760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106d4565b818301845110156134875760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016106d4565b6060821580156134a55760405191505f8252602082016040526134ef565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156134de5780518352602092830192016134c6565b5050858452601f01601f1916604052505b50949350505050565b6001600160a01b0381168114610759575f5ffd5b80358015158114612f66575f5ffd5b5f5f6040838503121561352c575f5ffd5b8235613537816134f8565b91506135456020840161350c565b90509250929050565b5f5f6040838503121561355f575f5ffd5b823561356a816134f8565b946020939093013593505050565b80356001600160401b0381168114612f66575f5ffd5b5f5f6040838503121561359f575f5ffd5b61356a83613578565b5f602082840312156135b8575f5ffd5b81356107b2816134f8565b5f5f5f5f608085870312156135d6575f5ffd5b6135df85613578565b9350602085013592506135f460408601613578565b9396929550929360600135925050565b5f5f5f60608486031215613616575f5ffd5b61361f84613578565b9250602084013591506136346040850161350c565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156136735761367361363d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136a1576136a161363d565b604052919050565b5f82601f8301126136b8575f5ffd5b81356001600160401b038111156136d1576136d161363d565b6136e4601f8201601f1916602001613679565b8181528460208386010111156136f8575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215613725575f5ffd5b8235613730816134f8565b915060208301356001600160401b0381111561374a575f5ffd5b613756858286016136a9565b9150509250929050565b5f60208284031215613770575f5ffd5b5035919050565b5f5f5f5f5f6080868803121561378b575f5ffd5b61379486613578565b945060208601356137a4816134f8565b93506040860135925060608601356001600160401b038111156137c5575f5ffd5b8601601f810188136137d5575f5ffd5b80356001600160401b038111156137ea575f5ffd5b8860208284010111156137fb575f5ffd5b959894975092955050506020019190565b5f5f5f6060848603121561381e575f5ffd5b61382784613578565b92506020840135613837816134f8565b929592945050506040919091013590565b5f5f5f6060848603121561385a575f5ffd5b61386384613578565b92506020840135915061363460408501613578565b5f5f60408385031215613889575f5ffd5b823591506135456020840161350c565b5f5f604083850312156138aa575f5ffd5b82356138b5816134f8565b915060208301356138c5816134f8565b809150509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106865761068661397c565b5f602082840312156139b3575f5ffd5b5051919050565b5f6001600160401b038211156139d2576139d261363d565b5060051b60200190565b803560048110612f66575f5ffd5b5f82601f8301126139f9575f5ffd5b8135613a0c613a07826139ba565b613679565b8082825260208201915060208360051b860101925085831115613a2d575f5ffd5b602085015b83811015613a6d5780356001600160401b03811115613a4f575f5ffd5b613a5e886020838a01016136a9565b84525060209283019201613a32565b5095945050505050565b5f60208284031215613a87575f5ffd5b81356001600160401b03811115613a9c575f5ffd5b8201601f81018413613aac575f5ffd5b8035613aba613a07826139ba565b8082825260208201915060208360051b850101925086831115613adb575f5ffd5b602084015b83811015611e285780356001600160401b03811115613afd575f5ffd5b850160c0818a03601f19011215613b12575f5ffd5b613b1a613651565b613b2660208301613578565b8152613b3460408301613578565b602082015260608201356040820152613b4f608083016139dc565b606082015260a08201356001600160401b03811115613b6c575f5ffd5b613b7b8b6020838601016139ea565b60808301525060c08201356001600160401b03811115613b99575f5ffd5b613ba88b6020838601016139ea565b60a08301525084525060209283019201613ae0565b818103818111156106865761068661397c565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613bf4575f5ffd5b81516107b2816134f8565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80516020808301519190811015613c6a575f198160200360031b1b821691505b50919050565b5f5b83811015613c8a578181015183820152602001613c72565b50505f910152565b5f8251613ca3818460208701613c70565b9190910192915050565b634e487b7160e01b5f52601260045260245ffd5b5f60ff831680613cd357613cd3613cad565b8060ff84160691505092915050565b60ff82811682821603908111156106865761068661397c565b5f60018201613d0c57613d0c61397c565b5060010190565b5f8351613d24818460208801613c70565b835190830190613d38818360208801613c70565b01949350505050565b602081525f8251806020840152613d5f816040850160208701613c70565b601f01601f19169190910160400192915050565b60ff81811683821601908111156106865761068661397c565b5f82613d9a57613d9a613cad565b500490565b80820281158282048414176106865761068661397c565b6001815b6001841115610c5257808504811115613dd557613dd561397c565b6001841615613de357908102905b60019390931c928002613dba565b5f82613dff57506001610686565b81613e0b57505f610686565b8160018114613e215760028114613e2b57613e47565b6001915050610686565b60ff841115613e3c57613e3c61397c565b50506001821b610686565b5060208310610133831016604e8410600b8410161715613e6a575081810a610686565b613e765f198484613db6565b805f1904821115613e8957613e8961397c565b029392505050565b5f6107b28383613df1565b5f82613eaa57613eaa613cad565b50069056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122088e374295b28e7ad8361a3b961be9595b9248bb8792c867a5bea9cc2824409f764736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000000005": { - "contractName": "SignalService", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000000006", - "0xdf3a3dd9c4001d1115304f0841a31ee7b79b184f45ef381343fdf0ae529fbcb4": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000000005" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010001": { - "contractName": "TaikoL2Impl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x6080604052600436106101fc575f3560e01c80638456cb5911610113578063da69d3db1161009d578063e902461a1161006d578063e902461a146105ca578063ee82ac5e146105e9578063f2fde38b14610608578063f940e38514610627578063fd85eb2d14610646575f5ffd5b8063da69d3db14610554578063dac5df7814610573578063e07baba614610588578063e30c3978146105ad575f5ffd5b8063a7137c0f116100e3578063a7137c0f1461047c578063a7e022d1146104a2578063a86f9d9e146104de578063b8c7b30c146104fd578063c3f909d41461051c575f5ffd5b80638456cb59146104125780638abf6077146104265780638da5cb5b1461043a5780639ee512f214610457575f5ffd5b80633eb6b8cf11610194578063539b8ade11610164578063539b8ade146103855780635950f9f1146103ab5780635c975abb146103ca578063715018a6146103ea57806379ba5097146103fe575f5ffd5b80633eb6b8cf1461031d5780633f4ba83a1461033c5780634f1ef2861461035057806352d1902d14610363575f5ffd5b806333d5ac9b116101cf57806333d5ac9b1461028d578063356aec04146102b35780633659cfe6146102c55780633ab76e9f146102e6575f5ffd5b806312622e5b14610200578063136dc4a81461023c5780632f9804731461025b5780633075db5614610279575b5f5ffd5b34801561020b575f5ffd5b5060fe5461021f906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b348015610247575f5ffd5b5061021f6102563660046125c0565b610665565b348015610266575f5ffd5b505f5b6040519015158152602001610233565b348015610284575f5ffd5b5061026961067b565b348015610298575f5ffd5b5060fd5461021f90600160401b90046001600160401b031681565b3480156102be575f5ffd5b505f61021f565b3480156102d0575f5ffd5b506102e46102df366004612614565b610693565b005b3480156102f1575f5ffd5b50609754610305906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610328575f5ffd5b5061030561033736600461263c565b610763565b348015610347575f5ffd5b506102e461076f565b6102e461035e36600461268d565b610783565b34801561036e575f5ffd5b5061037761083c565b604051908152602001610233565b348015610390575f5ffd5b5060fd5461021f90600160801b90046001600160401b031681565b3480156103b6575f5ffd5b506102e46103c5366004612750565b6108ed565b3480156103d5575f5ffd5b5061026960c954610100900460ff1660021490565b3480156103f5575f5ffd5b506102e4610af6565b348015610409575f5ffd5b506102e4610b07565b34801561041d575f5ffd5b506102e4610b7e565b348015610431575f5ffd5b50610305610b91565b348015610445575f5ffd5b506033546001600160a01b0316610305565b348015610462575f5ffd5b5061030571777735367b36bc9b61c50022d9d0700db4ec81565b348015610487575f5ffd5b5060fd5461021f90600160c01b90046001600160401b031681565b3480156104ad575f5ffd5b506104c16104bc3660046127b8565b610b9f565b604080519283526001600160401b03909116602083015201610233565b3480156104e9575f5ffd5b506103056104f83660046127e9565b610c15565b348015610508575f5ffd5b5060fd5461021f906001600160401b031681565b348015610527575f5ffd5b50610530610c2a565b60408051825163ffffffff16815260209283015160ff169281019290925201610233565b34801561055f575f5ffd5b506102e461056e366004612817565b610c5b565b34801561057e575f5ffd5b5061037760fc5481565b348015610593575f5ffd5b5060c95461021f906201000090046001600160401b031681565b3480156105b8575f5ffd5b506065546001600160a01b0316610305565b3480156105d5575f5ffd5b506104c16105e436600461285f565b610d2b565b3480156105f4575f5ffd5b506103776106033660046128a7565b610e0d565b348015610613575f5ffd5b506102e4610622366004612614565b610e45565b348015610632575f5ffd5b506102e46106413660046128be565b610eb6565b348015610651575f5ffd5b506102e46106603660046128ea565b611075565b5f6106718484846114df565b90505b9392505050565b5f600261068a60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100011630036106e45760405162461bcd60e51b81526004016106db9061292b565b60405180910390fd5b7f00000000000000000000000001670000000000000000000000000000000100016001600160a01b031661071661159a565b6001600160a01b03161461073c5760405162461bcd60e51b81526004016106db90612977565b610745816115b5565b604080515f80825260208201909252610760918391906115bd565b50565b5f610671848484611727565b610777611779565b610781335f611809565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100011630036107cb5760405162461bcd60e51b81526004016106db9061292b565b7f00000000000000000000000001670000000000000000000000000000000100016001600160a01b03166107fd61159a565b6001600160a01b0316146108235760405162461bcd60e51b81526004016106db90612977565b61082c826115b5565b610838828260016115bd565b5050565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000001000116146108db5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106db565b505f516020612c045f395f51905f5290565b5f54610100900460ff161580801561090b57505f54600160ff909116105b806109245750303b15801561092457505f5460ff166001145b6109875760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106db565b5f805460ff1916600117905580156109a8575f805461ff0019166101001790555b6109b28585611811565b6001600160401b03831615806109d0575046836001600160401b0316145b156109ee576040516308279a2560e31b815260040160405180910390fd5b600146111580610a0457506001600160401b0346115b15610a2257604051638f972ecb60e01b815260040160405180910390fd5b4315610a6c5743600103610a53575f610a3c6001436129d7565b5f81815260fb602052604090209040905550610a6c565b604051635a0f9e4160e11b815260040160405180910390fd5b60fe80546001600160401b0380861667ffffffffffffffff199283161790925560fd805492851692909116919091179055610aa64361184b565b5060fc558015610aef575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610afe6118db565b6107815f611935565b60655433906001600160a01b03168114610b755760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016106db565b61076081611935565b610b8661194e565b610781336001611809565b5f610b9a61159a565b905090565b5f5f5f610baa610c2a565b9050610c09816020015160ff16825f015163ffffffff16610bcb91906129ea565b60fd5483516001600160401b038083169263ffffffff90921691610bf891600160401b909104168a612a01565b610c029190612a20565b875f6119bf565b90969095509350505050565b5f610c21468484611727565b90505b92915050565b604080518082019091525f8082526020820152610b9a60408051808201909152630393870081526008602082015290565b825f819003610c7d5760405163ec73295960e01b815260040160405180910390fd5b826001600160401b0316805f03610ca75760405163ec73295960e01b815260040160405180910390fd5b3371777735367b36bc9b61c50022d9d0700db4ec14610cd957604051636494e9f760e01b815260040160405180910390fd5b6002610ce760c95460ff1690565b60ff1603610d085760405163dfc60d8560e01b815260040160405180910390fd5b610d126002611a48565b604051631799c89b60e01b815260040160405180910390fd5b5f8080610d3e6060880160408901612a60565b610d4e9063ffffffff1687612a20565b9050610d6060a0880160808901612a60565b63ffffffff1615801590610d915750610d7f60a0880160808901612a60565b63ffffffff16816001600160401b0316115b15610daf57610da660a0880160808901612a60565b63ffffffff1690505b5f610dbd6020890189612a79565b60ff16610dd060608a0160408b01612a60565b63ffffffff16610de091906129ea565b9050610dfe81878488610df960808e0160608f01612a99565b6119bf565b93509350505094509492505050565b5f438210610e1c57505f919050565b43610e2983610100612ab2565b10610e3357504090565b505f90815260fb602052604090205490565b610e4d6118db565b606580546001600160a01b0383166001600160a01b03199091168117909155610e7e6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610eca60c954610100900460ff1660021490565b15610ee85760405163bae6e2a960e01b815260040160405180910390fd5b693bb4ba34323930bbb2b960b11b610f086033546001600160a01b031690565b6001600160a01b0316336001600160a01b031614158015610f455750610f2f816001610c15565b6001600160a01b0316336001600160a01b031614155b15610f6357604051630d85cccf60e11b815260040160405180910390fd5b6002610f7160c95460ff1690565b60ff1603610f925760405163dfc60d8560e01b815260040160405180910390fd5b610f9c6002611a48565b6001600160a01b038216610fc35760405163053fd54760e01b815260040160405180910390fd5b6001600160a01b038316610fe957610fe46001600160a01b03831647611a5e565b611066565b6040516370a0823160e01b81523060048201526110669083906001600160a01b038616906370a0823190602401602060405180830381865afa158015611031573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110559190612a49565b6001600160a01b0386169190611a69565b6110706001611a48565b505050565b825f8190036110975760405163ec73295960e01b815260040160405180910390fd5b846001600160401b0316805f036110c15760405163ec73295960e01b815260040160405180910390fd5b6110d16060840160408501612a60565b63ffffffff16805f036110f75760405163ec73295960e01b815260040160405180910390fd5b6111046020850185612a79565b60ff16805f036111275760405163ec73295960e01b815260040160405180910390fd5b3371777735367b36bc9b61c50022d9d0700db4ec1461115957604051636494e9f760e01b815260040160405180910390fd5b600261116760c95460ff1690565b60ff16036111885760405163dfc60d8560e01b815260040160405180910390fd5b6111926002611a48565b5f61119e6001436129d7565b90505f5f6111ab8361184b565b915091508160fc54146111d15760405163d719258d60e01b815260040160405180910390fd5b60fc55505f6111e36020880188612a79565b60ff166111f66060890160408a01612a60565b63ffffffff166112069190612a20565b60fd549091506001600160401b03808316600160c01b90920416146112a15760fd54600160c01b90046001600160401b0316156112805760fd5461125e906001600160401b0380821691600160c01b90041683610665565b60fd805467ffffffffffffffff19166001600160401b03929092169190911790555b60fd80546001600160c01b0316600160c01b6001600160401b038416021790555b5060fd545f9081906112db9089906112c990600160801b90046001600160401b0316426129d7565b60fd546001600160401b03168c610d2b565b915091506112e65f90565b1580156112f35750814814155b15611311576040516336d54d4f60e11b815260040160405180910390fd5b60fd805467ffffffffffffffff19166001600160401b039283161790819055600160401b90048116908b16111590506114365761135f6d7369676e616c5f7365727669636560901b5f610c15565b60fe546040516313e4299d60e21b81526001600160401b0391821660048201527f73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da1696024820152908b166044820152606481018a90526001600160a01b039190911690634f90a674906084016020604051808303815f875af11580156113e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140a9190612a49565b5060fd80546fffffffffffffffff00000000000000001916600160401b6001600160401b038c16021790555b5f81815260fb60205260409081902082409081905560fd80546001600160401b03428116600160801b0267ffffffffffffffff60801b1983168117909355935192937f41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4936114c1938693908316921691909117909182526001600160401b0316602082015260400190565b60405180910390a150506114d56001611a48565b5050505050505050565b5f826001600160401b03165f036114f7575080610674565b670de0b6b3a76400005f6001600160401b0380861690611519908616846129ea565b6115239190612ad9565b90506001600160ff1b0381111561154d57604051636296f1b960e11b815260040160405180910390fd5b5f61155782611abb565b90505f828802828702015f81126001811461157657858204925061157a565b5f92505b5061158e9050816001600160401b03611cd8565b98975050505050505050565b5f516020612c045f395f51905f52546001600160a01b031690565b6107606118db565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156115f05761107083611cec565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561164a575060408051601f3d908101601f1916820190925261164791810190612a49565b60015b6116ad5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106db565b5f516020612c045f395f51905f52811461171b5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106db565b50611070838383611d87565b5f6117328484611db1565b90508115801561174957506001600160a01b038116155b1561067457604051632b0d65db60e01b81526001600160401b0385166004820152602481018490526044016106db565b61178d60c954610100900460ff1660021490565b6117aa5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6108386118db565b806001600160a01b0381166118395760405163538ba4f960e01b815260040160405180910390fd5b61184283611e5b565b61107082611eb9565b5f5f611855612585565b5f5b60ff8110801561186a5750806001018510155b1561189b575f198186030180408360ff8306610100811061188d5761188d612aec565b602002015250600101611857565b5046611fe0820152612000812092508340816118b860ff87612b00565b61010081106118c9576118c9612aec565b60200201526120009020919391925050565b6033546001600160a01b031633146107815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106db565b606580546001600160a01b031916905561076081611f29565b61196260c954610100900460ff1660021490565b156119805760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016117ff565b5f80806119db63ffffffff86166001600160401b038916612ab2565b9050856001600160401b031681116119f4576001611a07565b611a076001600160401b038716826129d7565b9050611a266001600160401b03611a2083878316611f7a565b90611cd8565b9150611a3b826001600160401b031689611f8f565b9250509550959350505050565b60c9805460ff191660ff92909216919091179055565b61083882825a611fbe565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611070908490612001565b6fffffffffffffffffffffffffffffffff811160071b81811c6001600160401b031060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b175f8213611b1757631615e6385f526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d6c8c3f38e95a6b1ff2ab1c3b343619018302821d6d02384773bdf1ac5676facced60901901830290911d6cb9a025d814b29c212b8b1a07cd1901909102780a09507084cc699bb0e71ea869ffffffffffffffffffffffff190105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b5f818311611ce65782610c21565b50919050565b6001600160a01b0381163b611d595760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106db565b5f516020612c045f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b611d90836120d4565b5f82511180611d9c5750805b1561107057611dab8383612113565b50505050565b6097545f906001600160a01b031680611ddd57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0385166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611e2f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e539190612b13565b949350505050565b5f54610100900460ff16611e815760405162461bcd60e51b81526004016106db90612b2e565b611e89612138565b611ea76001600160a01b03821615611ea15781611935565b33611935565b5060c9805461ff001916610100179055565b5f54610100900460ff16611edf5760405162461bcd60e51b81526004016106db90612b2e565b6001600160401b03461115611f075760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f818311611f885781610c21565b5090919050565b5f5f82611f9c858561215e565b611fa69190612ad9565b90508015611fb45780611e53565b5060019392505050565b815f03611fca57505050565b611fe483838360405180602001604052805f8152506121d8565b61107057604051634c67134d60e11b815260040160405180910390fd5b5f612055826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122159092919063ffffffff16565b905080515f14806120755750808060200190518101906120759190612b79565b6110705760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106db565b6120dd81611cec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610c218383604051806060016040528060278152602001612c2460279139612223565b5f54610100900460ff166107815760405162461bcd60e51b81526004016106db90612b2e565b5f815f0361217f57604051636296f1b960e11b815260040160405180910390fd5b5f8261219385670de0b6b3a76400006129ea565b61219d9190612ad9565b9050680755bf798b4a1bf1e48111156121bc5750680755bf798b4a1bf1e45b670de0b6b3a76400006121ce82612297565b611e539190612ad9565b5f6001600160a01b03851661220057604051634c67134d60e11b815260040160405180910390fd5b5f5f835160208501878988f195945050505050565b606061067184845f85612411565b60605f5f856001600160a01b03168560405161223f9190612bb6565b5f60405180830381855af49150503d805f8114612277576040519150601f19603f3d011682016040523d82523d5f602084013e61227c565b606091505b509150915061228d868383876124e8565b9695505050505050565b5f68023f2fa8f6da5b9d281982136122ae57919050565b680755bf798b4a1bf1e582126122cb5763a37bfec95f526004601cfd5b6503782dace9d9604e83901b0591505f60606bb17217f7d1cf79abc9e3b39884821b056001605f1b01901d6bb17217f7d1cf79abc9e3b39881029093036c240c330e9fb2d9cbaf0fd5aafb1981018102606090811d6d0277594991cfc85f6e2461837cd9018202811d6d1a521255e34f6a5061b25ef1c9c319018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d6e02c72388d9f74f51a9331fed693f1419018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084016d01d3967ed30fc4f89c02bab5708119010290911d6e0587f503bb6ea29d25fcb740196450019091026d360d7aeea093263ecc6e0ecb291760621b010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6060824710156124725760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106db565b5f5f866001600160a01b0316858760405161248d9190612bb6565b5f6040518083038185875af1925050503d805f81146124c7576040519150601f19603f3d011682016040523d82523d5f602084013e6124cc565b606091505b50915091506124dd878383876124e8565b979650505050505050565b606083156125565782515f0361254f576001600160a01b0385163b61254f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106db565b5081611e53565b611e53838381511561256b5781518083602001fd5b8060405162461bcd60e51b81526004016106db9190612bd1565b604051806120000160405280610100906020820280368337509192915050565b80356001600160401b03811681146125bb575f5ffd5b919050565b5f5f5f606084860312156125d2575f5ffd5b6125db846125a5565b92506125e9602085016125a5565b91506125f7604085016125a5565b90509250925092565b6001600160a01b0381168114610760575f5ffd5b5f60208284031215612624575f5ffd5b813561067481612600565b8015158114610760575f5ffd5b5f5f5f6060848603121561264e575f5ffd5b612657846125a5565b925060208401359150604084013561266e8161262f565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561269e575f5ffd5b82356126a981612600565b915060208301356001600160401b038111156126c3575f5ffd5b8301601f810185136126d3575f5ffd5b80356001600160401b038111156126ec576126ec612679565b604051601f8201601f19908116603f011681016001600160401b038111828210171561271a5761271a612679565b604052818152828201602001871015612731575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f5f60808587031215612763575f5ffd5b843561276e81612600565b9350602085013561277e81612600565b925061278c604086016125a5565b915061279a606086016125a5565b905092959194509250565b803563ffffffff811681146125bb575f5ffd5b5f5f604083850312156127c9575f5ffd5b6127d2836125a5565b91506127e0602084016127a5565b90509250929050565b5f5f604083850312156127fa575f5ffd5b82359150602083013561280c8161262f565b809150509250929050565b5f5f5f5f6080858703121561282a575f5ffd5b8435935060208501359250612841604086016125a5565b915061279a606086016127a5565b5f60a08284031215611ce6575f5ffd5b5f5f5f5f6101008587031215612873575f5ffd5b61287d868661284f565b935061288b60a086016125a5565b925061289960c086016125a5565b915061279a60e086016127a5565b5f602082840312156128b7575f5ffd5b5035919050565b5f5f604083850312156128cf575f5ffd5b82356128da81612600565b9150602083013561280c81612600565b5f5f5f5f61010085870312156128fe575f5ffd5b612907856125a5565b93506020850135925061291c604086016127a5565b915061279a866060870161284f565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c2457610c246129c3565b8082028115828204841417610c2457610c246129c3565b6001600160401b038281168282160390811115610c2457610c246129c3565b6001600160401b038181168382160290811690818114612a4257612a426129c3565b5092915050565b5f60208284031215612a59575f5ffd5b5051919050565b5f60208284031215612a70575f5ffd5b610c21826127a5565b5f60208284031215612a89575f5ffd5b813560ff81168114610674575f5ffd5b5f60208284031215612aa9575f5ffd5b610c21826125a5565b80820180821115610c2457610c246129c3565b634e487b7160e01b5f52601260045260245ffd5b5f82612ae757612ae7612ac5565b500490565b634e487b7160e01b5f52603260045260245ffd5b5f82612b0e57612b0e612ac5565b500690565b5f60208284031215612b23575f5ffd5b815161067481612600565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612b89575f5ffd5b81516106748161262f565b5f5b83811015612bae578181015183820152602001612b96565b50505f910152565b5f8251612bc7818460208701612b94565b9190910192915050565b602081525f8251806020840152612bef816040850160208701612b94565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220effaa84efcacfc056fb02202f151620faec2208bfd9251bf5034a0d35854a32e64736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000010001": { - "contractName": "TaikoL2", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x0000000000000000000000001670000000000000000000000000000000010002", - "0x00000000000000000000000000000000000000000000000000000000000000fe": "0x0000000000000000000000000000000000000000000000000000000000007a69", - "0x00000000000000000000000000000000000000000000000000000000000000fd": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000000000000000000000000000000000000fc": "0x56648745cb667f52a0ae5eb338ad021411cede74141e72933401adba6c132b01", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000010001" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010002": { - "contractName": "RollupAddressManagerImpl", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39" - }, - "code": "0x608060405260043610610126575f3560e01c80635c975abb116100a85780638da5cb5b1161006d5780638da5cb5b14610301578063a86f9d9e1461031e578063d8f4648f1461033d578063e07baba61461035c578063e30c39781461039b578063f2fde38b146103b8575f5ffd5b80635c975abb14610291578063715018a6146102b157806379ba5097146102c55780638456cb59146102d95780638abf6077146102ed575f5ffd5b80633ab76e9f116100ee5780633ab76e9f1461020a5780633eb6b8cf146102295780633f4ba83a146102485780634f1ef2861461025c57806352d1902d1461026f575f5ffd5b8063069489a21461012a57806319ab453c1461014057806328f713cc1461015f5780633075db56146101c75780633659cfe6146101eb575b5f5ffd5b348015610135575f5ffd5b5061013e6103d7565b005b34801561014b575f5ffd5b5061013e61015a36600461110e565b610487565b34801561016a575f5ffd5b506101aa610179366004611145565b67ffffffffffffffff919091165f90815260fb6020908152604080832093835292905220546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d2575f5ffd5b506101db61055f565b60405190151581526020016101be565b3480156101f6575f5ffd5b5061013e61020536600461110e565b610577565b348015610215575f5ffd5b506097546101aa906001600160a01b031681565b348015610234575f5ffd5b506101aa61024336600461117c565b61063e565b348015610253575f5ffd5b5061013e610654565b61013e61026a3660046111c9565b610668565b34801561027a575f5ffd5b5061028361071d565b6040519081526020016101be565b34801561029c575f5ffd5b506101db60c954610100900460ff1660021490565b3480156102bc575f5ffd5b5061013e6107ce565b3480156102d0575f5ffd5b5061013e6107df565b3480156102e4575f5ffd5b5061013e610856565b3480156102f8575f5ffd5b506101aa610869565b34801561030c575f5ffd5b506033546001600160a01b03166101aa565b348015610329575f5ffd5b506101aa61033836600461128f565b610877565b348015610348575f5ffd5b5061013e6103573660046112b9565b610883565b348015610367575f5ffd5b5060c9546103829062010000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101be565b3480156103a6575f5ffd5b506065546001600160a01b03166101aa565b3480156103c3575f5ffd5b5061013e6103d236600461110e565b610961565b6103df6109d2565b5f54600290610100900460ff161580156103ff57505f5460ff8083169116105b6104245760405162461bcd60e51b815260040161041b906112f6565b60405180910390fd5b5f8054609780546001600160a01b0319163017905561ffff191660ff83169081176101001761ff0019169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b5f54610100900460ff16158080156104a557505f54600160ff909116105b806104be5750303b1580156104be57505f5460ff166001145b6104da5760405162461bcd60e51b815260040161041b906112f6565b5f805460ff1916600117905580156104fb575f805461ff0019166101001790555b61050482610a2c565b609780546001600160a01b03191630179055801561055b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f600261056e60c95460ff1690565b60ff1614905090565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100021630036105bf5760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000100026001600160a01b03166105f1610a8a565b6001600160a01b0316146106175760405162461bcd60e51b815260040161041b90611390565b61062081610aa5565b604080515f8082526020820190925261063b91839190610aad565b50565b5f61064a848484610c1c565b90505b9392505050565b61065c610c6f565b610666335f610d00565b565b6001600160a01b037f00000000000000000000000001670000000000000000000000000000000100021630036106b05760405162461bcd60e51b815260040161041b90611344565b7f00000000000000000000000001670000000000000000000000000000000100026001600160a01b03166106e2610a8a565b6001600160a01b0316146107085760405162461bcd60e51b815260040161041b90611390565b61071182610aa5565b61055b82826001610aad565b5f306001600160a01b037f000000000000000000000000016700000000000000000000000000000001000216146107bc5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000606482015260840161041b565b505f5160206114c95f395f51905f5290565b6107d66109d2565b6106665f610d19565b60655433906001600160a01b0316811461084d5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161041b565b61063b81610d19565b61085e610d32565b610666336001610d00565b5f610872610a8a565b905090565b5f61064d468484610c1c565b61088b6109d2565b67ffffffffffffffff83165f90815260fb602090815260408083208584529091529020546001600160a01b039081169082168190036108dd5760405163a883089360e01b815260040160405180910390fd5b67ffffffffffffffff84165f81815260fb6020908152604080832087845282529182902080546001600160a01b0319166001600160a01b038781169182179092558351908152908516918101919091528592917f500dcd607a98daece9bccc2511bf6032471252929de73caf507aae0e082f8453910160405180910390a350505050565b6109696109d2565b606580546001600160a01b0383166001600160a01b0319909116811790915561099a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b031633146106665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161041b565b5f54610100900460ff16610a525760405162461bcd60e51b815260040161041b906113dc565b610a5a610da3565b610a786001600160a01b03821615610a725781610d19565b33610d19565b5060c9805461ff001916610100179055565b5f5160206114c95f395f51905f52546001600160a01b031690565b61063b6109d2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610ae557610ae083610dc9565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610b3f575060408051601f3d908101601f19168201909252610b3c91810190611427565b60015b610ba25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b606482015260840161041b565b5f5160206114c95f395f51905f528114610c105760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b606482015260840161041b565b50610ae0838383610e64565b5f610c278484610e8e565b905081158015610c3e57506001600160a01b038116155b1561064d57604051632b0d65db60e01b815267ffffffffffffffff851660048201526024810184905260440161041b565b610c8360c954610100900460ff1660021490565b610ca05760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff0019909116620100004267ffffffffffffffff1602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b604051630c2b8f8f60e11b815260040160405180910390fd5b606580546001600160a01b031916905561063b81610f39565b610d4660c954610100900460ff1660021490565b15610d645760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610cf6565b5f54610100900460ff166106665760405162461bcd60e51b815260040161041b906113dc565b6001600160a01b0381163b610e365760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161041b565b5f5160206114c95f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b610e6d83610f8a565b5f82511180610e795750805b15610ae057610e888383610fc9565b50505050565b6097545f906001600160a01b031680610eba57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b815267ffffffffffffffff85166004820152602481018490526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610f0d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f31919061143e565b949350505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610f9381610dc9565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061064d83836040518060600160405280602781526020016114e96027913960605f5f856001600160a01b031685604051611005919061147b565b5f60405180830381855af49150503d805f811461103d576040519150601f19603f3d011682016040523d82523d5f602084013e611042565b606091505b50915091506110538683838761105d565b9695505050505050565b606083156110cb5782515f036110c4576001600160a01b0385163b6110c45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161041b565b5081610f31565b610f3183838151156110e05781518083602001fd5b8060405162461bcd60e51b815260040161041b9190611496565b6001600160a01b038116811461063b575f5ffd5b5f6020828403121561111e575f5ffd5b813561064d816110fa565b803567ffffffffffffffff81168114611140575f5ffd5b919050565b5f5f60408385031215611156575f5ffd5b61115f83611129565b946020939093013593505050565b80358015158114611140575f5ffd5b5f5f5f6060848603121561118e575f5ffd5b61119784611129565b9250602084013591506111ac6040850161116d565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156111da575f5ffd5b82356111e5816110fa565b9150602083013567ffffffffffffffff811115611200575f5ffd5b8301601f81018513611210575f5ffd5b803567ffffffffffffffff81111561122a5761122a6111b5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611259576112596111b5565b604052818152828201602001871015611270575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f604083850312156112a0575f5ffd5b823591506112b06020840161116d565b90509250929050565b5f5f5f606084860312156112cb575f5ffd5b6112d484611129565b92506020840135915060408401356112eb816110fa565b809150509250925092565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215611437575f5ffd5b5051919050565b5f6020828403121561144e575f5ffd5b815161064d816110fa565b5f5b8381101561147357818101518382015260200161145b565b50505f910152565b5f825161148c818460208701611459565b9190910192915050565b602081525f82518060208401526114b4816040850160208701611459565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220086d22e71c4d170ad7ce74f948ce47f2f39076babb18c7b950d99c756006877464736f6c634300081b0033", - "balance": "0x0" - }, - "0x1670000000000000000000000000000000010002": { - "contractName": "RollupAddressManager", - "storage": { - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39", - "0x6f603ad772aee14bf097b20bcdc2c1ce5646bfcfbe0e42c192e55416269268c9": "0x0000000000000000000000001670000000000000000000000000000000010001", - "0xee78643889fcb54c297d0ecf866d9df7d829a8c978e52394d135cdb40a501e38": "0x0000000000000000000000001670000000000000000000000000000000000001", - "0xd724ebf31fb7ffa376a4d5d51b51967009df0c86a4dfef5f55507cde2eb36739": "0x0000000000000000000000001670000000000000000000000000000000000005", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0167000000000000000000000000000000010002" - }, - "code": "0x608060405236601057600e6013565b005b600e5b601f601b6021565b6057565b565b5f60527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156070573d5ff35b3d5ffdfea26469706673582212207b080a80081bb3b6bfe354da7a048c8c76f2c38196dbdab17569c4eb15b5f26764736f6c634300081b0033", - "balance": "0x0" - }, - "0xbB21206518394cd6DaF38A6C31A3B1461b77CBC8": { - "contractName": "LibNetwork", - "storage": {}, - "code": "0x730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212204213774d0b1a3b266888223284a425ae694a8c5e97b18403ec7f442200eae55a64736f6c634300081b0033", - "balance": "0x0" - }, - "0x0167000000000000000000000000000000010099": { - "contractName": "RegularERC20", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x526567756c617245524332300000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x52474c0000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000001f4000", - "0x1fe6b582a6b4d9b61da9024a045cb9bafc343b4b12713ba001e47b3500867413": "0x00000000000000000000000000000000000000000000000000000000000fa000", - "0xaaa7f9b700b86a1f8ec5dacd0ca81e3b1ea8214dae2b1856095f9d44c1f5b380": "0x00000000000000000000000000000000000000000000000000000000000fa000" - }, - "code": "0x608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c8063395093511161006e578063395093511461011f57806370a082311461013257806395d89b411461015a578063a457c2d714610162578063a9059cbb14610175578063dd62ed3e14610188575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b261019b565b6040516100bf919061068a565b60405180910390f35b6100db6100d63660046106f0565b61022b565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b366004610718565b610244565b604051601281526020016100bf565b6100db61012d3660046106f0565b610267565b6100ef610140366004610752565b6001600160a01b03165f9081526020819052604090205490565b6100b2610288565b6100db6101703660046106f0565b610297565b6100db6101833660046106f0565b610316565b6100ef610196366004610772565b610323565b6060600380546101aa906107a3565b80601f01602080910402602001604051908101604052809291908181526020018280546101d6906107a3565b80156102215780601f106101f857610100808354040283529160200191610221565b820191905f5260205f20905b81548152906001019060200180831161020457829003601f168201915b5050505050905090565b5f3361023881858561034d565b60019150505b92915050565b5f33610251858285610470565b61025c8585856104e8565b506001949350505050565b5f336102388185856102798383610323565b61028391906107db565b61034d565b6060600480546101aa906107a3565b5f33816102a48286610323565b9050838110156103095760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61025c828686840361034d565b5f336102388185856104e8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103af5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610300565b6001600160a01b0382166104105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610300565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61047b8484610323565b90505f1981146104e257818110156104d55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610300565b6104e2848484840361034d565b50505050565b6001600160a01b03831661054c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610300565b6001600160a01b0382166105ae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610300565b6001600160a01b0383165f90815260208190526040902054818110156106255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610300565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104e2565b602081525f82518060208401525f5b818110156106b65760208186018101516040868401015201610699565b505f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146106eb575f5ffd5b919050565b5f5f60408385031215610701575f5ffd5b61070a836106d5565b946020939093013593505050565b5f5f5f6060848603121561072a575f5ffd5b610733846106d5565b9250610741602085016106d5565b929592945050506040919091013590565b5f60208284031215610762575f5ffd5b61076b826106d5565b9392505050565b5f5f60408385031215610783575f5ffd5b61078c836106d5565b915061079a602084016106d5565b90509250929050565b600181811c908216806107b757607f821691505b6020821081036107d557634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561023e57634e487b7160e01b5f52601160045260245ffdfea2646970667358221220a1403924b9774521e0b2e4d325575d166c7612abf0d4b532ee23317cd4225a6b64736f6c634300081b0033", - "balance": "0x0" - } -} \ No newline at end of file diff --git a/packages/protocol/test/genesis/data/genesis_storage_layout.json b/packages/protocol/test/genesis/data/genesis_storage_layout.json deleted file mode 100644 index a7fb004322d..00000000000 --- a/packages/protocol/test/genesis/data/genesis_storage_layout.json +++ /dev/null @@ -1,4667 +0,0 @@ -{ - "SharedAddressManagerImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3541, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__addresses", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))" - }, - { - "astId": 3545, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "252", - "type": "t_array(t_uint256)49_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(bytes32 => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_bytes32,t_address)" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "SharedAddressManager": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3541, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__addresses", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))" - }, - { - "astId": 3545, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "252", - "type": "t_array(t_uint256)49_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(bytes32 => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_bytes32,t_address)" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "BridgeImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 1731, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reserved1", - "offset": 0, - "slot": "251", - "type": "t_uint64" - }, - { - "astId": 1733, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "nextMessageId", - "offset": 8, - "slot": "251", - "type": "t_uint64" - }, - { - "astId": 1739, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "messageStatus", - "offset": 0, - "slot": "252", - "type": "t_mapping(t_bytes32,t_enum(Status)3366)" - }, - { - "astId": 1743, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__ctx", - "offset": 0, - "slot": "253", - "type": "t_struct(Context)3401_storage" - }, - { - "astId": 1746, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reserved2", - "offset": 0, - "slot": "255", - "type": "t_uint256" - }, - { - "astId": 1749, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reserved3", - "offset": 0, - "slot": "256", - "type": "t_uint256" - }, - { - "astId": 1753, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "257", - "type": "t_array(t_uint256)44_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)44_storage": { - "encoding": "inplace", - "label": "uint256[44]", - "numberOfBytes": "1408", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_enum(Status)3366": { - "encoding": "inplace", - "label": "enum IBridge.Status", - "numberOfBytes": "1" - }, - "t_mapping(t_bytes32,t_enum(Status)3366)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => enum IBridge.Status)", - "numberOfBytes": "32", - "value": "t_enum(Status)3366" - }, - "t_struct(Context)3401_storage": { - "encoding": "inplace", - "label": "struct IBridge.Context", - "numberOfBytes": "64", - "members": [ - { - "astId": 3396, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "msgHash", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 3398, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "from", - "offset": 0, - "slot": "1", - "type": "t_address" - }, - { - "astId": 3400, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "srcChainId", - "offset": 20, - "slot": "1", - "type": "t_uint64" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "Bridge": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 1731, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reserved1", - "offset": 0, - "slot": "251", - "type": "t_uint64" - }, - { - "astId": 1733, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "nextMessageId", - "offset": 8, - "slot": "251", - "type": "t_uint64" - }, - { - "astId": 1739, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "messageStatus", - "offset": 0, - "slot": "252", - "type": "t_mapping(t_bytes32,t_enum(Status)3366)" - }, - { - "astId": 1743, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__ctx", - "offset": 0, - "slot": "253", - "type": "t_struct(Context)3401_storage" - }, - { - "astId": 1746, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reserved2", - "offset": 0, - "slot": "255", - "type": "t_uint256" - }, - { - "astId": 1749, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__reserved3", - "offset": 0, - "slot": "256", - "type": "t_uint256" - }, - { - "astId": 1753, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "__gap", - "offset": 0, - "slot": "257", - "type": "t_array(t_uint256)44_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)44_storage": { - "encoding": "inplace", - "label": "uint256[44]", - "numberOfBytes": "1408", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_enum(Status)3366": { - "encoding": "inplace", - "label": "enum IBridge.Status", - "numberOfBytes": "1" - }, - "t_mapping(t_bytes32,t_enum(Status)3366)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => enum IBridge.Status)", - "numberOfBytes": "32", - "value": "t_enum(Status)3366" - }, - "t_struct(Context)3401_storage": { - "encoding": "inplace", - "label": "struct IBridge.Context", - "numberOfBytes": "64", - "members": [ - { - "astId": 3396, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "msgHash", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 3398, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "from", - "offset": 0, - "slot": "1", - "type": "t_address" - }, - { - "astId": 3400, - "contract": "contracts/shared/bridge/Bridge.sol:Bridge", - "label": "srcChainId", - "offset": 20, - "slot": "1", - "type": "t_uint64" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "ERC20VaultImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 6455, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 8553, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "bridgedToCanonical", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_address,t_struct(CanonicalERC20)8531_storage)" - }, - { - "astId": 8560, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "canonicalToBridged", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_address))" - }, - { - "astId": 8565, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "btokenDenylist", - "offset": 0, - "slot": "303", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 8572, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "lastMigrationStart", - "offset": 0, - "slot": "304", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" - }, - { - "astId": 8576, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "305", - "type": "t_array(t_uint256)46_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)46_storage": { - "encoding": "inplace", - "label": "uint256[46]", - "numberOfBytes": "1472", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_address,t_struct(CanonicalERC20)8531_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct ERC20Vault.CanonicalERC20)", - "numberOfBytes": "32", - "value": "t_struct(CanonicalERC20)8531_storage" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_address)" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(CanonicalERC20)8531_storage": { - "encoding": "inplace", - "label": "struct ERC20Vault.CanonicalERC20", - "numberOfBytes": "96", - "members": [ - { - "astId": 8522, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "chainId", - "offset": 0, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 8524, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "addr", - "offset": 8, - "slot": "0", - "type": "t_address" - }, - { - "astId": 8526, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "decimals", - "offset": 28, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 8528, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 8530, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "name", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "ERC20Vault": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 6455, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 8553, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "bridgedToCanonical", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_address,t_struct(CanonicalERC20)8531_storage)" - }, - { - "astId": 8560, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "canonicalToBridged", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_address))" - }, - { - "astId": 8565, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "btokenDenylist", - "offset": 0, - "slot": "303", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 8572, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "lastMigrationStart", - "offset": 0, - "slot": "304", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" - }, - { - "astId": 8576, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "__gap", - "offset": 0, - "slot": "305", - "type": "t_array(t_uint256)46_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)46_storage": { - "encoding": "inplace", - "label": "uint256[46]", - "numberOfBytes": "1472", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_address,t_struct(CanonicalERC20)8531_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct ERC20Vault.CanonicalERC20)", - "numberOfBytes": "32", - "value": "t_struct(CanonicalERC20)8531_storage" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_address)" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(CanonicalERC20)8531_storage": { - "encoding": "inplace", - "label": "struct ERC20Vault.CanonicalERC20", - "numberOfBytes": "96", - "members": [ - { - "astId": 8522, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "chainId", - "offset": 0, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 8524, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "addr", - "offset": 8, - "slot": "0", - "type": "t_address" - }, - { - "astId": 8526, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "decimals", - "offset": 28, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 8528, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 8530, - "contract": "contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault", - "label": "name", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "ERC721VaultImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 6455, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 6297, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "bridgedToCanonical", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)" - }, - { - "astId": 6304, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "canonicalToBridged", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_address))" - }, - { - "astId": 6308, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "303", - "type": "t_array(t_uint256)48_storage" - }, - { - "astId": 9622, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "351", - "type": "t_array(t_uint256)50_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct BaseNFTVault.CanonicalNFT)", - "numberOfBytes": "32", - "value": "t_struct(CanonicalNFT)6271_storage" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_address)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(CanonicalNFT)6271_storage": { - "encoding": "inplace", - "label": "struct BaseNFTVault.CanonicalNFT", - "numberOfBytes": "96", - "members": [ - { - "astId": 6264, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "chainId", - "offset": 0, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 6266, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "addr", - "offset": 8, - "slot": "0", - "type": "t_address" - }, - { - "astId": 6268, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 6270, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "name", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "ERC721Vault": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 6455, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 6297, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "bridgedToCanonical", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)" - }, - { - "astId": 6304, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "canonicalToBridged", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_address))" - }, - { - "astId": 6308, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "303", - "type": "t_array(t_uint256)48_storage" - }, - { - "astId": 9622, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "__gap", - "offset": 0, - "slot": "351", - "type": "t_array(t_uint256)50_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct BaseNFTVault.CanonicalNFT)", - "numberOfBytes": "32", - "value": "t_struct(CanonicalNFT)6271_storage" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_address)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(CanonicalNFT)6271_storage": { - "encoding": "inplace", - "label": "struct BaseNFTVault.CanonicalNFT", - "numberOfBytes": "96", - "members": [ - { - "astId": 6264, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "chainId", - "offset": 0, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 6266, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "addr", - "offset": 8, - "slot": "0", - "type": "t_address" - }, - { - "astId": 6268, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 6270, - "contract": "contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault", - "label": "name", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "ERC1155VaultImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 6455, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 6297, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "bridgedToCanonical", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)" - }, - { - "astId": 6304, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "canonicalToBridged", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_address))" - }, - { - "astId": 6308, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "303", - "type": "t_array(t_uint256)48_storage" - }, - { - "astId": 16774, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "351", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 12581, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "401", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 7757, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "451", - "type": "t_array(t_uint256)50_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct BaseNFTVault.CanonicalNFT)", - "numberOfBytes": "32", - "value": "t_struct(CanonicalNFT)6271_storage" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_address)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(CanonicalNFT)6271_storage": { - "encoding": "inplace", - "label": "struct BaseNFTVault.CanonicalNFT", - "numberOfBytes": "96", - "members": [ - { - "astId": 6264, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "chainId", - "offset": 0, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 6266, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "addr", - "offset": 8, - "slot": "0", - "type": "t_address" - }, - { - "astId": 6268, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 6270, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "name", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "ERC1155Vault": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 6455, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 6297, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "bridgedToCanonical", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)" - }, - { - "astId": 6304, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "canonicalToBridged", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_address))" - }, - { - "astId": 6308, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "303", - "type": "t_array(t_uint256)48_storage" - }, - { - "astId": 16774, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "351", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 12581, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "401", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 7757, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "__gap", - "offset": 0, - "slot": "451", - "type": "t_array(t_uint256)50_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_address)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_address,t_struct(CanonicalNFT)6271_storage)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => struct BaseNFTVault.CanonicalNFT)", - "numberOfBytes": "32", - "value": "t_struct(CanonicalNFT)6271_storage" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_address)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(CanonicalNFT)6271_storage": { - "encoding": "inplace", - "label": "struct BaseNFTVault.CanonicalNFT", - "numberOfBytes": "96", - "members": [ - { - "astId": 6264, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "chainId", - "offset": 0, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 6266, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "addr", - "offset": 8, - "slot": "0", - "type": "t_address" - }, - { - "astId": 6268, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "symbol", - "offset": 0, - "slot": "1", - "type": "t_string_storage" - }, - { - "astId": 6270, - "contract": "contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault", - "label": "name", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ] - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "BridgedERC20": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 12602, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_balances", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 12608, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_allowances", - "offset": 0, - "slot": "252", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 12610, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_totalSupply", - "offset": 0, - "slot": "253", - "type": "t_uint256" - }, - { - "astId": 12612, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_name", - "offset": 0, - "slot": "254", - "type": "t_string_storage" - }, - { - "astId": 12614, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "_symbol", - "offset": 0, - "slot": "255", - "type": "t_string_storage" - }, - { - "astId": 13194, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "256", - "type": "t_array(t_uint256)45_storage" - }, - { - "astId": 6899, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "srcToken", - "offset": 0, - "slot": "301", - "type": "t_address" - }, - { - "astId": 6901, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__srcDecimals", - "offset": 20, - "slot": "301", - "type": "t_uint8" - }, - { - "astId": 6904, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "srcChainId", - "offset": 0, - "slot": "302", - "type": "t_uint256" - }, - { - "astId": 6907, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "migratingAddress", - "offset": 0, - "slot": "303", - "type": "t_address" - }, - { - "astId": 6910, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "migratingInbound", - "offset": 20, - "slot": "303", - "type": "t_bool" - }, - { - "astId": 6914, - "contract": "contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20", - "label": "__gap", - "offset": 0, - "slot": "304", - "type": "t_array(t_uint256)47_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)45_storage": { - "encoding": "inplace", - "label": "uint256[45]", - "numberOfBytes": "1440", - "base": "t_uint256" - }, - "t_array(t_uint256)47_storage": { - "encoding": "inplace", - "label": "uint256[47]", - "numberOfBytes": "1504", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "BridgedERC721": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 16774, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 14311, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_name", - "offset": 0, - "slot": "301", - "type": "t_string_storage" - }, - { - "astId": 14313, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_symbol", - "offset": 0, - "slot": "302", - "type": "t_string_storage" - }, - { - "astId": 14317, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_owners", - "offset": 0, - "slot": "303", - "type": "t_mapping(t_uint256,t_address)" - }, - { - "astId": 14321, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_balances", - "offset": 0, - "slot": "304", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 14325, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_tokenApprovals", - "offset": 0, - "slot": "305", - "type": "t_mapping(t_uint256,t_address)" - }, - { - "astId": 14331, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "_operatorApprovals", - "offset": 0, - "slot": "306", - "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" - }, - { - "astId": 15233, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "307", - "type": "t_array(t_uint256)44_storage" - }, - { - "astId": 7538, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "srcToken", - "offset": 0, - "slot": "351", - "type": "t_address" - }, - { - "astId": 7541, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "srcChainId", - "offset": 0, - "slot": "352", - "type": "t_uint256" - }, - { - "astId": 7545, - "contract": "contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721", - "label": "__gap", - "offset": 0, - "slot": "353", - "type": "t_array(t_uint256)48_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)44_storage": { - "encoding": "inplace", - "label": "uint256[44]", - "numberOfBytes": "1408", - "base": "t_uint256" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_address,t_mapping(t_address,t_bool))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => bool))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_bool)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_uint256,t_address)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "BridgedERC1155": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 16774, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "251", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 11133, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_balances", - "offset": 0, - "slot": "301", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" - }, - { - "astId": 11139, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_operatorApprovals", - "offset": 0, - "slot": "302", - "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" - }, - { - "astId": 11141, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "_uri", - "offset": 0, - "slot": "303", - "type": "t_string_storage" - }, - { - "astId": 12348, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "304", - "type": "t_array(t_uint256)47_storage" - }, - { - "astId": 6672, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "srcToken", - "offset": 0, - "slot": "351", - "type": "t_address" - }, - { - "astId": 6675, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "srcChainId", - "offset": 0, - "slot": "352", - "type": "t_uint256" - }, - { - "astId": 6678, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "symbol", - "offset": 0, - "slot": "353", - "type": "t_string_storage" - }, - { - "astId": 6681, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "name", - "offset": 0, - "slot": "354", - "type": "t_string_storage" - }, - { - "astId": 6685, - "contract": "contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155", - "label": "__gap", - "offset": 0, - "slot": "355", - "type": "t_array(t_uint256)46_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)46_storage": { - "encoding": "inplace", - "label": "uint256[46]", - "numberOfBytes": "1472", - "base": "t_uint256" - }, - "t_array(t_uint256)47_storage": { - "encoding": "inplace", - "label": "uint256[47]", - "numberOfBytes": "1504", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_address,t_mapping(t_address,t_bool))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => bool))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_bool)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "SignalServiceImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 5234, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "topBlockId", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint64,t_mapping(t_bytes32,t_uint64))" - }, - { - "astId": 5239, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "isAuthorized", - "offset": 0, - "slot": "252", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 5243, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "253", - "type": "t_array(t_uint256)48_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_bytes32,t_uint64)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => uint64)", - "numberOfBytes": "32", - "value": "t_uint64" - }, - "t_mapping(t_uint64,t_mapping(t_bytes32,t_uint64))": { - "encoding": "mapping", - "key": "t_uint64", - "label": "mapping(uint64 => mapping(bytes32 => uint64))", - "numberOfBytes": "32", - "value": "t_mapping(t_bytes32,t_uint64)" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "SignalService": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 5234, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "topBlockId", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint64,t_mapping(t_bytes32,t_uint64))" - }, - { - "astId": 5239, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "isAuthorized", - "offset": 0, - "slot": "252", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 5243, - "contract": "contracts/shared/signal/SignalService.sol:SignalService", - "label": "__gap", - "offset": 0, - "slot": "253", - "type": "t_array(t_uint256)48_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)48_storage": { - "encoding": "inplace", - "label": "uint256[48]", - "numberOfBytes": "1536", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_bytes32,t_uint64)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => uint64)", - "numberOfBytes": "32", - "value": "t_uint64" - }, - "t_mapping(t_uint64,t_mapping(t_bytes32,t_uint64))": { - "encoding": "mapping", - "key": "t_uint64", - "label": "mapping(uint64 => mapping(bytes32 => uint64))", - "numberOfBytes": "32", - "value": "t_mapping(t_bytes32,t_uint64)" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "TaikoL2Impl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 684, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_blockhashes", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint256,t_bytes32)" - }, - { - "astId": 687, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "publicInputHash", - "offset": 0, - "slot": "252", - "type": "t_bytes32" - }, - { - "astId": 690, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "parentGasExcess", - "offset": 0, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 693, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "lastSyncedBlock", - "offset": 8, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 695, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "parentTimestamp", - "offset": 16, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 697, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "parentGasTarget", - "offset": 24, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 700, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "l1ChainId", - "offset": 0, - "slot": "254", - "type": "t_uint64" - }, - { - "astId": 704, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "255", - "type": "t_array(t_uint256)46_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)46_storage": { - "encoding": "inplace", - "label": "uint256[46]", - "numberOfBytes": "1472", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "TaikoL2": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 684, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "_blockhashes", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint256,t_bytes32)" - }, - { - "astId": 687, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "publicInputHash", - "offset": 0, - "slot": "252", - "type": "t_bytes32" - }, - { - "astId": 690, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "parentGasExcess", - "offset": 0, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 693, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "lastSyncedBlock", - "offset": 8, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 695, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "parentTimestamp", - "offset": 16, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 697, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "parentGasTarget", - "offset": 24, - "slot": "253", - "type": "t_uint64" - }, - { - "astId": 700, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "l1ChainId", - "offset": 0, - "slot": "254", - "type": "t_uint64" - }, - { - "astId": 704, - "contract": "contracts/layer2/based/TaikoL2.sol:TaikoL2", - "label": "__gap", - "offset": 0, - "slot": "255", - "type": "t_array(t_uint256)46_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)46_storage": { - "encoding": "inplace", - "label": "uint256[46]", - "numberOfBytes": "1472", - "base": "t_uint256" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "RollupAddressManagerImpl": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3541, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__addresses", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))" - }, - { - "astId": 3545, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "252", - "type": "t_array(t_uint256)49_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(bytes32 => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_bytes32,t_address)" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "RollupAddressManager": { - "storage": [ - { - "astId": 10941, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 10944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 15775, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage" - }, - { - "astId": 10686, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_owner", - "offset": 0, - "slot": "51", - "type": "t_address" - }, - { - "astId": 10806, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "52", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 10579, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "_pendingOwner", - "offset": 0, - "slot": "101", - "type": "t_address" - }, - { - "astId": 10673, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3680, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "addressManager", - "offset": 0, - "slot": "151", - "type": "t_address" - }, - { - "astId": 3684, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "152", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3936, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__reentry", - "offset": 0, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3938, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__paused", - "offset": 1, - "slot": "201", - "type": "t_uint8" - }, - { - "astId": 3940, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "lastUnpausedAt", - "offset": 2, - "slot": "201", - "type": "t_uint64" - }, - { - "astId": 3944, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "202", - "type": "t_array(t_uint256)49_storage" - }, - { - "astId": 3541, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__addresses", - "offset": 0, - "slot": "251", - "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))" - }, - { - "astId": 3545, - "contract": "contracts/shared/common/AddressManager.sol:AddressManager", - "label": "__gap", - "offset": 0, - "slot": "252", - "type": "t_array(t_uint256)49_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_uint256)49_storage": { - "encoding": "inplace", - "label": "uint256[49]", - "numberOfBytes": "1568", - "base": "t_uint256" - }, - "t_array(t_uint256)50_storage": { - "encoding": "inplace", - "label": "uint256[50]", - "numberOfBytes": "1600", - "base": "t_uint256" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_address)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => address)", - "numberOfBytes": "32", - "value": "t_address" - }, - "t_mapping(t_uint256,t_mapping(t_bytes32,t_address))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(bytes32 => address))", - "numberOfBytes": "32", - "value": "t_mapping(t_bytes32,t_address)" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - }, - "LibNetwork": { - "storage": [], - "types": {} - }, - "RegularERC20": { - "storage": [ - { - "astId": 20324, - "contract": "test/shared/token/RegularERC20.sol:RegularERC20", - "label": "_balances", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 20330, - "contract": "test/shared/token/RegularERC20.sol:RegularERC20", - "label": "_allowances", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 20332, - "contract": "test/shared/token/RegularERC20.sol:RegularERC20", - "label": "_totalSupply", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 20334, - "contract": "test/shared/token/RegularERC20.sol:RegularERC20", - "label": "_name", - "offset": 0, - "slot": "3", - "type": "t_string_storage" - }, - { - "astId": 20336, - "contract": "test/shared/token/RegularERC20.sol:RegularERC20", - "label": "_symbol", - "offset": 0, - "slot": "4", - "type": "t_string_storage" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_mapping(t_address,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/packages/protocol/test/layer1/based/TaikoL1.t.sol b/packages/protocol/test/layer1/based/TaikoL1.t.sol index 39918e9d14a..6b01e6012ed 100644 --- a/packages/protocol/test/layer1/based/TaikoL1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1.t.sol @@ -45,7 +45,8 @@ contract TaikoL1Tests is TaikoL1TestBase { for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { //printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -74,7 +75,8 @@ contract TaikoL1Tests is TaikoL1TestBase { for (uint256 blockId = 1; blockId <= 20; ++blockId) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); bytes32 blockHash = bytes32(1e10 + blockId); @@ -87,7 +89,7 @@ contract TaikoL1Tests is TaikoL1TestBase { verifyBlock(2); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.id, blk.blockId); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, parentHash); @@ -108,7 +110,8 @@ contract TaikoL1Tests is TaikoL1TestBase { for (uint256 blockId = 1; blockId <= conf.blockMaxProposals; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); bytes32 blockHash = bytes32(1e10 + blockId); @@ -134,7 +137,8 @@ contract TaikoL1Tests is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= conf.blockMaxProposals; blockId++) { - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + bytes32 blockHash; bytes32 stateRoot; if (blockId % 2 == 0) { @@ -189,13 +193,12 @@ contract TaikoL1Tests is TaikoL1TestBase { function test_pauseProving() external { L1.pauseProving(true); - TaikoData.BlockMetadata memory meta; - giveEthAndTko(Alice, 1000 ether, 1000 ether); giveEthAndTko(Bob, 1e8 ether, 100 ether); // Proposing is still possible - (meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + // Proving is not, so supply the revert reason to proveBlock proveBlock( Bob, @@ -235,14 +238,8 @@ contract TaikoL1Tests is TaikoL1TestBase { } function proposeButRevert(address proposer, uint24 txListSize, bytes4 revertReason) internal { - uint256 msgValue = 2 ether; - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](0); - vm.prank(proposer, proposer); vm.expectRevert(revertReason); - L1.proposeBlock{ value: msgValue }( - abi.encode(TaikoData.BlockParams(address(0), address(0), 0, 0, hookcalls, "")), - new bytes(txListSize) - ); + L1.proposeBlockV2("", new bytes(txListSize)); } } diff --git a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index cbac7074a58..a984997b3a9 100644 --- a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -28,7 +28,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } function proveHigherTierProof( - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 stateRoot, bytes32 blockHash, @@ -53,7 +53,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -94,7 +95,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -139,7 +141,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -183,7 +186,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -232,7 +236,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -291,7 +296,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { for (uint256 blockId = 1; blockId < 10; blockId++) { //printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -325,7 +331,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -379,7 +386,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -427,7 +435,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { console2.log("storeStateRoot:", storeStateRoot); printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + mine(1); bytes32 blockHash = bytes32(1_000_000 + blockId); @@ -479,7 +488,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -515,7 +525,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -523,7 +534,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // Mess up metahash - meta.l1Height = 200; + meta.proposedIn = 200; proveBlock( Bob, meta, @@ -547,7 +558,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -590,7 +602,8 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol index f3620aaad02..aead9a93e51 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol @@ -117,24 +117,15 @@ abstract contract TaikoL1TestBase is TaikoTest { uint24 txListSize ) internal - returns (TaikoData.BlockMetadata memory meta, TaikoData.EthDeposit[] memory ethDeposits) + returns (TaikoData.BlockMetadataV2 memory) { - // For the test not to fail, set the message.value to the highest, the - // rest will be returned - // anyways - uint256 msgValue = 2 ether; - - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](0); vm.prank(proposer, proposer); - (meta, ethDeposits) = L1.proposeBlock{ value: msgValue }( - abi.encode(TaikoData.BlockParams(address(0), address(0), 0, 0, hookcalls, "")), - new bytes(txListSize) - ); + return L1.proposeBlockV2("", new bytes(txListSize)); } function proveBlock( address prover, - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 blockHash, bytes32 stateRoot, @@ -177,18 +168,18 @@ abstract contract TaikoL1TestBase is TaikoTest { // Grant 2 signatures, 3rd might be a revert vm.prank(David, David); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); vm.prank(Emma, Emma); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); if (revertReason != "") { vm.prank(Frank, Frank); vm.expectRevert(); // Revert reason is 'wrapped' so will not be // identical to the expectedRevert - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } else { vm.prank(Frank, Frank); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } } else { if (revertReason != "") { diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol index 93aff49bbe5..7dbacb483f2 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol @@ -17,19 +17,24 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; @@ -62,11 +67,10 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -88,11 +92,10 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -120,19 +123,24 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; @@ -153,11 +161,10 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -182,11 +189,10 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -215,7 +221,7 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = bytes32(uint256(9)); @@ -238,10 +244,9 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 2); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 2); assertEq(ts.contester, address(0)); @@ -266,7 +271,7 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = GENESIS_BLOCK_HASH; @@ -289,10 +294,9 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.contester, address(0)); @@ -317,7 +321,7 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = bytes32(uint256(9)); @@ -340,10 +344,9 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 2); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 2); assertEq(ts.contester, address(0)); @@ -367,19 +370,24 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; @@ -400,11 +408,10 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -429,11 +436,10 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -457,19 +463,24 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { giveEthAndTko(Alice, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block with herself as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol index c843b43e60c..489daa1c10b 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol @@ -18,7 +18,7 @@ contract TaikoL10TestGroup1 is TaikoL1TestGroupBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 i = 1; i <= 5; ++i) { - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 blockHash = bytes32(uint256(10_000 + i)); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol index 9bb5f5cf8a7..cdfe88ff3d5 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol @@ -21,7 +21,7 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -40,10 +40,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -66,10 +65,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -94,7 +92,7 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); @@ -127,7 +125,7 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -146,10 +144,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -172,10 +169,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -202,7 +198,7 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol index 000fefb99ea..fc554565a0b 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol @@ -22,7 +22,7 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -43,10 +43,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -73,10 +72,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -101,7 +99,7 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); @@ -135,7 +133,7 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -156,10 +154,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -186,10 +183,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -220,7 +216,7 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol index 01b503f5cd6..5f003a42088 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol @@ -20,7 +20,7 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -39,10 +39,9 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -66,7 +65,7 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); @@ -99,7 +98,7 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -120,10 +119,9 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -150,11 +148,10 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol index ac7d7fc0efe..cda4737bb38 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol @@ -18,7 +18,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { giveEthAndTko(William, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -31,10 +31,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -70,10 +69,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -106,11 +104,10 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -138,7 +135,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -169,10 +166,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -193,11 +189,10 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -226,7 +221,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -259,10 +254,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -286,11 +280,10 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -317,7 +310,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { giveEthAndTko(William, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -330,10 +323,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol index 15fa6b57fb0..3c9d7803539 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol @@ -19,7 +19,7 @@ contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -42,10 +42,9 @@ contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -69,11 +68,10 @@ contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol index d255a89328d..117c7cd42a9 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol @@ -16,7 +16,7 @@ contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -55,7 +55,7 @@ contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol index ecb34e99b81..9c52fca4257 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol @@ -18,7 +18,7 @@ contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Pause TaikoL1"); mineAndWrap(10 seconds); @@ -68,7 +68,7 @@ contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Pause TaikoL1 proving"); mineAndWrap(10 seconds); @@ -107,7 +107,7 @@ contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { // 2. Gets a transition by ID & hash that doesn't exist. function test_taikoL1_group_8_case_3() external { vm.expectRevert(LibUtils.L1_INVALID_BLOCK_ID.selector); - L1.getBlock(2); + L1.getBlockV2(2); vm.expectRevert(LibUtils.L1_TRANSITION_NOT_FOUND.selector); L1.getTransition(0, 2); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol index 563512ef66b..889eb2f22e1 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol @@ -13,7 +13,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { giveEthAndTko(David, 10_000 ether, 1000 ether); console2.log("====== David proposes, proves, and verifies the first block"); - TaikoData.BlockMetadata memory meta = proposeBlock(David, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(David, ""); bytes32 stateRoot = bytes32(uint256(1)); @@ -39,7 +39,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { giveEthAndTko(William, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = FIRST_BLOCK_HASH; @@ -52,10 +52,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -92,10 +91,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -129,11 +127,10 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -162,7 +159,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Alice proves the block"); bytes32 parentHash = FIRST_BLOCK_HASH; @@ -193,10 +190,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -218,11 +214,10 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -252,7 +247,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -285,10 +280,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -314,11 +308,10 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); @@ -347,7 +340,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { giveEthAndTko(William, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = FIRST_BLOCK_HASH; @@ -360,10 +353,9 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol index 8843b39ff8b..5d45d0ef695 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol @@ -25,16 +25,24 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { bytes4 revertReason ) internal - returns (TaikoData.BlockMetadata memory meta) + returns (TaikoData.BlockMetadataV2 memory) { - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](0); - bytes memory txList = new bytes(10); + vm.prank(proposer); + if (revertReason != "") vm.expectRevert(revertReason); + return L1.proposeBlockV2("", new bytes(10)); + } + function proposeBlock( + address proposer, + TaikoData.BlockParamsV2 memory params, + bytes4 revertReason + ) + internal + returns (TaikoData.BlockMetadataV2 memory) + { vm.prank(proposer); if (revertReason != "") vm.expectRevert(revertReason); - (meta,) = L1.proposeBlock{ value: 3 ether }( - abi.encode(TaikoData.BlockParams(address(0), address(0), 0, 0, hookcalls, "")), txList - ); + return L1.proposeBlockV2(abi.encode(params), new bytes(10)); } function proposeBlockV2( @@ -54,7 +62,7 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { function proveBlock( address prover, - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 blockHash, bytes32 stateRoot, @@ -97,13 +105,13 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { // Grant 2 signatures, 3rd might be a revert vm.prank(David, David); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); vm.prank(Emma, Emma); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); if (revertReason != "") vm.expectRevert(revertReason); vm.prank(Frank); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } else { if (revertReason != "") vm.expectRevert(revertReason); vm.prank(prover); @@ -170,7 +178,7 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { } function printBlockAndTrans(uint64 blockId) internal view { - TaikoData.Block memory blk = L1.getBlock(blockId); + TaikoData.BlockV2 memory blk = L1.getBlockV2(blockId); printBlock(blk); for (uint32 i = 1; i < blk.nextTransitionId; ++i) { @@ -190,7 +198,7 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { return tko.balanceOf(user) + L1.bondBalanceOf(user); } - function printBlock(TaikoData.Block memory blk) internal view { + function printBlock(TaikoData.BlockV2 memory blk) internal view { (, TaikoData.SlotB memory b) = L1.getStateVariables(); console2.log("\n=================="); console2.log("---CHAIN:"); @@ -198,8 +206,6 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { console2.log(" | numBlocks:", b.numBlocks); console2.log(" | timestamp:", block.timestamp); console2.log("---BLOCK#", blk.blockId); - console2.log(" | assignedProver:", blk.assignedProver); - console2.log(" | livenessBond:", blk.livenessBond); console2.log(" | proposedAt:", blk.proposedAt); console2.log(" | proposedIn:", blk.proposedIn); console2.log(" | metaHash:", vm.toString(blk.metaHash)); diff --git a/packages/protocol/test/layer1/based/TaikoL1testGroupA1.t.sol b/packages/protocol/test/layer1/based/TaikoL1testGroupA1.t.sol deleted file mode 100644 index 1aa4a34452d..00000000000 --- a/packages/protocol/test/layer1/based/TaikoL1testGroupA1.t.sol +++ /dev/null @@ -1,101 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import "./TaikoL1TestGroupBase.sol"; - -contract TaikoL1ForkA1 is TaikoL1 { - function getConfig() public pure override returns (TaikoData.Config memory config) { - config = TaikoL1.getConfig(); - config.maxBlocksToVerify = 0; - config.blockMaxProposals = 20; - config.blockRingBufferSize = 25; - config.stateRootSyncInternal = 2; - config.ontakeForkHeight = 10; - } -} - -contract TaikoL1TestGroupA1 is TaikoL1TestGroupBase { - function deployTaikoL1() internal override returns (TaikoL1) { - return TaikoL1( - payable(deployProxy({ name: "taiko", impl: address(new TaikoL1ForkA1()), data: "" })) - ); - } - - // Test summary: - // - Use the v2 on block 10 - ontakeForkHeight = 10 - // - propose and prove block 1 to 9 using v1 - // - propose and prove block 10 to 15 using v2 - // - try to verify more than 15 blocks to verify all 15 blocks are verified. - function test_taikoL1_group_a1_case_1() external { - vm.warp(1_000_000); - mine(1); - printBlockAndTrans(0); - - giveEthAndTko(Alice, 10_000 ether, 1000 ether); - - console2.log("====== Alice propose 5 block"); - bytes32 parentHash = GENESIS_BLOCK_HASH; - - uint64 ontakeForkHeight = L1.getConfig().ontakeForkHeight; - - uint64 i = 1; - for (; i < ontakeForkHeight; ++i) { - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, ""); - printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(i); - assertTrue(blk.livenessBond > 0); - assertEq(blk.assignedProver, address(0)); - assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.proposedIn, block.number); - - // Prove the block - bytes32 blockHash = bytes32(uint256(10_000 + i)); - bytes32 stateRoot = bytes32(uint256(20_000 + i)); - - mineAndWrap(10 seconds); - - proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - parentHash = blockHash; - - printBlockAndTrans(meta.id); - blk = L1.getBlock(i); - assertEq(blk.livenessBond, 0); - assertEq(blk.assignedProver, address(0)); - } - - TaikoData.BlockParamsV2 memory params; - for (; i <= ontakeForkHeight + 5; ++i) { - TaikoData.BlockMetadataV2 memory metaV2 = proposeBlockV2(Alice, params, ""); - printBlockAndTrans(metaV2.id); - TaikoData.Block memory blk = L1.getBlock(i); - assertEq(blk.livenessBond, 0); - assertEq(blk.assignedProver, address(0)); - assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.proposedIn, block.number - 1); - - // Prove the block - bytes32 blockHash = bytes32(uint256(10_000 + i)); - bytes32 stateRoot = bytes32(uint256(20_000 + i)); - - mineAndWrap(10 seconds); - - proveBlock2(Alice, metaV2, parentHash, blockHash, stateRoot, metaV2.minTier, ""); - parentHash = blockHash; - - printBlockAndTrans(metaV2.id); - blk = L1.getBlock(i); - assertEq(blk.livenessBond, 0); - assertEq(blk.assignedProver, address(0)); - } - - console2.log("====== Verify many blocks"); - mineAndWrap(7 days); - verifyBlock(ontakeForkHeight + 10); - { - (, TaikoData.SlotB memory b) = L1.getStateVariables(); - assertEq(b.lastVerifiedBlockId, ontakeForkHeight + 5); - - assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); - } - } -} diff --git a/packages/protocol/test/layer1/based/TaikoL1testGroupA2.t.sol b/packages/protocol/test/layer1/based/TaikoL1testGroupA2.t.sol deleted file mode 100644 index 764a3d58b8c..00000000000 --- a/packages/protocol/test/layer1/based/TaikoL1testGroupA2.t.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import "./TaikoL1TestGroupBase.sol"; - -contract TaikoL1ForkA2 is TaikoL1 { - function getConfig() public pure override returns (TaikoData.Config memory config) { - config = TaikoL1.getConfig(); - config.maxBlocksToVerify = 0; - config.blockMaxProposals = 10; - config.blockRingBufferSize = 15; - config.stateRootSyncInternal = 2; - config.ontakeForkHeight = 0; // or 1, works the same. - } -} - -contract TaikoL1TestGroupA2 is TaikoL1TestGroupBase { - function deployTaikoL1() internal override returns (TaikoL1) { - return TaikoL1( - payable(deployProxy({ name: "taiko", impl: address(new TaikoL1ForkA2()), data: "" })) - ); - } - - // Test summary: - // - Use the v2 immediately - ontakeForkHeight = 0 or 1 - // - propose and prove 5 blocks - // - try to verify more than 5 blocks to verify all 5 blocks are verified. - function test_taikoL1_group_a2_case_1() external { - vm.warp(1_000_000); - mine(1); - printBlockAndTrans(0); - - giveEthAndTko(Alice, 10_000 ether, 1000 ether); - TaikoData.Config memory config = L1.getConfig(); - - bytes32 parentHash = GENESIS_BLOCK_HASH; - - proposeBlock(Alice, LibProposing.L1_INVALID_CUSTOM_PROPOSER.selector); - - TaikoData.BlockParamsV2 memory params; - for (uint64 i = 1; i <= 5; ++i) { - TaikoData.BlockMetadataV2 memory meta = proposeBlockV2(Alice, params, ""); - printBlockAndTrans(i); - - assertTrue(meta.difficulty != 0); - assertEq(meta.proposedAt, block.timestamp); - assertEq(meta.proposedIn, block.number); - assertEq(meta.timestamp, block.timestamp); - assertEq(meta.anchorBlockId, block.number - 1); - assertEq(meta.anchorBlockHash, blockhash(block.number - 1)); - assertEq(meta.livenessBond, config.livenessBond); - assertEq(meta.coinbase, Alice); - - TaikoData.Block memory blk = L1.getBlock(i); - assertEq(blk.blockId, i); - assertEq(blk.proposedAt, meta.timestamp); - assertEq(blk.proposedIn, meta.anchorBlockId); - assertEq(blk.assignedProver, address(0)); - assertEq(blk.livenessBond, 0); - assertEq(blk.nextTransitionId, 1); - assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.metaHash, keccak256(abi.encode(meta))); - - // Prove the block - bytes32 blockHash = bytes32(uint256(10_000 + i)); - bytes32 stateRoot = bytes32(uint256(20_000 + i)); - - mineAndWrap(10 seconds); - - proveBlock2(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - parentHash = blockHash; - - printBlockAndTrans(i); - blk = L1.getBlock(i); - assertEq(blk.livenessBond, 0); - assertEq(blk.assignedProver, address(0)); - } - - console2.log("====== Verify many blocks"); - mineAndWrap(7 days); - verifyBlock(10); - { - (, TaikoData.SlotB memory b) = L1.getStateVariables(); - assertEq(b.lastVerifiedBlockId, 5); - - assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); - } - } - - // Test summary: - // - Use the v2 immediately - ontakeForkHeight = 0 or 1 - // - propose and prove 5 blocks - // - try to verify more than 5 blocks to verify all 5 blocks are verified. - function test_taikoL1_group_a2_case_2() external { - vm.warp(1_000_000); - mine(1); - printBlockAndTrans(0); - - giveEthAndTko(Alice, 10_000 ether, 1000 ether); - - TaikoData.Config memory config = L1.getConfig(); - - // Propose the first block with default parameters - TaikoData.BlockParamsV2 memory params = TaikoData.BlockParamsV2({ - proposer: address(0), - coinbase: address(0), - parentMetaHash: 0, - anchorBlockId: 0, - timestamp: 0, - blobTxListOffset: 0, - blobTxListLength: 0, - blobIndex: 0 - }); - TaikoData.BlockMetadataV2 memory meta = proposeBlockV2(Alice, params, ""); - - assertEq(meta.id, 1); - - assertTrue(meta.difficulty != 0); - assertEq(meta.proposedAt, block.timestamp); - assertEq(meta.proposedIn, block.number); - assertEq(meta.timestamp, block.timestamp); - assertEq(meta.anchorBlockId, block.number - 1); - assertEq(meta.anchorBlockHash, blockhash(block.number - 1)); - assertEq(meta.livenessBond, config.livenessBond); - assertEq(meta.coinbase, Alice); - assertEq(meta.parentMetaHash, bytes32(uint256(1))); - - TaikoData.Block memory blk = L1.getBlock(1); - assertEq(blk.blockId, 1); - assertEq(blk.proposedAt, meta.timestamp); - assertEq(blk.proposedIn, meta.anchorBlockId); - assertEq(blk.assignedProver, address(0)); - assertEq(blk.livenessBond, 0); - assertEq(blk.nextTransitionId, 1); - assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.metaHash, keccak256(abi.encode(meta))); - - // mine 100 blocks - vm.roll(100); - vm.warp(100 days); - - // Propose the second block with custom parameters - - params = TaikoData.BlockParamsV2({ - proposer: address(0), - coinbase: Bob, - parentMetaHash: 0, - anchorBlockId: 90, - timestamp: uint64(block.timestamp - 100), - blobTxListOffset: 0, - blobTxListLength: 0, - blobIndex: 0 - }); - meta = proposeBlockV2(Alice, params, ""); - - assertEq(meta.id, 2); - assertTrue(meta.difficulty != 0); - assertEq(meta.proposedAt, block.timestamp); - assertEq(meta.proposedIn, block.number); - assertEq(meta.timestamp, params.timestamp); - assertEq(meta.anchorBlockId, 90); - assertEq(meta.anchorBlockHash, blockhash(90)); - assertEq(meta.livenessBond, config.livenessBond); - assertEq(meta.coinbase, Bob); - assertEq(meta.parentMetaHash, blk.metaHash); - - blk = L1.getBlock(2); - assertEq(blk.blockId, 2); - assertEq(blk.proposedAt, meta.timestamp); - assertEq(blk.proposedIn, meta.anchorBlockId); - assertEq(blk.assignedProver, address(0)); - assertEq(blk.livenessBond, 0); - assertEq(blk.nextTransitionId, 1); - assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.metaHash, keccak256(abi.encode(meta))); - - for (uint256 i = 0; i < 3; ++i) { - TaikoData.BlockParamsV2 memory params2; - proposeBlockV2(Alice, params2, ""); - } - } -} diff --git a/packages/protocol/test/layer1/based/TestTierProvider.sol b/packages/protocol/test/layer1/based/TestTierProvider.sol index 4832486357e..b2ac61e4786 100644 --- a/packages/protocol/test/layer1/based/TestTierProvider.sol +++ b/packages/protocol/test/layer1/based/TestTierProvider.sol @@ -25,9 +25,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { validityBond: 250 ether, // TKO contestBond: 500 ether, // TKO cooldownWindow: 1440, //24 hours - provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 0 - }); + provingWindow: 30 // 0.5 hours + }); } if (_tierId == LibTiers.TIER_SGX) { @@ -36,9 +35,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { validityBond: 250 ether, // TKO contestBond: 1640 ether, // =250TKO * 6.5625 cooldownWindow: 1440, //24 hours - provingWindow: 60, // 1 hours - maxBlocksToVerifyPerProof: 0 - }); + provingWindow: 60 // 1 hours + }); } if (_tierId == LibTiers.TIER_GUARDIAN) { @@ -47,9 +45,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { validityBond: 0, // must be 0 for top tier contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours - provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 0 - }); + provingWindow: 2880 // 48 hours + }); } revert TIER_NOT_FOUND(); diff --git a/packages/protocol/test/layer2/TaikoL2.t.sol b/packages/protocol/test/layer2/TaikoL2.t.sol index 20beeaa94d7..3088700fc6d 100644 --- a/packages/protocol/test/layer2/TaikoL2.t.sol +++ b/packages/protocol/test/layer2/TaikoL2.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.24; import "./TaikoL2Test.sol"; -contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { +contract TaikoL2ForTest is TaikoL2 { function skipFeeCheck() public pure override returns (bool) { return true; } @@ -12,14 +12,12 @@ contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { contract TaikoL2Tests is TaikoL2Test { using SafeCast for uint256; - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // same as `block_gas_limit` in foundry.toml + uint64 public constant L1_CHAIN_ID = 12_345; uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; address public addressManager; - TaikoL2EIP1559Configurable public L2; - SkipBasefeeCheckL2 public L2skip; + uint64 public anchorBlockId; + TaikoL2ForTest public L2; function setUp() public { addressManager = deployProxy({ @@ -37,33 +35,20 @@ contract TaikoL2Tests is TaikoL2Test { }) ); - uint64 gasExcess = 0; - uint8 quotient = 8; - uint32 gasTarget = 60_000_000; - uint64 l1ChainId = 12_345; - - L2 = TaikoL2EIP1559Configurable( + L2 = TaikoL2ForTest( payable( deployProxy({ name: "taiko", - impl: address(new TaikoL2EIP1559Configurable()), - data: abi.encodeCall( - TaikoL2.init, (address(0), addressManager, l1ChainId, gasExcess) - ), + impl: address(new TaikoL2ForTest()), + data: abi.encodeCall(TaikoL2.init, (address(0), addressManager, L1_CHAIN_ID, 0)), registerTo: addressManager }) ) ); - L2.setConfigAndExcess(LibL2Config.Config(gasTarget, quotient), gasExcess); - ss.authorize(address(L2), true); - - gasExcess = 195_420_300_100; - vm.roll(block.number + 1); vm.warp(block.timestamp + 30); - vm.deal(address(L2), 100 ether); } @@ -72,18 +57,18 @@ contract TaikoL2Tests is TaikoL2Test { vm.fee(1); vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - _anchor(BLOCK_GAS_LIMIT); + _anchorV2(BLOCK_GAS_LIMIT); vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - vm.expectRevert(); // L2_PUBLIC_INPUT_HASH_MISMATCH - _anchor(BLOCK_GAS_LIMIT); + vm.expectRevert(TaikoL2.L2_PUBLIC_INPUT_HASH_MISMATCH.selector); + _anchorV2(BLOCK_GAS_LIMIT); } // calling anchor in the same block more than once should fail function test_L2_AnchorTx_revert_from_wrong_signer() external { vm.fee(1); - vm.expectRevert(); - _anchor(BLOCK_GAS_LIMIT); + vm.expectRevert(TaikoL2.L2_INVALID_SENDER.selector); + _anchorV2(BLOCK_GAS_LIMIT); } function test_L2_AnchorTx_signing(bytes32 digest) external { @@ -95,10 +80,10 @@ contract TaikoL2Tests is TaikoL2Test { signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - vm.expectRevert(); + vm.expectRevert(LibL2Signer.L2_INVALID_GOLDEN_TOUCH_K.selector); LibL2Signer.signAnchor(digest, uint8(0)); - vm.expectRevert(); + vm.expectRevert(LibL2Signer.L2_INVALID_GOLDEN_TOUCH_K.selector); LibL2Signer.signAnchor(digest, uint8(3)); } @@ -109,7 +94,7 @@ contract TaikoL2Tests is TaikoL2Test { assertEq(Alice.balance, 100 ether); // Random EOA cannot call withdraw - vm.expectRevert(); + vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); vm.prank(Alice, Alice); L2.withdraw(address(0), Alice); } @@ -118,9 +103,15 @@ contract TaikoL2Tests is TaikoL2Test { assertEq(L2.getBlockHash(uint64(1000)), 0); } - function _anchor(uint32 parentGasLimit) private { - bytes32 l1Hash = randBytes32(); - bytes32 l1StateRoot = randBytes32(); - L2.anchor(l1Hash, l1StateRoot, 12_345, parentGasLimit); + function _anchorV2(uint32 parentGasUsed) private { + bytes32 anchorStateRoot = randBytes32(); + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }); + L2.anchorV2(++anchorBlockId, anchorStateRoot, parentGasUsed, baseFeeConfig); } } diff --git a/packages/protocol/test/layer2/TaikoL2EIP1559Configurable.sol b/packages/protocol/test/layer2/TaikoL2EIP1559Configurable.sol deleted file mode 100644 index 85c3c8450cd..00000000000 --- a/packages/protocol/test/layer2/TaikoL2EIP1559Configurable.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import "../../contracts/layer2/based/TaikoL2.sol"; - -/// @title TaikoL2EIP1559Configurable -/// @notice TaikoL2 with a setter to change EIP-1559 configurations and states. -/// @custom:security-contact security@taiko.xyz -contract TaikoL2EIP1559Configurable is TaikoL2 { - /// @notice EIP-1559 configuration. - LibL2Config.Config public customConfig; - - uint256[49] private __gap; - - /// @notice Emits when the EIP-1559 configuration and gas excess are changed. - /// @param config The new EIP-1559 config. - /// @param gasExcess The new gas excess. - event ConfigAndExcessChanged(LibL2Config.Config config, uint64 gasExcess); - - error L2_INVALID_CONFIG(); - - /// @notice Sets EIP1559 configuration and gas excess. - /// @param _newConfig The new EIP1559 config. - /// @param _newGasExcess The new gas excess - function setConfigAndExcess( - LibL2Config.Config memory _newConfig, - uint64 _newGasExcess - ) - external - virtual - onlyOwner - { - if (_newConfig.gasTargetPerL1Block == 0) revert L2_INVALID_CONFIG(); - if (_newConfig.basefeeAdjustmentQuotient == 0) revert L2_INVALID_CONFIG(); - - customConfig = _newConfig; - parentGasExcess = _newGasExcess; - - emit ConfigAndExcessChanged(_newConfig, _newGasExcess); - } - - /// @inheritdoc TaikoL2 - function getConfig() public view override returns (LibL2Config.Config memory) { - return customConfig; - } - - function ontakeForkHeight() public pure override returns (uint64) { - return 10_000; - } -} diff --git a/packages/protocol/test/layer2/TaikoL2NoFeeCheck.t.sol b/packages/protocol/test/layer2/TaikoL2NoFeeCheck.t.sol deleted file mode 100644 index f0a76219598..00000000000 --- a/packages/protocol/test/layer2/TaikoL2NoFeeCheck.t.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import "./TaikoL2Test.sol"; - -contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { - function skipFeeCheck() public pure override returns (bool) { - return true; - } -} - -contract TaikoL2NoFeeCheckTests is TaikoL2Test { - using SafeCast for uint256; - - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // same as `block_gas_limit` in foundry.toml - uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; - - address public addressManager; - SkipBasefeeCheckL2 public L2; - - function setUp() public { - addressManager = deployProxy({ - name: "address_manager", - impl: address(new AddressManager()), - data: abi.encodeCall(AddressManager.init, (address(0))) - }); - - SignalService ss = SignalService( - deployProxy({ - name: "signal_service", - impl: address(new SignalService()), - data: abi.encodeCall(SignalService.init, (address(0), addressManager)), - registerTo: addressManager - }) - ); - - uint64 gasExcess = 0; - uint8 quotient = 8; - uint32 gasTarget = 60_000_000; - uint64 l1ChainId = 12_345; - - gasExcess = 195_420_300_100; - L2 = SkipBasefeeCheckL2( - payable( - deployProxy({ - name: "taiko", - impl: address(new SkipBasefeeCheckL2()), - data: abi.encodeCall( - TaikoL2.init, (address(0), addressManager, l1ChainId, gasExcess) - ), - registerTo: addressManager - }) - ) - ); - - L2.setConfigAndExcess(LibL2Config.Config(gasTarget, quotient), gasExcess); - - ss.authorize(address(L2), true); - - vm.roll(block.number + 1); - vm.warp(block.timestamp + 30); - } - - function test_L2_NoFeeCheck_simulation_lower_traffic() external { - console2.log("LOW TRAFFIC STARTS"); // For parser - _simulation(100_000, 10_000_000, 1, 8); - console2.log("LOW TRAFFIC ENDS"); - } - - function test_L2_NoFeeCheck_simulation_higher_traffic() external { - console2.log("HIGH TRAFFIC STARTS"); // For parser - _simulation(100_000, 120_000_000, 1, 8); - console2.log("HIGH TRAFFIC ENDS"); - } - - function test_L2_NoFeeCheck_simulation_target_traffic() external { - console2.log("TARGET TRAFFIC STARTS"); // For parser - _simulation(60_000_000, 0, 12, 0); - console2.log("TARGET TRAFFIC ENDS"); - } - - function _simulation( - uint256 minGas, - uint256 maxDiffToMinGas, - uint8 quickest, - uint8 maxDiffToQuickest - ) - internal - { - // We need to randomize the: - // - parent gas used (We should sometimes exceed 150.000.000 gas / 12 - // seconds (to simulate congestion a bit) !!) - // - the time we fire away an L2 block (anchor transaction). - // The rest is baked in. - // initial gas excess issued: 49954623777 (from eip1559_util.py) if we - // want to stick to the params of 10x Ethereum gas, etc. - - // This variables counts if we reached the 12seconds (L1) height, if so - // then resets the accumulated parent gas used and increments the L1 - // height number - uint8 accumulated_seconds = 0; - uint256 accumulated_parent_gas_per_l1_block = 0; - uint64 l1Height = uint64(block.number); - uint64 l1BlockCounter = 0; - uint64 maxL2BlockCount = 180; - uint256 allBaseFee = 0; - uint256 allGasUsed = 0; - uint256 newRandomWithoutSalt; - // Simulate 200 L2 blocks - for (uint256 i; i < maxL2BlockCount; ++i) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - block.prevrandao, msg.sender, block.timestamp, i, newRandomWithoutSalt, salt - ) - ) - ); - - uint32 currentGasUsed; - if (maxDiffToMinGas == 0) { - currentGasUsed = uint32(minGas); - } else { - currentGasUsed = - uint32(pickRandomNumber(newRandomWithoutSalt, minGas, maxDiffToMinGas)); - } - salt = uint256(keccak256(abi.encodePacked(currentGasUsed, salt))); - accumulated_parent_gas_per_l1_block += currentGasUsed; - allGasUsed += currentGasUsed; - - uint8 currentTimeAhead; - if (maxDiffToQuickest == 0) { - currentTimeAhead = uint8(quickest); - } else { - currentTimeAhead = - uint8(pickRandomNumber(newRandomWithoutSalt, quickest, maxDiffToQuickest)); - } - accumulated_seconds += currentTimeAhead; - - if (accumulated_seconds >= 12) { - console2.log( - "Gas used per L1 block:", l1Height, ":", accumulated_parent_gas_per_l1_block - ); - l1Height++; - l1BlockCounter++; - accumulated_parent_gas_per_l1_block = 0; - accumulated_seconds = 0; - } - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - _anchorSimulation(currentGasUsed, l1Height); - (uint256 currentBaseFee,) = L2.getBasefee(l1Height, currentGasUsed); - allBaseFee += currentBaseFee; - console2.log("Actual gas in L2 block is:", currentGasUsed); - console2.log("L2block to baseFee is:", i, ":", currentBaseFee); - vm.roll(block.number + 1); - - vm.warp(block.timestamp + currentTimeAhead); - } - - console2.log("Average wei gas price per L2 block is:", (allBaseFee / maxL2BlockCount)); - console2.log("Average gasUsed per L1 block:", (allGasUsed / l1BlockCounter)); - } - - function test_L2_NoFeeCheck_L2_AnchorTx_signing(bytes32 digest) external { - (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); - address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); - signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(0)); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(3)); - } - - // Semi-random number generator - function pickRandomNumber( - uint256 randomNum, - uint256 lowerLimit, - uint256 diffBtwLowerAndUpperLimit - ) - internal - view - returns (uint256) - { - randomNum = uint256(keccak256(abi.encodePacked(randomNum, salt))); - return (lowerLimit + (randomNum % diffBtwLowerAndUpperLimit)); - } - - function _anchorSimulation(uint32 parentGasLimit, uint64 l1Height) private { - bytes32 l1Hash = randBytes32(); - bytes32 l1StateRoot = randBytes32(); - L2.anchor(l1Hash, l1StateRoot, l1Height, parentGasLimit); - } -} diff --git a/packages/protocol/test/layer2/TaikoL2Test.sol b/packages/protocol/test/layer2/TaikoL2Test.sol index ad9eeb0e61a..b3fdebf90a4 100644 --- a/packages/protocol/test/layer2/TaikoL2Test.sol +++ b/packages/protocol/test/layer2/TaikoL2Test.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +import "../../contracts/layer2/based/TaikoL2.sol"; import "../../contracts/layer2/DelegateOwner.sol"; -import "../layer2/TaikoL2EIP1559Configurable.sol"; import "../layer2/LibL2Signer.sol"; import "../shared/TaikoTest.sol"; From 44e5184c779cc9ff6f23f8b8fe38a8f3e892403c Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:24:09 +0800 Subject: [PATCH 02/38] fix(protocol): remove "payable" from ProverSet.sol (#18209) --- packages/protocol/contracts/layer1/provers/ProverSet.sol | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol index 88817329a00..d710f635bf6 100644 --- a/packages/protocol/contracts/layer1/provers/ProverSet.sol +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -58,9 +58,6 @@ contract ProverSet is EssentialContract, IERC1271 { IERC20(tkoToken()).approve(taikoL1(), type(uint256).max); } - /// @notice Receives ETH as fees. - receive() external payable { } - function approveAllowance(address _address, uint256 _allowance) external onlyOwner { IERC20(tkoToken()).approve(_address, _allowance); } @@ -89,7 +86,6 @@ contract ProverSet is EssentialContract, IERC1271 { bytes calldata _txList ) external - payable onlyProver { ITaikoL1(taikoL1()).proposeBlockV2(_params, _txList); @@ -101,7 +97,6 @@ contract ProverSet is EssentialContract, IERC1271 { bytes[] calldata _txListArr ) external - payable onlyProver { ITaikoL1(taikoL1()).proposeBlocksV2(_paramsArr, _txListArr); From 1dcc18a78d0b34d711796a05be8c4ffde47da55a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 10 Oct 2024 13:53:58 +0800 Subject: [PATCH 03/38] fix comments --- packages/protocol/contracts/layer1/based/TaikoL1.sol | 2 +- packages/protocol/contracts/shared/bridge/Bridge.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index d32eccb3479..879e5cdb025 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -290,7 +290,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { }); } - /// @dev chain_pauser is supposed to be a cold wallet. + /// @dev chain watchdog is supposed to be a cold wallet. function _authorizePause( address, bool diff --git a/packages/protocol/contracts/shared/bridge/Bridge.sol b/packages/protocol/contracts/shared/bridge/Bridge.sol index d160c5a7436..1f6205e15ce 100644 --- a/packages/protocol/contracts/shared/bridge/Bridge.sol +++ b/packages/protocol/contracts/shared/bridge/Bridge.sol @@ -468,7 +468,7 @@ contract Bridge is EssentialContract, IBridge { /// @dev Considering that the watchdog is a hot wallet, in case its private key is leaked, we /// only allow watchdog to pause the bridge, but does not allow it to unpause the bridge. function _authorizePause(address addr, bool toPause) internal view override { - // Owner and chain_pauser can pause/unpause the bridge. + // Owner and chain watchdog can pause/unpause the bridge. if (addr == owner() || addr == resolve(LibStrings.B_CHAIN_WATCHDOG, true)) return; // bridge_watchdog can pause the bridge, but cannot unpause it. From db376c8401af91a40cd54b9be397fb82fba05747 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 10 Oct 2024 14:26:30 +0800 Subject: [PATCH 04/38] Update ComposeVerifier.sol --- .../contracts/layer1/verifiers/compose/ComposeVerifier.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol index d9d59786a50..75cbff45680 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -78,7 +78,7 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { TaikoData.TierProof calldata _proof ) external - onlyFromNamed(LibStrings.B_TAIKO) + onlyAuthorizedCaller nonReentrant { (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); From 93241d571ed8f7452e9d7284d3b6805dd8b008eb Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Fri, 11 Oct 2024 11:18:33 +0800 Subject: [PATCH 05/38] Merge branch 'main' into ontake_cleanup2 --- .github/workflows/eventindexer.yml | 4 +- .../guardian-prover-health-check.yml | 4 +- .github/workflows/relayer.yml | 4 +- .github/workflows/repo--merge-gatekeeper.yml | 21 - .github/workflows/taiko-client--hive_test.yml | 2 +- .github/workflows/taiko-client--test.yml | 4 +- .release-please-manifest.json | 2 +- Dockerfile | 4 +- go.mod | 189 +-- go.sum | 1176 ++--------------- packages/monitors/defender/mainnet/README.md | 2 +- .../trailblazers-airdrop/ERC20Airdrop.sol | 10 +- .../trailblazers-airdrop/MerkleClaimable.sol | 9 + .../trailblazers-airdrop/hekla.json | 4 +- .../trailblazers-airdrop/mainnet.json | 4 + packages/nfts/package.json | 3 +- .../script/trailblazers-airdrop/Deploy.s.sol | 14 +- .../trailblazers-airdrop/ERC20Airdrop.t.sol | 12 +- packages/protocol/.solhint.json | 1 + .../AutomataDcapV3Attestation.sol | 29 +- .../interfaces/IAttestation.sol | 2 +- .../lib/PEMCertChainLib.sol | 10 +- .../lib/QuoteV3Auth/V3Parser.sol | 8 +- .../contracts/layer1/based/ITaikoL1.sol | 21 +- .../contracts/layer1/based/LibBonds.sol | 4 +- .../contracts/layer1/based/LibProposing.sol | 4 +- .../contracts/layer1/based/LibUtils.sol | 6 +- .../contracts/layer1/based/LibVerifying.sol | 2 +- .../contracts/layer1/based/TaikoData.sol | 2 +- .../contracts/layer1/based/TaikoL1.sol | 11 +- .../layer1/hekla/HeklaTaikoToken.sol | 2 +- .../mainnet/addrcache/RollupAddressCache.sol | 4 +- .../mainnet/addrcache/SharedAddressCache.sol | 4 +- .../mainnet/multirollup/MainnetBridge.sol | 2 +- .../multirollup/MainnetERC1155Vault.sol | 2 +- .../mainnet/multirollup/MainnetERC20Vault.sol | 2 +- .../multirollup/MainnetERC721Vault.sol | 2 +- .../MainnetSharedAddressManager.sol | 4 +- .../multirollup/MainnetSignalService.sol | 2 +- .../mainnet/rollup/MainnetGuardianProver.sol | 2 +- .../mainnet/rollup/MainnetProverSet.sol | 2 +- .../rollup/MainnetRollupAddressManager.sol | 4 +- .../layer1/mainnet/rollup/MainnetTaikoL1.sol | 2 +- .../mainnet/rollup/MainnetTierRouter.sol | 2 +- .../rollup/verifiers/MainnetRisc0Verifier.sol | 6 +- .../rollup/verifiers/MainnetSP1Verifier.sol | 6 +- .../rollup/verifiers/MainnetSgxVerifier.sol | 6 +- .../verifiers/MainnetTeeAnyVerifier.sol | 6 +- .../verifiers/MainnetZkAndTeeVerifier.sol | 6 +- .../rollup/verifiers/MainnetZkAnyVerifier.sol | 6 +- .../layer1/provers/GuardianProver.sol | 4 +- .../contracts/layer1/provers/ProverSet.sol | 6 +- .../layer1/team/airdrop/MerkleClaimable.sol | 2 +- .../layer1/team/tokenunlock/TokenUnlock.sol | 6 +- .../layer1/tiers/TierProviderBase.sol | 2 +- .../contracts/layer1/token/TaikoToken.sol | 2 +- .../layer1/verifiers/Risc0Verifier.sol | 4 +- .../layer1/verifiers/SP1Verifier.sol | 20 +- .../layer1/verifiers/SgxVerifier.sol | 4 +- .../verifiers/compose/ComposeVerifier.sol | 4 +- .../verifiers/compose/TeeAnyVerifier.sol | 2 +- .../verifiers/compose/ZkAndTeeVerifier.sol | 2 +- .../verifiers/compose/ZkAnyVerifier.sol | 2 +- .../contracts/layer2/based/Lib1559Math.sol | 2 +- .../contracts/layer2/based/TaikoL2.sol | 10 +- .../layer2/token/BridgedTaikoToken.sol | 4 +- packages/protocol/foundry.toml | 3 + .../layer1/AddSGXVerifierInstances.s.sol | 4 +- .../script/layer1/DeployERC20Airdrop.s.sol | 4 +- .../script/layer1/DeployLabsProverPool.s.sol | 4 +- .../script/layer1/DeployProtocolOnL1.s.sol | 54 +- .../script/layer1/DeployProverSet.s.sol | 4 +- .../script/layer1/DeployQuotaManager.s.sol | 4 +- .../script/layer1/DeployRisc0Verifier.s.sol | 4 +- .../script/layer1/DeploySP1Verifier.s.sol | 4 +- .../script/layer1/DeployTaikoToken.s.sol | 4 +- .../layer1/SendMessageToDelegateOwner.s.sol | 6 +- .../script/layer1/SetDcapParams.s.sol | 2 +- .../script/layer1/UpgradeHeklaOntakeL1.s.sol | 12 +- .../script/layer1/UpgradeHeklaOntakeL2.s.sol | 12 +- .../script/layer1/tokenunlock/Deploy.s.sol | 4 +- .../script/layer1/tokenunlock/Vest.s.sol | 2 +- .../script/layer2/DeployDelegateOwner.s.sol | 4 +- .../script/layer2/PostGenesisConfig.s.sol | 6 +- .../script/layer2/PostGenesisQuery.s.sol | 6 +- .../shared/AuthorizeTaikoForMultihop.s.sol | 4 +- .../protocol/script/shared/SetAddress.s.sol | 2 +- .../script/shared/SetRemoteBridgeSuites.s.sol | 2 +- .../test/genesis/GenerateGenesis.g.sol | 14 +- packages/protocol/test/layer1/TaikoL1Test.sol | 16 +- .../common/AttestationBase.t.sol | 15 +- .../utils/DcapTestUtils.t.sol | 9 +- .../utils/V3QuoteParseUtils.t.sol | 11 +- .../test/layer1/based/GuardianProver1.t.sol | 4 +- .../test/layer1/based/GuardianProver2.t.sol | 2 +- .../test/layer1/based/TestTierProvider.sol | 8 +- .../layer1/team/tokenunlock/TokenUnlock.t.sol | 4 +- .../verifiers/compose/ComposeVerifeir.t.sol | 4 +- packages/protocol/test/layer2/TaikoL2Test.sol | 9 +- .../protocol/test/shared/DeployCapability.sol | 2 +- .../protocol/test/shared/HelperContracts.sol | 4 +- packages/protocol/test/shared/TaikoTest.sol | 12 +- .../test/shared/common/LibAddress.t.sol | 2 +- .../test/shared/common/LibTrieProof.t.sol | 2 +- .../contracts/blacklist/IMinimalBlacklist.sol | 2 +- packages/taiko-client/CHANGELOG.md | 17 + packages/taiko-client/Dockerfile | 2 +- .../driver/chain_syncer/beaconsync/syncer.go | 12 +- .../driver/chain_syncer/blob/syncer.go | 9 +- .../taiko-client/internal/metrics/metrics.go | 4 +- packages/taiko-client/package.json | 2 +- packages/taiko-client/pkg/jwt/jwt.go | 2 +- packages/taiko-client/pkg/rpc/beaconclient.go | 30 +- .../taiko-client/pkg/rpc/blob_datasource.go | 10 +- .../pkg/rpc/blob_datasource_test.go | 30 - packages/taiko-client/pkg/rpc/methods.go | 13 + packages/taiko-client/pkg/rpc/utils.go | 26 + 117 files changed, 548 insertions(+), 1596 deletions(-) delete mode 100644 .github/workflows/repo--merge-gatekeeper.yml delete mode 100644 packages/taiko-client/pkg/rpc/blob_datasource_test.go diff --git a/.github/workflows/eventindexer.yml b/.github/workflows/eventindexer.yml index 1ff534248cb..30ded6382ab 100644 --- a/.github/workflows/eventindexer.yml +++ b/.github/workflows/eventindexer.yml @@ -22,7 +22,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -50,7 +50,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: ">=1.21.0" + go-version: ">=1.23.0" - name: eventindexer - Unit Tests working-directory: ./packages/eventindexer diff --git a/.github/workflows/guardian-prover-health-check.yml b/.github/workflows/guardian-prover-health-check.yml index e1497f51caa..f0278d76ee6 100644 --- a/.github/workflows/guardian-prover-health-check.yml +++ b/.github/workflows/guardian-prover-health-check.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -44,7 +44,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.0" + go-version: "1.23.0" - name: guardian-prover-health-check - Unit Tests working-directory: ./packages/guardian-prover-health-check diff --git a/.github/workflows/relayer.yml b/.github/workflows/relayer.yml index 976b854ad4f..4509b06db06 100644 --- a/.github/workflows/relayer.yml +++ b/.github/workflows/relayer.yml @@ -22,7 +22,7 @@ jobs: steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -50,7 +50,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.0" + go-version: "1.23.0" - name: relayer - Unit Tests working-directory: ./packages/relayer diff --git a/.github/workflows/repo--merge-gatekeeper.yml b/.github/workflows/repo--merge-gatekeeper.yml deleted file mode 100644 index 08db85e59a6..00000000000 --- a/.github/workflows/repo--merge-gatekeeper.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Merge Gatekeeper - -on: - pull_request: - branches: - - main - merge_group: # Trigger in merge queue to pass the required status check - -jobs: - merge-gatekeeper: - if: github.event_name == 'pull_request' - runs-on: [arc-runner-set] - permissions: - checks: read - statuses: read - steps: - - name: Run Merge Gatekeeper - uses: upsidr/merge-gatekeeper@v1 - with: - timeout: 1200 - token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/taiko-client--hive_test.yml b/.github/workflows/taiko-client--hive_test.yml index ffdc53bbc3d..7445565f852 100644 --- a/.github/workflows/taiko-client--hive_test.yml +++ b/.github/workflows/taiko-client--hive_test.yml @@ -29,7 +29,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true - name: Clone taikoxyz/hive diff --git a/.github/workflows/taiko-client--test.yml b/.github/workflows/taiko-client--test.yml index 3f7aa2aa7fa..698c31c8140 100644 --- a/.github/workflows/taiko-client--test.yml +++ b/.github/workflows/taiko-client--test.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true - name: Install golangci-lint @@ -49,7 +49,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true - name: Install pnpm dependencies diff --git a/.release-please-manifest.json b/.release-please-manifest.json index f38a50665fb..6c1613ada2a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -9,7 +9,7 @@ "packages/relayer": "0.12.0", "packages/snaefell-ui": "1.1.0", "packages/supplementary-contracts": "1.0.0", - "packages/taiko-client": "0.37.0", + "packages/taiko-client": "0.38.0", "packages/taikoon-ui": "1.3.0", "packages/ui-lib": "1.0.0" } diff --git a/Dockerfile b/Dockerfile index a1d52db69d5..e27049140ef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ ARG PACKAGE=eventindexer -FROM golang:1.21.0 as builder +FROM golang:1.23.0 as builder ARG PACKAGE @@ -27,4 +27,4 @@ RUN apk add --no-cache ca-certificates COPY --from=builder /taiko-mono/packages/${PACKAGE}/bin/${PACKAGE} /usr/local/bin/ -ENTRYPOINT /usr/local/bin/${PACKAGE} \ No newline at end of file +ENTRYPOINT /usr/local/bin/${PACKAGE} diff --git a/go.mod b/go.mod index b764d26eb03..4c5ee52f395 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,21 @@ module github.com/taikoxyz/taiko-mono -go 1.21 +go 1.23 require ( - github.com/btcsuite/btcd/btcec/v2 v2.3.3 + github.com/btcsuite/btcd/btcec/v2 v2.3.4 github.com/buildkite/terminal-to-html/v3 v3.8.0 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.3.0 github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841 github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7 - github.com/davecgh/go-spew v1.1.1 + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 github.com/ethereum-optimism/optimism v1.7.4 - github.com/ethereum/go-ethereum v1.13.15 + github.com/ethereum/go-ethereum v1.14.11 github.com/ethereum/hive v0.0.0-20240822135954-91829ccfb2c5 github.com/go-git/go-git/v5 v5.12.0 - github.com/go-resty/resty/v2 v2.7.0 + github.com/go-resty/resty/v2 v2.15.3 github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 @@ -28,16 +28,16 @@ require ( github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 github.com/pkg/errors v0.9.1 github.com/pressly/goose/v3 v3.20.0 - github.com/prometheus/client_golang v1.19.1 - github.com/prysmaticlabs/prysm/v4 v4.2.0 + github.com/prometheus/client_golang v1.20.4 + github.com/prysmaticlabs/prysm/v5 v5.1.0 github.com/rabbitmq/amqp091-go v1.10.0 github.com/shopspring/decimal v1.4.0 github.com/stretchr/testify v1.9.0 github.com/swaggo/swag v1.16.3 github.com/testcontainers/testcontainers-go v0.30.0 - github.com/urfave/cli/v2 v2.27.2 - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 - golang.org/x/sync v0.7.0 + github.com/urfave/cli/v2 v2.27.4 + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa + golang.org/x/sync v0.8.0 gopkg.in/go-playground/assert.v1 v1.2.1 gopkg.in/yaml.v3 v3.0.1 gorm.io/datatypes v1.2.1 @@ -47,66 +47,54 @@ require ( ) require ( - contrib.go.opencensus.io/exporter/jaeger v0.2.1 // indirect dario.cat/mergo v1.0.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/DataDog/zstd v1.5.5 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/andybalholm/brotli v1.1.0 // indirect - github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 // 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/btcd v0.24.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd v0.24.2 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 // indirect + github.com/cockroachdb/pebble v1.1.2 // 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/containerd/cgroups v1.1.0 // indirect github.com/containerd/containerd v1.7.12 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // 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/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 // indirect github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/docker/docker v25.0.6+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/elastic/gosigar v0.14.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fjl/memsize v0.0.2 // indirect - github.com/flynn/noise v1.1.0 // indirect - github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fsouza/go-dockerclient v1.11.0 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-logr/logr v1.4.1 // indirect @@ -121,79 +109,49 @@ require ( github.com/go-playground/validator/v10 v10.13.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 // indirect - github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/uint256 v1.3.1 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.2.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // 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/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect - github.com/koron/go-ssdp v0.0.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.3 // 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.35.0 // indirect - github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-mplex v0.9.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.11.0 // indirect - github.com/libp2p/go-mplex v0.7.0 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-nat v0.2.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.4.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/lithammer/dedent v1.1.0 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mfridman/interpolate v0.0.2 // indirect github.com/microcosm-cc/bluemonday v1.0.26 // indirect - github.com/miekg/dns v1.1.58 // indirect - github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect - github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // 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 @@ -205,60 +163,24 @@ require ( github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/morkid/gocache v1.0.0 // 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.4 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // 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/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/neko-neko/echo-logrus/v2 v2.0.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opencontainers/runtime-spec v1.2.0 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pion/datachannel v1.5.6 // indirect - github.com/pion/dtls/v2 v2.2.11 // indirect - github.com/pion/ice/v2 v2.3.24 // indirect - github.com/pion/interceptor v0.1.29 // indirect - github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns v0.0.12 // indirect - github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.14 // indirect - github.com/pion/rtp v1.8.6 // indirect - github.com/pion/sctp v1.8.16 // indirect - github.com/pion/sdp/v3 v3.0.9 // indirect - github.com/pion/srtp/v2 v2.0.18 // indirect - github.com/pion/stun v0.6.1 // indirect - github.com/pion/transport/v2 v2.2.5 // indirect - github.com/pion/turn/v2 v2.1.6 // indirect - github.com/pion/webrtc/v3 v3.2.40 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.13.0 // indirect - github.com/prometheus/prom2json v1.3.0 // indirect - github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect - github.com/prysmaticlabs/gohashtree v0.0.3-alpha // indirect - github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/quic-go v0.44.0 // indirect - github.com/quic-go/webtransport-go v0.8.0 // indirect - github.com/raulk/go-watchdog v1.3.0 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prysmaticlabs/fastssz v0.0.0-20240620202422-a981b8ef89d3 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect + github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/schollz/progressbar/v3 v3.3.4 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -266,60 +188,47 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.10.0 // indirect github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.44.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/wealdtech/go-bytesutil v1.1.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.21.1 // indirect - go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/term v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/api v0.44.0 // indirect - google.golang.org/appengine v1.6.8 // indirect + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect + golang.org/x/text v0.18.0 // indirect + golang.org/x/time v0.6.0 // indirect + golang.org/x/tools v0.24.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.34.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/apimachinery v0.26.2 // indirect k8s.io/client-go v0.26.2 // indirect k8s.io/klog/v2 v2.90.1 // indirect k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect - lukechampine.com/blake3 v1.2.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect @@ -332,9 +241,9 @@ exclude ( github.com/ethereum/go-ethereum v1.14.7 ) -replace github.com/ethereum/go-ethereum v1.13.15 => github.com/taikoxyz/taiko-geth v1.5.1-0.20240808041410-882a6cd3294c +replace github.com/ethereum/go-ethereum v1.14.11 => github.com/taikoxyz/taiko-geth v1.8.1-0.20241003040603-5c84a2082747 -replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20240627102435-4845247ff00c +replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 replace github.com/uber/jaeger-client-go => github.com/uber/jaeger-client-go v2.25.0+incompatible diff --git a/go.sum b/go.sum index e8cb234f0c8..9ddee77dab9 100644 --- a/go.sum +++ b/go.sum @@ -1,68 +1,19 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.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.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -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/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/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/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/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= contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= -github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= @@ -70,26 +21,13 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= -github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -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/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= @@ -97,50 +35,27 @@ github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= -github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= -github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 h1:XJH0YfVFKbq782tlNThzN/Ud5qm/cx6LXOA/P6RkTxc= -github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96/go.mod h1:QZe5Yh80Hp1b6JxQdpfSEEe8X7hTyTEZSosSrFf/oJE= -github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= 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/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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 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/speakeasy v0.1.0/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/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.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.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 v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= 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.3 h1:6+iXlDKE8RMtKsvK0gshlXIuPbyWM/h84Ensb7o3sC0= -github.com/btcsuite/btcd/btcec/v2 v2.3.3/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/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.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= @@ -158,11 +73,9 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buildkite/terminal-to-html/v3 v3.8.0 h1:S7ImMS8W+2yS/9D4ugrXzB95C4AuNaKcaw/eR/95bFU= github.com/buildkite/terminal-to-html/v3 v3.8.0/go.mod h1:j3XxsnYElte/Bo7Pft+U5eQWWbcx3j51uQ8fo43VrjM= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -170,9 +83,6 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/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.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -180,58 +90,41 @@ github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpR 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/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= 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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 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/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= 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/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= 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/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= 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/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/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/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -245,10 +138,9 @@ github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= 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/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= @@ -258,65 +150,37 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 h1:cNcG4c2n5xanQzp2hMyxDxPYVQmZ91y4WN6fJFlndLo= -github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018/go.mod h1:MIonLggsKgZLUSt414ExgwNtlOL5MuEoAJP514mwGe8= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.6+incompatible h1:5cPwbwriIcsua2REJe8HqQV+6WlWc1byg2QSXzBxBGg= +github.com/docker/docker v25.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= 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/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/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46 h1:paQKR+EGmEwr9viJoSgC0gOW4YPBRvrD5tPKn6CNRD8= github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46/go.mod h1:H5dh/7x2Mf5SR7cKLXDZLWRMtolNhvb3uKR1Gy3aF60= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/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/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= -github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -324,18 +188,12 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= 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/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -346,15 +204,6 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= -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.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -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-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= @@ -387,29 +236,16 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.4.0/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= +github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -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/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -424,29 +260,13 @@ github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EO github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -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/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= 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.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= @@ -456,120 +276,51 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= -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/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= 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.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/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.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/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -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/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-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= -github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -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.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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.3.1/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/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -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/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= 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/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -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/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk= @@ -578,23 +329,15 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w 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.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -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/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -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-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= 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-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= @@ -607,10 +350,6 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= 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= @@ -618,60 +357,30 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.1/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/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 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/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.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.12/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/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/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= -github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= -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.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.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.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -692,109 +401,46 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA= github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -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.35.0 h1:1xS1Bkr9X7GtdvV6ntLnDV9xB1kNjHK1lZ0eaO6gnhc= -github.com/libp2p/go-libp2p v0.35.0/go.mod h1:snyJQix4ET6Tj+LeI0VPjjxTtdWpeOhYt5lEY0KirkQ= -github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= -github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= -github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= -github.com/libp2p/go-libp2p-pubsub v0.11.0 h1:+JvS8Kty0OiyUiN0i8H5JbaCgjnJTRnTHe4rU88dLFc= -github.com/libp2p/go-libp2p-pubsub v0.11.0/go.mod h1:QEb+hEV9WL9wCiUAnpY29FZR6W3zK8qYlaml8R4q6gQ= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= -github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= -github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= -github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= -github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 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.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 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-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= github.com/microsoft/go-mssqldb v1.7.0 h1:sgMPW0HA6Ihd37Yx0MzHyKD726C2kY/8KJsQtXHNaAs= github.com/microsoft/go-mssqldb v1.7.0/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= 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/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= 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/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/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= @@ -814,8 +460,6 @@ github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3 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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= @@ -826,48 +470,10 @@ github.com/morkid/gocache v1.0.0 h1:hTnU78Dqp2vs9al5vJC2TmmMF+Hm3nDH1AgRBjSXE+0= github.com/morkid/gocache v1.0.0/go.mod h1:xK+hmoEMjYffIBvjn7DE8WfSd/rF5Kz/G9f20OliMJY= github.com/morkid/paginate v1.1.7 h1:qgU1qLhYxlckJ11CoUn7tQpT4k5SmWTTa1NpdSNbShg= github.com/morkid/paginate v1.1.7/go.mod h1:1VCx2ARlAVEv2Yd+YHTGRMs0Gacvi75dCrPidrmPq5g= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -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.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= -github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= -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.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -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.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -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/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/neko-neko/echo-logrus/v2 v2.0.1 h1:BX2U6uv2N3UiUY75y+SntQak5S1AJIel9j+5Y6h4Nb4= github.com/neko-neko/echo-logrus/v2 v2.0.1/go.mod h1:GDYWo9CY4VXk/vn5ac5reoutYEkZEexlFI01MzHXVG0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -875,211 +481,79 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 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.10.1/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/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= 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.0/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/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= -github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= -github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pion/datachannel v1.5.6 h1:1IxKJntfSlYkpUj8LlYRSWpYiTTC02nUrOE8T3DqGeg= -github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNIVb/NfGW4= -github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= -github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= -github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= -github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= -github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= -github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= -github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= -github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= -github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= -github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= -github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= -github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= -github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/rtp v1.8.6 h1:MTmn/b0aWWsAzux2AmP8WGllusBVw4NPYPVFFd7jUPw= -github.com/pion/rtp v1.8.6/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/sctp v1.8.13/go.mod h1:YKSgO/bO/6aOMP9LCie1DuD7m+GamiK2yIiPM6vH+GA= -github.com/pion/sctp v1.8.16 h1:PKrMs+o9EMLRvFfXq59WFsC+V8mN1wnKzqrv+3D/gYY= -github.com/pion/sctp v1.8.16/go.mod h1:P6PbDVA++OJMrVNg2AL3XtYHV4uD6dvfyOovCgMs0PE= -github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= -github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= -github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= -github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= -github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= -github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= -github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= -github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= -github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v2 v2.2.5 h1:iyi25i/21gQck4hfRhomF6SktmUQjRsRW4WJdhfc3Kc= -github.com/pion/transport/v2 v2.2.5/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= -github.com/pion/transport/v3 v3.0.2 h1:r+40RJR25S9w3jbA6/5uEPTzcdn7ncyU44RWCbHkLg4= -github.com/pion/transport/v3 v3.0.2/go.mod h1:nIToODoOlb5If2jF9y2Igfx3PFYWfuXi37m0IlWa/D0= -github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= -github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/webrtc/v3 v3.2.40 h1:Wtfi6AZMQg+624cvCXUuSmrKWepSB7zfgYDOYqsSOVU= -github.com/pion/webrtc/v3 v3.2.40/go.mod h1:M1RAe3TNTD1tzyvqHrbVODfwdPGSXOUo/OgpoGGJqFY= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.20.0 h1:uPJdOxF/Ipj7ABVNOAMJXSxwFXZGwMGHNqjC8e61VA0= github.com/pressly/goose/v3 v3.20.0/go.mod h1:BRfF2GcG4FTG12QfdBVy3q1yveaf4ckL9vWwEcIO3lA= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.1/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.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -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.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/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.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= -github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= -github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y= -github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= -github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY= -github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= -github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= -github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prysmaticlabs/fastssz v0.0.0-20240620202422-a981b8ef89d3 h1:0LZAwwHnsZFfXm4IK4rzFV4N5IVSKZKLmuBMA4kAlFk= +github.com/prysmaticlabs/fastssz v0.0.0-20240620202422-a981b8ef89d3/go.mod h1:h2OlIZD/M6wFvV3YMZbW16lFgh3Rsye00G44J2cwLyU= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e h1:ATgOe+abbzfx9kCPeXIW4fiWyDdxlwHw07j8UGhdTd4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b h1:VK7thFOnhxAZ/5aolr5Os4beiubuD08WiuiHyRqgwks= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b/go.mod h1:HRuvtXLZ4WkaB1MItToVH2e8ZwKwZPY5/Rcby+CvvLY= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= -github.com/prysmaticlabs/prysm/v4 v4.2.0 h1:87QoRT3Azs7c1Y6SnIq0+CNtQRbAt0sVKGj2OxRT1Rw= -github.com/prysmaticlabs/prysm/v4 v4.2.0/go.mod h1:PQrQtHJeeqTz4K3udN/EX1Gs2xhWR4j93gSj0OQZ1f4= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= -github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= -github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= -github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= +github.com/prysmaticlabs/prysm/v5 v5.1.0 h1:TY9A6tm0v7bI1z9YH+xkDh7XH7qm4ZK8sTeyckxbj4A= +github.com/prysmaticlabs/prysm/v5 v5.1.0/go.mod h1:SWb5kE/FhtQrLS2yt+IDj+leB7IhXrcOv6lhDnU1nBY= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= -github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= @@ -1094,59 +568,17 @@ github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.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/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -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.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.1/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/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/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1164,7 +596,6 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F 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.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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= @@ -1177,34 +608,26 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082 h1:ymZR+Y88LOnA8i3KeuJXK7hff2n7bpMIhONPJwpcA5w= github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082/go.mod h1:RHnIu3EFehrWX3JhFAMQSXD5uz7l0xaNroTzXrap7EQ= -github.com/taikoxyz/optimism v0.0.0-20240627102435-4845247ff00c h1:Hfhh/icxShwpLdX7RqYzZN1EU40MGWhvSXc2V+ZzTxw= -github.com/taikoxyz/optimism v0.0.0-20240627102435-4845247ff00c/go.mod h1:jKn73pLX8eDIG0Y3XeuUSetepecM8OvRflyPHbi05B4= -github.com/taikoxyz/taiko-geth v1.5.1-0.20240808041410-882a6cd3294c h1:XQDnwQfisAlFAGKqabDcLdg9B+pRwS3nxS+03yP1g9o= -github.com/taikoxyz/taiko-geth v1.5.1-0.20240808041410-882a6cd3294c/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= -github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= +github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 h1:JssMxaDmORjQ9RPZNulVJhAD8zSPd6LZFq5wsr6Nwz8= +github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39/go.mod h1:ym7scR7ZHvEmwx1DLGVDzFlAdR+uhP1+Z4XCiFuSD5s= +github.com/taikoxyz/taiko-geth v1.8.1-0.20241003040603-5c84a2082747 h1:QRB8VHGmlRgm7ze/4Fzuce08Ypbq5Mr5q/piTfsck1A= +github.com/taikoxyz/taiko-geth v1.8.1-0.20241003040603-5c84a2082747/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= github.com/testcontainers/testcontainers-go v0.30.0 h1:jmn/XS22q4YRrcMwWg0pAwlClzs/abopbsBzrepyc4E= github.com/testcontainers/testcontainers-go v0.30.0/go.mod h1:K+kHNGiM5zjklKjgTtcrEetF3uhWbMUyqAQoyoh8Pf0= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= -github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -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/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= -github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= 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/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= -github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= +github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= +github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= 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/valyala/fasthttp v1.22.0/go.mod h1:0mw2RjXGOzxf4NL2jni3gUQ7LfjjUSiG5sskOUUSEpU= @@ -1217,42 +640,15 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/wealdtech/go-bytesutil v1.1.1 h1:ocEg3Ke2GkZ4vQw5lp46rmO+pfqCCTgq35gqOy8JKVc= -github.com/wealdtech/go-bytesutil v1.1.1/go.mod h1:jENeMqeTEU8FNZyDFRVc7KqBdRKSnJ9CCh26TcuNb9s= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= -github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= -github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= 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/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -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/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= @@ -1271,159 +667,57 @@ go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.21.1 h1:RqBh3cYdzZS0uqwVeEjOX2p73dddLpym315myy/Bpb0= -go.uber.org/fx v1.21.1/go.mod h1:HT2M7d7RHo+ebKGh9NRcrsrHHfpZ60nW3QRubMRfv48= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= 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.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= 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-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190130090550-b01c7a725664/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-20190313024323-a1f597ede03a/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-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-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= 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-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -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-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= 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/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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/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-20181201002055-351d144fa1fc/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-20190125091013-d26f9f9a57f3/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-20190313220215-9f648a60d977/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-20190813141303-74dc4d7220e7/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-20210226101413-39120d07d75e/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-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/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= @@ -1432,128 +726,51 @@ golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/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-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.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-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/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-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/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-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-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-20191220142924-d4481acd189f/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-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/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-20200219091948-cb0a6d8edb6c/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-20200602225109-6fdc65e7d980/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-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-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/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-20210303074136-134d130e1a04/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-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/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-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-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= @@ -1566,243 +783,70 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= 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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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.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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.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-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190328211700-ab21143f2384/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-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-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-20200103221440-774c71fcf114/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-20200221224223-e1da425f72fd/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-20201224043029-2b0845dc783e/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.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -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.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -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-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -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-20200218151345-dad8c97a84f5/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-20200331122359-1ee6d9798940/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-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-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/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.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.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1813,55 +857,39 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi 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.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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-20200227125254-8fa46927fb4f/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.25/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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -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/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= 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/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -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.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= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/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.2.1 h1:r+g0bk4LPCW2v4+Ls7aeNgGme7JYdNDQ2VtvlNUfBh0= @@ -1884,15 +912,8 @@ gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= @@ -1905,8 +926,6 @@ k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+O k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= @@ -1921,18 +940,11 @@ modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -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/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/packages/monitors/defender/mainnet/README.md b/packages/monitors/defender/mainnet/README.md index ab913793c2c..b0c8dcde464 100644 --- a/packages/monitors/defender/mainnet/README.md +++ b/packages/monitors/defender/mainnet/README.md @@ -208,7 +208,7 @@ You can use `sls invoke --function ` to manually run an actio > Each command has a standard output to a JSON object. -More information can be found on our documentation page [here](https://docs.openzeppelin.com/defender/serverless-plugin.html) +More information can be found on our documentation page [here](https://docs.openzeppelin.com/defender/dac) ## Caveats diff --git a/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol b/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol index 831abfad59a..0f25d27945e 100644 --- a/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol +++ b/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol @@ -24,8 +24,8 @@ contract ERC20Airdrop is MerkleClaimable, ReentrancyGuardUpgradeable, PausableUp /// @notice Event emitted when the blacklist is updated. event BlacklistUpdated(address _blacklist); - /// @notice Errors + /// @notice Errors error ADDRESS_BLACKLISTED(); uint256[48] private __gap; @@ -94,6 +94,14 @@ contract ERC20Airdrop is MerkleClaimable, ReentrancyGuardUpgradeable, PausableUp _token.transfer(owner(), _token.balanceOf(address(this))); } + /// @notice Update blacklist contract + /// @param _blacklist The new blacklist contract address + /// @dev Only the owner can execute this function + function updateBlacklist(address _blacklist) external onlyOwner { + blacklist = IMinimalBlacklist(_blacklist); + emit BlacklistUpdated(_blacklist); + } + /// @notice Internal method to authorize an upgrade function _authorizeUpgrade(address) internal virtual override onlyOwner { } } diff --git a/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol b/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol index 3396bf998c0..149bb99493e 100644 --- a/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol +++ b/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol @@ -133,6 +133,15 @@ abstract contract MerkleClaimable is emit ConfigChanged(_claimStart, _claimEnd, _merkleRoot); } + /// @notice Check if a claim has been made + /// @param user Address of the user + /// @param amount Amount of tokens claimed + /// @return Whether the claim has been made + function hasClaimed(address user, uint256 amount) external view returns (bool) { + bytes32 hash = keccak256(abi.encode("CLAIM_TAIKO_AIRDROP", (abi.encode(user, amount)))); + return isClaimed[hash]; + } + /// @notice Internal method to authorize an upgrade function _authorizeUpgrade(address) internal virtual override onlyOwner { } } diff --git a/packages/nfts/deployments/trailblazers-airdrop/hekla.json b/packages/nfts/deployments/trailblazers-airdrop/hekla.json index b0417106a8b..5c8dd9aabf2 100644 --- a/packages/nfts/deployments/trailblazers-airdrop/hekla.json +++ b/packages/nfts/deployments/trailblazers-airdrop/hekla.json @@ -1,4 +1,4 @@ { - "ERC20Airdrop": "0x42DB7bE491a8933FaADbca4891dA2632D45e5CfC", - "MerkleRoot": "0xea5b2299e76b4860965e9059388d021145269c96b816b07a808ff391cd80753e" + "ERC20Airdrop": "0xdeC2662Dff4eAB8b94B5257D637204d18D95cb74", + "MerkleRoot": "0xbe8ec647626f95185f551887b3eee43ea9e8965c7baf558a9f8cb22b020597f0" } diff --git a/packages/nfts/deployments/trailblazers-airdrop/mainnet.json b/packages/nfts/deployments/trailblazers-airdrop/mainnet.json index e69de29bb2d..289f920f46b 100644 --- a/packages/nfts/deployments/trailblazers-airdrop/mainnet.json +++ b/packages/nfts/deployments/trailblazers-airdrop/mainnet.json @@ -0,0 +1,4 @@ +{ + "ERC20Airdrop": "0x290265ACd21816EE414E64eEC77dd490d8dd9f51", + "MerkleRoot": "0xc7f7e6bb3d1bb31b0ef5e2e34383c12ec9ef8a301ffde9771bd9de7554c70b1d" +} diff --git a/packages/nfts/package.json b/packages/nfts/package.json index e0feeef6245..20e26b85176 100644 --- a/packages/nfts/package.json +++ b/packages/nfts/package.json @@ -34,7 +34,8 @@ "kbw:upgradeV2:mainnet": "forge clean && pnpm compile && forge script script/party-ticket/sol/UpgradeV2.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast", "pfp:deploy:hekla": "forge clean && pnpm compile && forge script script/profile/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", "pfp:deploy:mainnet": "forge clean && pnpm compile && forge script script/profile/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 200", - "tbz:airdrop:hekla": "forge clean && pnpm compile && forge script script/trailblazers-airdrop/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200" + "tbz:airdrop:hekla": "forge clean && pnpm compile && forge script script/trailblazers-airdrop/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz:airdrop:mainnet": "forge clean && pnpm compile && forge script script/trailblazers-airdrop/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100" }, "devDependencies": { "@types/node": "^20.11.30", diff --git a/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol b/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol index 663ef57e3df..f291a8c3deb 100644 --- a/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol +++ b/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol @@ -19,22 +19,21 @@ contract DeployScript is Script { address public deployerAddress; // only used for production - IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); + IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); ERC20Airdrop public airdrop; uint256 constant TOTAL_AVAILABLE_FUNDS = 1000 ether; - uint256 constant CLAIM_AMOUNT = 10 ether; - // hekla test root - bytes32 public merkleRoot = 0xea5b2299e76b4860965e9059388d021145269c96b816b07a808ff391cd80753e; + bytes32 public merkleRoot = 0xbe8ec647626f95185f551887b3eee43ea9e8965c7baf558a9f8cb22b020597f0; // rewards token - ERC20Upgradeable public erc20; + ERC20Upgradeable public erc20 = ERC20Upgradeable(0xA9d23408b9bA935c230493c40C73824Df71A0975); ERC20Mock public mockERC20; // start and end times for the claim - uint64 constant CLAIM_DURATION = 1 days; - uint64 public CLAIM_START = uint64(block.timestamp); + uint64 constant CLAIM_DURATION = 30 days; + // uint64 public CLAIM_START = uint64(block.timestamp); + uint64 public CLAIM_START = 1_728_683_700; // 2024-06-10 23:55:00 UTC uint64 public CLAIM_END = CLAIM_START + CLAIM_DURATION; function setUp() public { @@ -81,6 +80,7 @@ contract DeployScript is Script { if (block.chainid != 167_000) { mockERC20.mint(address(airdrop), TOTAL_AVAILABLE_FUNDS); } + console.log("ERC20 Token:", address(erc20)); console.log("Deployed ERC20Airdrop to:", address(airdrop)); diff --git a/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol b/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol index e2dbaeb4d8b..e255f3074a4 100644 --- a/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol +++ b/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol @@ -75,7 +75,8 @@ contract ERC20AirdropTest is Test { airdrop = ERC20Airdrop(proxy); // fund the airdrop contract - erc20.mint(address(airdrop), TOTAL_AVAILABLE_FUNDS); + erc20.mint(owner, TOTAL_AVAILABLE_FUNDS); + erc20.transfer(address(airdrop), TOTAL_AVAILABLE_FUNDS); vm.stopBroadcast(); } @@ -138,4 +139,13 @@ contract ERC20AirdropTest is Test { vm.expectRevert(); airdrop.claim(user, CLAIM_AMOUNT, proof); } + + function test_transferOwnership() public { + assertEq(airdrop.owner(), owner); + vm.prank(owner); + airdrop.transferOwnership(minters[0]); + vm.prank(minters[0]); + airdrop.acceptOwnership(); + assertEq(airdrop.owner(), minters[0]); + } } diff --git a/packages/protocol/.solhint.json b/packages/protocol/.solhint.json index ee0c7f96812..add6256b711 100644 --- a/packages/protocol/.solhint.json +++ b/packages/protocol/.solhint.json @@ -13,6 +13,7 @@ "no-global-import": "off", "no-inline-assembly": "off", "not-rely-on-time": "off", + "gas-custom-errors": "off", "one-contract-per-file": "off" } } diff --git a/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol b/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol index aec2b13ccc3..4b019c4723c 100644 --- a/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol @@ -1,23 +1,18 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { V3Struct } from "./lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from "./lib/QuoteV3Auth/V3Parser.sol"; -import { IPEMCertChainLib } from "./lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from "./lib/PEMCertChainLib.sol"; -import { TCBInfoStruct } from "./lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from "./lib/EnclaveIdStruct.sol"; -import { IAttestation } from "./interfaces/IAttestation.sol"; - -// Internal Libraries -import { Base64 } from "solady/src/utils/Base64.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; -import { BytesUtils } from "./utils/BytesUtils.sol"; - -// External Libraries -import { ISigVerifyLib } from "./interfaces/ISigVerifyLib.sol"; - -import { EssentialContract } from "../../shared/common/EssentialContract.sol"; +import "solady/src/utils/Base64.sol"; +import "solady/src/utils/LibString.sol"; +import "src/shared/common/EssentialContract.sol"; +import "./lib/QuoteV3Auth/V3Struct.sol"; +import "./lib/QuoteV3Auth/V3Parser.sol"; +import "./lib/interfaces/IPEMCertChainLib.sol"; +import "./lib/PEMCertChainLib.sol"; +import "./lib/TCBInfoStruct.sol"; +import "./lib/EnclaveIdStruct.sol"; +import "./interfaces/IAttestation.sol"; +import "./utils/BytesUtils.sol"; +import "./interfaces/ISigVerifyLib.sol"; /// @title AutomataDcapV3Attestation /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol b/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol index e5a960a4af8..8059b9216b3 100644 --- a/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { V3Struct } from "../lib/QuoteV3Auth/V3Struct.sol"; +import "../lib/QuoteV3Auth/V3Struct.sol"; /// @title IAttestation /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol index 0fcc99f0a39..768861942e0 100644 --- a/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { LibString } from "solady/src/utils/LibString.sol"; -import { Asn1Decode, NodePtr } from "../utils/Asn1Decode.sol"; -import { BytesUtils } from "../utils/BytesUtils.sol"; -import { X509DateUtils } from "../utils/X509DateUtils.sol"; -import { IPEMCertChainLib } from "./interfaces/IPEMCertChainLib.sol"; +import "solady/src/utils/LibString.sol"; +import "../utils/Asn1Decode.sol"; +import "../utils/BytesUtils.sol"; +import "../utils/X509DateUtils.sol"; +import "./interfaces/IPEMCertChainLib.sol"; /// @title PEMCertChainLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol index 59e95ef1f40..773c07d551c 100644 --- a/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol @@ -1,10 +1,10 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { Base64 } from "solady/src/utils/Base64.sol"; -import { BytesUtils } from "../../utils/BytesUtils.sol"; -import { IPEMCertChainLib, PEMCertChainLib } from "../../lib/PEMCertChainLib.sol"; -import { V3Struct } from "./V3Struct.sol"; +import "solady/src/utils/Base64.sol"; +import "../../utils/BytesUtils.sol"; +import "../../lib/PEMCertChainLib.sol"; +import "./V3Struct.sol"; /// @title V3Parser /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol index 5f9d8b70c74..91119d4787a 100644 --- a/packages/protocol/contracts/layer1/based/ITaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -56,8 +56,25 @@ interface ITaikoL1 { /// @param _pause True to pause, false to unpause. function pauseProving(bool _pause) external; - /// @notice Deposits Taiko tokens to be used as bonds. - /// @param _amount Amount of Taiko tokens to deposit. + /// @notice Gets the details of a block. + /// @param _blockId Index of the block. + /// @return blk_ The block. + function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_); + + /// @notice Gets the state transition for a specific block. + /// @param _blockId Index of the block. + /// @param _tid The transition id. + /// @return The state transition data of the block. + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + returns (TaikoData.TransitionState memory); + + /// @notice Deposits Taiko token to be used as bonds. + /// @param _amount The amount of Taiko token to deposit. function depositBond(uint256 _amount) external; /// @notice Withdraws Taiko tokens. diff --git a/packages/protocol/contracts/layer1/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol index c47874d62c5..6916e169344 100644 --- a/packages/protocol/contracts/layer1/based/LibBonds.sol +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "../../shared/common/IAddressResolver.sol"; -import "../../shared/common/LibStrings.sol"; +import "src/shared/common/IAddressResolver.sol"; +import "src/shared/common/LibStrings.sol"; import "./TaikoData.sol"; /// @title LibBonds diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index 2a9c5cc95b4..fa47944c1d6 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/common/LibAddress.sol"; -import "../../shared/common/LibNetwork.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibNetwork.sol"; import "./LibBonds.sol"; import "./LibData.sol"; import "./LibUtils.sol"; diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 320a5edad09..47211e45d61 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "../../shared/common/IAddressResolver.sol"; -import "../../shared/common/LibStrings.sol"; -import "../../shared/common/LibMath.sol"; +import "src/shared/common/IAddressResolver.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibMath.sol"; import "../tiers/ITierProvider.sol"; import "../tiers/ITierRouter.sol"; import "./TaikoData.sol"; diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 323a01991d3..9b318c06cc2 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/signal/ISignalService.sol"; +import "src/shared/signal/ISignalService.sol"; import "./LibBonds.sol"; import "./LibUtils.sol"; diff --git a/packages/protocol/contracts/layer1/based/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol index 10ac2d11c5d..bd6748ca07f 100644 --- a/packages/protocol/contracts/layer1/based/TaikoData.sol +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/data/LibSharedData.sol"; +import "src/shared/data/LibSharedData.sol"; /// @title TaikoData /// @notice This library defines various data structures used in the Taiko protocol. diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 879e5cdb025..655d022de5d 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/common/EssentialContract.sol"; +import "src/shared/common/EssentialContract.sol"; import "./LibData.sol"; import "./LibProposing.sol"; import "./LibProving.sol"; @@ -168,9 +168,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { blk_ = LibData.blockV2toV1(blk); } - /// @notice Gets the details of a block. - /// @param _blockId Index of the block. - /// @return blk_ The block. + /// @inheritdoc ITaikoL1 function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_) { (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); } @@ -207,10 +205,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { return LibUtils.getTransitions(state, getConfig(), _blockIds, _parentHashes); } - /// @notice Gets the state transition for a specific block. - /// @param _blockId Index of the block. - /// @param _tid The transition id. - /// @return The state transition data of the block. + /// @inheritdoc ITaikoL1 function getTransition( uint64 _blockId, uint32 _tid diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol b/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol index 0b175f2d493..b7eb6590bb7 100644 --- a/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol +++ b/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; -import "../../shared/common/EssentialContract.sol"; +import "src/shared/common/EssentialContract.sol"; /// @title HeklaTaikoToken /// @notice Taiko token for Taiko Hekla testnet. diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol index ad0a567f6e6..4936556e01f 100644 --- a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/LibStrings.sol"; -import "../../../shared/common/LibNetwork.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibNetwork.sol"; import "./AddressCache.sol"; /// @title RollupAddressCache diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol index 57dd9f6e4b8..ee2e6b68676 100644 --- a/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/LibStrings.sol"; -import "../../../shared/common/LibNetwork.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibNetwork.sol"; import "./AddressCache.sol"; /// @title SharedAddressCache diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol index f737e2903c8..bc7877c5660 100644 --- a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/bridge/Bridge.sol"; +import "src/shared/bridge/Bridge.sol"; import "../addrcache/SharedAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol index 2fe0eec1e7b..e44b1efb69c 100644 --- a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/tokenvault/ERC1155Vault.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; import "../addrcache/SharedAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol index e9688517710..605b40932b5 100644 --- a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; import "../addrcache/SharedAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol index 416bc813194..f4ab9bec3a3 100644 --- a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/tokenvault/ERC721Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; import "../addrcache/SharedAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol index a0d26ff9d83..9a2c3cfa3f8 100644 --- a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/AddressManager.sol"; -import "../../../shared/common/LibStrings.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/common/LibStrings.sol"; import "../addrcache/SharedAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol index 2d10595702b..b5958753f14 100644 --- a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/signal/SignalService.sol"; +import "src/shared/signal/SignalService.sol"; import "../addrcache/SharedAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol index 0fa50684a8c..baf50487d03 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../layer1/provers/GuardianProver.sol"; +import "src/layer1/provers/GuardianProver.sol"; import "../addrcache/RollupAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; /// @title MainnetGuardianProver diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol index b6c06184c02..27c0de89bf2 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../provers/ProverSet.sol"; +import "src/layer1/provers/ProverSet.sol"; import "../addrcache/RollupAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol index 1a09738d144..74728ba20a5 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/AddressManager.sol"; -import "../../../shared/common/LibStrings.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/common/LibStrings.sol"; import "../addrcache/RollupAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol index b321592fffc..1ca0b14089a 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../based/TaikoL1.sol"; +import "src/layer1/based/TaikoL1.sol"; import "../addrcache/RollupAddressCache.sol"; import "../reentrylock/LibFasterReentryLock.sol"; diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol index f5ec759520b..2c9a8966106 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../tiers/ITierRouter.sol"; +import "src/layer1/tiers/ITierRouter.sol"; /// @title MainnetTierRouter /// @dev Labeled in AddressResolver as "tier_router" diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol index 480e6912140..538831547d3 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../verifiers/Risc0Verifier.sol"; -import "../../addrcache/RollupAddressCache.sol"; -import "../../reentrylock/LibFasterReentryLock.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; /// @title MainnetRisc0Verifier /// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol index e9cc9230a1b..2954d8dc3b7 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../verifiers/SP1Verifier.sol"; -import "../../addrcache/RollupAddressCache.sol"; -import "../../reentrylock/LibFasterReentryLock.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; /// @title MainnetSP1Verifier /// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol index c4583e58c96..4d57e8a596e 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../verifiers/SgxVerifier.sol"; -import "../../addrcache/RollupAddressCache.sol"; -import "../../reentrylock/LibFasterReentryLock.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; /// @title MainnetSgxVerifier /// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol index 28599c0a5d3..48e69932402 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../verifiers/compose/TeeAnyVerifier.sol"; -import "../../addrcache/RollupAddressCache.sol"; -import "../../reentrylock/LibFasterReentryLock.sol"; +import "src/layer1/verifiers/compose/TeeAnyVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; /// @title MainnetTeeAnyVerifier /// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol index 67e58d8af1e..609789ba250 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../verifiers/compose/ZkAndTeeVerifier.sol"; -import "../../addrcache/RollupAddressCache.sol"; -import "../../reentrylock/LibFasterReentryLock.sol"; +import "src/layer1/verifiers/compose/ZkAndTeeVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; /// @title MainnetZkAndTeeVerifier /// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol index 8ac59cd0378..bbb107268d8 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../verifiers/compose/ZkAnyVerifier.sol"; -import "../../addrcache/RollupAddressCache.sol"; -import "../../reentrylock/LibFasterReentryLock.sol"; +import "src/layer1/verifiers/compose/ZkAnyVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; /// @title MainnetZkAnyVerifier /// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko diff --git a/packages/protocol/contracts/layer1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol index 75deeb3a913..753a1f47648 100644 --- a/packages/protocol/contracts/layer1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/layer1/provers/GuardianProver.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "../../shared/common/EssentialContract.sol"; -import "../../shared/common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../verifiers/IVerifier.sol"; import "../based/ITaikoL1.sol"; diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol index d710f635bf6..e7ea82ee562 100644 --- a/packages/protocol/contracts/layer1/provers/ProverSet.sol +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -5,9 +5,9 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpg import "@openzeppelin/contracts/interfaces/IERC1271.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "../../shared/common/EssentialContract.sol"; -import "../../shared/common/LibStrings.sol"; -import "../../shared/common/LibAddress.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibAddress.sol"; import "../based/ITaikoL1.sol"; interface IHasRecipient { diff --git a/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol b/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol index f3c945446aa..38eba9238f2 100644 --- a/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol +++ b/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; -import "../../../shared/common/EssentialContract.sol"; +import "src/shared/common/EssentialContract.sol"; /// @title MerkleClaimable /// @notice Contract for managing Taiko token airdrop for eligible users diff --git a/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol b/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol index a951d647c1c..7dce22a5b95 100644 --- a/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol +++ b/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol @@ -6,9 +6,9 @@ import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../../../shared/common/EssentialContract.sol"; -import "../../../shared/common/LibStrings.sol"; -import "../../../shared/common/LibMath.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibMath.sol"; import "../../provers/ProverSet.sol"; /// @title TokenUnlock diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol index 110ccaad734..08817679016 100644 --- a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/common/LibStrings.sol"; +import "src/shared/common/LibStrings.sol"; import "./ITierProvider.sol"; import "./LibTiers.sol"; diff --git a/packages/protocol/contracts/layer1/token/TaikoToken.sol b/packages/protocol/contracts/layer1/token/TaikoToken.sol index 3804f7714d5..94a126138f2 100644 --- a/packages/protocol/contracts/layer1/token/TaikoToken.sol +++ b/packages/protocol/contracts/layer1/token/TaikoToken.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/token/TaikoTokenBase.sol"; +import "src/shared/token/TaikoTokenBase.sol"; /// @title TaikoToken /// @notice The TaikoToken (TKO), in the protocol is used for prover collateral diff --git a/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol index b157b6afc6e..68a93df3ecd 100644 --- a/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.24; import "@risc0/contracts/IRiscZeroVerifier.sol"; -import "../../shared/common/EssentialContract.sol"; -import "../../shared/common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../based/ITaikoL1.sol"; import "./LibPublicInput.sol"; import "./IVerifier.sol"; diff --git a/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol b/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol index c9f9e2aca8b..cd3e62af336 100644 --- a/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.24; import "@sp1-contracts/src/ISP1Verifier.sol"; -import "../../shared/common/EssentialContract.sol"; -import "../../shared/common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../based/ITaikoL1.sol"; import "./LibPublicInput.sol"; import "./IVerifier.sol"; @@ -84,21 +84,21 @@ contract SP1Verifier is EssentialContract, IVerifier { { require(_ctxs.length != 0 && _proof.data.length > 64, SP1_INVALID_PARAMS()); // Extract the necessary data - bytes32 aggregation_program = bytes32(_proof.data[0:32]); - bytes32 block_proving_program = bytes32(_proof.data[32:64]); + bytes32 aggregationProgram = bytes32(_proof.data[0:32]); + bytes32 blockProvingProgram = bytes32(_proof.data[32:64]); // Check if the aggregation program is trusted - require(isProgramTrusted[aggregation_program], SP1_INVALID_AGGREGATION_VKEY()); + require(isProgramTrusted[aggregationProgram], SP1_INVALID_AGGREGATION_VKEY()); // Check if the block proving program is trusted - require(isProgramTrusted[block_proving_program], SP1_INVALID_PROGRAM_VKEY()); + require(isProgramTrusted[blockProvingProgram], SP1_INVALID_PROGRAM_VKEY()); // Collect public inputs - bytes32[] memory public_inputs = new bytes32[](_ctxs.length + 1); + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 1); // First public input is the block proving program key - public_inputs[0] = block_proving_program; + publicInputs[0] = blockProvingProgram; // All other inputs are the block program public inputs (a single 32 byte value) for (uint256 i; i < _ctxs.length; ++i) { - public_inputs[i + 1] = LibPublicInput.hashPublicInputs( + publicInputs[i + 1] = LibPublicInput.hashPublicInputs( _ctxs[i].tran, address(this), address(0), @@ -112,7 +112,7 @@ contract SP1Verifier is EssentialContract, IVerifier { (bool success,) = sp1RemoteVerifier().staticcall( abi.encodeCall( ISP1Verifier.verifyProof, - (aggregation_program, abi.encodePacked(public_inputs), _proof.data[64:]) + (aggregationProgram, abi.encodePacked(publicInputs), _proof.data[64:]) ) ); diff --git a/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol index d903abf9757..4583f79cc99 100644 --- a/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../../shared/common/EssentialContract.sol"; -import "../../shared/common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../automata-attestation/interfaces/IAttestation.sol"; import "../automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; import "../based/ITaikoL1.sol"; diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol index 75cbff45680..345d354cbd2 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/EssentialContract.sol"; -import "../../../shared/common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../IVerifier.sol"; /// @title ComposeVerifier diff --git a/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol index 97eaac7e29a..5b22fa94c2e 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/LibStrings.sol"; +import "src/shared/common/LibStrings.sol"; import "./ComposeVerifier.sol"; /// @title TeeAnyVerifier diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol index 51a22785e3c..58293f60c06 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/LibStrings.sol"; +import "src/shared/common/LibStrings.sol"; import "./ComposeVerifier.sol"; /// @title ZkAndTeeVerifier diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol index 261e4d2c2e0..2dd0e5f6a04 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/common/LibStrings.sol"; +import "src/shared/common/LibStrings.sol"; import "./ComposeVerifier.sol"; /// @title ZkAnyVerifier diff --git a/packages/protocol/contracts/layer2/based/Lib1559Math.sol b/packages/protocol/contracts/layer2/based/Lib1559Math.sol index c0e0116b1e2..44f91ff2484 100644 --- a/packages/protocol/contracts/layer2/based/Lib1559Math.sol +++ b/packages/protocol/contracts/layer2/based/Lib1559Math.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import "@solady/src/utils/FixedPointMathLib.sol"; -import "../../shared/common/LibMath.sol"; +import "src/shared/common/LibMath.sol"; /// @title Lib1559Math /// @notice Implements e^(x) based bonding curve for EIP-1559 diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol index e734e47593f..663f46e073d 100644 --- a/packages/protocol/contracts/layer2/based/TaikoL2.sol +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -4,11 +4,11 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "../../shared/data/LibSharedData.sol"; -import "../../shared/common/EssentialContract.sol"; -import "../../shared/common/LibStrings.sol"; -import "../../shared/common/LibAddress.sol"; -import "../../shared/signal/ISignalService.sol"; +import "src/shared/data/LibSharedData.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/signal/ISignalService.sol"; import "./Lib1559Math.sol"; import "./LibL2Config.sol"; import "./IBlockHash.sol"; diff --git a/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol b/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol index e900bbdb151..0fa1d8a7d23 100644 --- a/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol +++ b/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../shared/tokenvault/IBridgedERC20.sol"; -import "../../shared/token/TaikoTokenBase.sol"; +import "src/shared/tokenvault/IBridgedERC20.sol"; +import "src/shared/token/TaikoTokenBase.sol"; /// @title BridgedTaikoToken /// @notice The TaikoToken on L2 to support checkpoints and voting. For testnets, we do not need to diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 144650ef190..7012fe4b58d 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -19,6 +19,9 @@ remappings = [ "forge-std/=node_modules/forge-std/", "ds-test/=node_modules/ds-test/src/", "@p256-verifier/contracts/=node_modules/p256-verifier/src/", + "src/=contracts/", + "test/=test/", + "script/=script/" ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. diff --git a/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol b/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol index 92800f94f64..13179a4cbd8 100644 --- a/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol +++ b/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/verifiers/SgxVerifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; contract AddSGXVerifierInstances is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol b/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol index 939fdfffa38..c726ca9b0dd 100644 --- a/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol +++ b/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/team/airdrop/ERC20Airdrop.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/team/airdrop/ERC20Airdrop.sol"; // @KorbinianK , @2manslkh // As written also in the tests the workflow shall be the following (checklist): diff --git a/packages/protocol/script/layer1/DeployLabsProverPool.s.sol b/packages/protocol/script/layer1/DeployLabsProverPool.s.sol index 887bd135b43..a109d51c68d 100644 --- a/packages/protocol/script/layer1/DeployLabsProverPool.s.sol +++ b/packages/protocol/script/layer1/DeployLabsProverPool.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/provers/ProverSet.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/provers/ProverSet.sol"; contract DeployLabsProverPool is DeployCapability { address public addressManager = 0x579f40D0BE111b823962043702cabe6Aaa290780; diff --git a/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol b/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol index bc67bd99689..c50953405e8 100644 --- a/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol +++ b/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol @@ -11,33 +11,33 @@ import { SP1Verifier as SP1Verifier200rc } from "@sp1-contracts/src/v2.0.0/SP1Ve // - https://github.com/rdubois-crypto/FreshCryptoLib import "@p256-verifier/contracts/P256Verifier.sol"; -import "../../contracts/shared/common/LibStrings.sol"; -import "../../contracts/shared/tokenvault/BridgedERC1155.sol"; -import "../../contracts/shared/tokenvault/BridgedERC20.sol"; -import "../../contracts/shared/tokenvault/BridgedERC721.sol"; -import "../../contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; -import "../../contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol"; -import "../../contracts/layer1/automata-attestation/utils/SigVerifyLib.sol"; -import "../../contracts/layer1/devnet/DevnetTaikoL1.sol"; -import "../../contracts/layer1/devnet/DevnetTierProvider.sol"; -import "../../contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol"; -import "../../contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol"; -import "../../contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol"; -import "../../contracts/layer1/mainnet/multirollup/MainnetBridge.sol"; -import "../../contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol"; -import "../../contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol"; -import "../../contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol"; -import "../../contracts/layer1/mainnet/multirollup/MainnetSignalService.sol"; -import "../../contracts/layer1/provers/GuardianProver.sol"; -import "../../contracts/layer1/provers/ProverSet.sol"; -import "../../contracts/layer1/tiers/TierProviderV2.sol"; -import "../../contracts/layer1/token/TaikoToken.sol"; -import "../../contracts/layer1/verifiers/Risc0Verifier.sol"; -import "../../contracts/layer1/verifiers/SP1Verifier.sol"; -import "../../test/layer1/based/TestTierProvider.sol"; -import "../../test/shared/token/FreeMintERC20.sol"; -import "../../test/shared/token/MayFailFreeMintERC20.sol"; -import "../../test/shared/DeployCapability.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/tokenvault/BridgedERC1155.sol"; +import "src/shared/tokenvault/BridgedERC20.sol"; +import "src/shared/tokenvault/BridgedERC721.sol"; +import "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import "src/layer1/devnet/DevnetTaikoL1.sol"; +import "src/layer1/devnet/DevnetTierProvider.sol"; +import "src/layer1/mainnet/rollup/MainnetGuardianProver.sol"; +import "src/layer1/mainnet/rollup/MainnetTaikoL1.sol"; +import "src/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol"; +import "src/layer1/mainnet/multirollup/MainnetBridge.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC1155Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC20Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC721Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetSignalService.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "src/layer1/tiers/TierProviderV2.sol"; +import "src/layer1/token/TaikoToken.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "test/layer1/based/TestTierProvider.sol"; +import "test/shared/token/FreeMintERC20.sol"; +import "test/shared/token/MayFailFreeMintERC20.sol"; +import "test/shared/DeployCapability.sol"; /// @title DeployProtocolOnL1 /// @notice This script deploys the core Taiko protocol smart contract on L1, diff --git a/packages/protocol/script/layer1/DeployProverSet.s.sol b/packages/protocol/script/layer1/DeployProverSet.s.sol index eb874c2ba70..924b1d5e590 100644 --- a/packages/protocol/script/layer1/DeployProverSet.s.sol +++ b/packages/protocol/script/layer1/DeployProverSet.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../contracts/layer1/provers/ProverSet.sol"; -import "../../test/shared/DeployCapability.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "test/shared/DeployCapability.sol"; contract DeployProverSet is DeployCapability { modifier broadcast() { diff --git a/packages/protocol/script/layer1/DeployQuotaManager.s.sol b/packages/protocol/script/layer1/DeployQuotaManager.s.sol index d3d2f8122ae..77d7d1fefcc 100644 --- a/packages/protocol/script/layer1/DeployQuotaManager.s.sol +++ b/packages/protocol/script/layer1/DeployQuotaManager.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/shared/bridge/QuotaManager.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/bridge/QuotaManager.sol"; contract DeployQuotaManager is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol b/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol index 76dc325a720..353a5557f33 100644 --- a/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol +++ b/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.24; import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/verifiers/Risc0Verifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; contract DeployRisc0Verifier is DeployCapability { uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/DeploySP1Verifier.s.sol b/packages/protocol/script/layer1/DeploySP1Verifier.s.sol index 9e56421e6f9..bc504254a34 100644 --- a/packages/protocol/script/layer1/DeploySP1Verifier.s.sol +++ b/packages/protocol/script/layer1/DeploySP1Verifier.s.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.24; import { SP1Verifier as SP1Verifier200rc } from "@sp1-contracts/src/v2.0.0/SP1VerifierPlonk.sol"; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/verifiers/SP1Verifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; contract DeploySP1Verifier is DeployCapability { uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/DeployTaikoToken.s.sol b/packages/protocol/script/layer1/DeployTaikoToken.s.sol index fafcebd8cc9..9684aea4870 100644 --- a/packages/protocol/script/layer1/DeployTaikoToken.s.sol +++ b/packages/protocol/script/layer1/DeployTaikoToken.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/token/TaikoToken.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/token/TaikoToken.sol"; contract DeployTaikoToken is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol b/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol index f202a1bd864..c5989001fee 100644 --- a/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol +++ b/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; -import "../../contracts/shared/bridge/IBridge.sol"; -import "../../contracts/layer2/DelegateOwner.sol"; -import "../../test/shared/thirdparty/Multicall3.sol"; +import "src/shared/bridge/IBridge.sol"; +import "src/layer2/DelegateOwner.sol"; +import "test/shared/thirdparty/Multicall3.sol"; contract SendMessageToDelegateOwner is Script { address public delegateOwner = 0x5995941Df88F30Ac140515AA39832db963E2f863; diff --git a/packages/protocol/script/layer1/SetDcapParams.s.sol b/packages/protocol/script/layer1/SetDcapParams.s.sol index 411c322e522..9a38c703ce0 100644 --- a/packages/protocol/script/layer1/SetDcapParams.s.sol +++ b/packages/protocol/script/layer1/SetDcapParams.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../../test/layer1/automata-attestation/common/AttestationBase.t.sol"; +import "test/layer1/automata-attestation/common/AttestationBase.t.sol"; contract SetDcapParams is Script, AttestationBase { uint256 public ownerPrivateKey = vm.envUint("PRIVATE_KEY"); // Owner of the attestation contract diff --git a/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol b/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol index 657c2a48c42..4dc0498eeda 100644 --- a/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol +++ b/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer1/hekla/HeklaTaikoL1.sol"; -import "../../contracts/shared/bridge/Bridge.sol"; -import "../../contracts/shared/common/AddressManager.sol"; -import "../../contracts/layer1/provers/ProverSet.sol"; -import "../../contracts/layer1/provers/GuardianProver.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/hekla/HeklaTaikoL1.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "src/layer1/provers/GuardianProver.sol"; contract UpgradeHeklaOntakeL1 is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol b/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol index 030bf7d8216..0c665b0fb9f 100644 --- a/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol +++ b/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer2/hekla/HeklaTaikoL2.sol"; -import "../../contracts/shared/bridge/Bridge.sol"; -import "../../contracts/shared/common/AddressManager.sol"; -import "../../test/shared/thirdparty/Multicall3.sol"; -import "../../contracts/layer2/DelegateOwner.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer2/hekla/HeklaTaikoL2.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "test/shared/thirdparty/Multicall3.sol"; +import "src/layer2/DelegateOwner.sol"; contract UpgradeHeklaOntakeL2 is DeployCapability { address public delegateOwner = 0x95F6077C7786a58FA070D98043b16DF2B1593D2b; diff --git a/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol b/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol index 2b13bec09dc..c94fc0fe490 100644 --- a/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol +++ b/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../test/shared/DeployCapability.sol"; -import "../../../contracts/layer1/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; +import "test/shared/DeployCapability.sol"; contract DeployTokenUnlock is DeployCapability { using stdJson for string; diff --git a/packages/protocol/script/layer1/tokenunlock/Vest.s.sol b/packages/protocol/script/layer1/tokenunlock/Vest.s.sol index 9b7a7285a01..1f421602d33 100644 --- a/packages/protocol/script/layer1/tokenunlock/Vest.s.sol +++ b/packages/protocol/script/layer1/tokenunlock/Vest.s.sol @@ -5,7 +5,7 @@ import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "../../../contracts/layer1/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; contract VestTokenUnlock is Script { using stdJson for string; diff --git a/packages/protocol/script/layer2/DeployDelegateOwner.s.sol b/packages/protocol/script/layer2/DeployDelegateOwner.s.sol index ad07e0970b4..79da323364c 100644 --- a/packages/protocol/script/layer2/DeployDelegateOwner.s.sol +++ b/packages/protocol/script/layer2/DeployDelegateOwner.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/layer2/DelegateOwner.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer2/DelegateOwner.sol"; // forge script --rpc-url https://rpc.mainnet.taiko.xyz script/DeployDelegateOwner.s.sol contract DeployDelegateOwner is DeployCapability { diff --git a/packages/protocol/script/layer2/PostGenesisConfig.s.sol b/packages/protocol/script/layer2/PostGenesisConfig.s.sol index 1c59866f9fd..28254de3ef7 100644 --- a/packages/protocol/script/layer2/PostGenesisConfig.s.sol +++ b/packages/protocol/script/layer2/PostGenesisConfig.s.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../../contracts/shared/tokenvault/ERC20Vault.sol"; -import "../../contracts/shared/bridge/Bridge.sol"; -import "../../contracts/shared/common/AddressManager.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; interface USDCProxy { function configureMinter(address minter, uint256 minterAllowedAmount) external; diff --git a/packages/protocol/script/layer2/PostGenesisQuery.s.sol b/packages/protocol/script/layer2/PostGenesisQuery.s.sol index 7c8882f9edc..906e0961dff 100644 --- a/packages/protocol/script/layer2/PostGenesisQuery.s.sol +++ b/packages/protocol/script/layer2/PostGenesisQuery.s.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/shared/common/AddressManager.sol"; -import "../../contracts/shared/bridge/Bridge.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/bridge/Bridge.sol"; // Run with: // forge script --rpc-url https://rpc.mainnet.taiko.xyz script/PostGenesisQuery.s.sol diff --git a/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol b/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol index db7b01f4274..ffb76b79516 100644 --- a/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol +++ b/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; -import "../../contracts/shared/signal/SignalService.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/signal/SignalService.sol"; contract AuthorizeTaikoForMultihop is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/shared/SetAddress.s.sol b/packages/protocol/script/shared/SetAddress.s.sol index 422b061f49f..701fc32d9aa 100644 --- a/packages/protocol/script/shared/SetAddress.s.sol +++ b/packages/protocol/script/shared/SetAddress.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../../contracts/shared/common/AddressManager.sol"; +import "src/shared/common/AddressManager.sol"; contract SetAddress is Script { uint256 public adminPrivateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol b/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol index 5240e503602..91734516a9d 100644 --- a/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol +++ b/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../test/shared/DeployCapability.sol"; +import "test/shared/DeployCapability.sol"; contract SetRemoteBridgeSuites is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/test/genesis/GenerateGenesis.g.sol b/packages/protocol/test/genesis/GenerateGenesis.g.sol index 4140409b79d..78da0cd79fc 100644 --- a/packages/protocol/test/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test/genesis/GenerateGenesis.g.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.24; import "forge-std/src/console2.sol"; import "forge-std/src/StdJson.sol"; import "forge-std/src/Test.sol"; -import "../../contracts/shared/common/AddressManager.sol"; -import "../../contracts/shared/bridge/Bridge.sol"; -import "../../contracts/shared/tokenvault/ERC1155Vault.sol"; -import "../../contracts/shared/tokenvault/ERC20Vault.sol"; -import "../../contracts/shared/tokenvault/ERC721Vault.sol"; -import "../../contracts/shared/signal/SignalService.sol"; -import "../../contracts/layer2/based/TaikoL2.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; +import "src/shared/signal/SignalService.sol"; +import "src/layer2/based/TaikoL2.sol"; import "../shared/token/RegularERC20.sol"; contract TestGenerateGenesis is Test, AddressResolver { diff --git a/packages/protocol/test/layer1/TaikoL1Test.sol b/packages/protocol/test/layer1/TaikoL1Test.sol index d83f508cf0e..5f660fee478 100644 --- a/packages/protocol/test/layer1/TaikoL1Test.sol +++ b/packages/protocol/test/layer1/TaikoL1Test.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../contracts/layer1/based/TaikoL1.sol"; -import "../../contracts/layer1/token/TaikoToken.sol"; -import "../../contracts/layer1/verifiers/SgxVerifier.sol"; -import "../../contracts/layer1/verifiers/SP1Verifier.sol"; -import "../../contracts/layer1/verifiers/Risc0Verifier.sol"; -import "../../contracts/layer1/provers/GuardianProver.sol"; -import "../../contracts/layer1/team/airdrop/ERC20Airdrop.sol"; -import "../../contracts/shared/bridge/QuotaManager.sol"; +import "src/layer1/based/TaikoL1.sol"; +import "src/layer1/token/TaikoToken.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/team/airdrop/ERC20Airdrop.sol"; +import "src/shared/bridge/QuotaManager.sol"; import "../layer1/based/TestTierProvider.sol"; import "../shared/TaikoTest.sol"; diff --git a/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol index f517f7bb06a..cd641b3c919 100644 --- a/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol @@ -9,16 +9,13 @@ import "@optimism/packages/contracts-bedrock/src/libraries/Bytes.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { P256Verifier } from "@p256-verifier/contracts/P256Verifier.sol"; -import "../../../../contracts/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; import { AutomataDcapV3Attestation } from - "../../../../contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; -import { SigVerifyLib } from - "../../../../contracts/layer1/automata-attestation/utils/SigVerifyLib.sol"; -import { PEMCertChainLib } from - "../../../../contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol"; -import { V3Struct } from - "../../../../contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { BytesUtils } from "../../../../contracts/layer1/automata-attestation/utils/BytesUtils.sol"; + "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import { SigVerifyLib } from "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import { PEMCertChainLib } from "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import { V3Struct } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import { BytesUtils } from "src/layer1/automata-attestation/utils/BytesUtils.sol"; import { Base64 } from "solady/src/utils/Base64.sol"; import "../utils/DcapTestUtils.t.sol"; import "../utils/V3QuoteParseUtils.t.sol"; diff --git a/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol index 7ffcf221617..c4afdd57283 100644 --- a/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol @@ -1,12 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { TCBInfoStruct } from - "../../../../contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from - "../../../../contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol"; -import { V3Struct } from - "../../../../contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import { TCBInfoStruct } from "src/layer1/automata-attestation/lib/TCBInfoStruct.sol"; +import { EnclaveIdStruct } from "src/layer1/automata-attestation/lib/EnclaveIdStruct.sol"; +import { V3Struct } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; import { LibString } from "solady/src/utils/LibString.sol"; diff --git a/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol index f27862eef7b..ed09df809c6 100644 --- a/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol @@ -1,14 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { V3Struct } from - "../../../../contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from - "../../../../contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; +import { V3Struct } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import { V3Parser } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; import { IPEMCertChainLib } from - "../../../../contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from - "../../../../contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol"; + "src/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; +import { PEMCertChainLib } from "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; import { Base64 } from "solady/src/utils/Base64.sol"; import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; import { LibString } from "solady/src/utils/LibString.sol"; diff --git a/packages/protocol/test/layer1/based/GuardianProver1.t.sol b/packages/protocol/test/layer1/based/GuardianProver1.t.sol index 3f8a7705e22..0400cafd3eb 100644 --- a/packages/protocol/test/layer1/based/GuardianProver1.t.sol +++ b/packages/protocol/test/layer1/based/GuardianProver1.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../contracts/layer1/provers/GuardianProver.sol"; -import "../../shared/TaikoTest.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "test/shared/TaikoTest.sol"; contract DummyGuardianProver is GuardianProver { uint256 public operationId; diff --git a/packages/protocol/test/layer1/based/GuardianProver2.t.sol b/packages/protocol/test/layer1/based/GuardianProver2.t.sol index 3fe8ee23cd3..2cc6df5a115 100644 --- a/packages/protocol/test/layer1/based/GuardianProver2.t.sol +++ b/packages/protocol/test/layer1/based/GuardianProver2.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../contracts/layer1/provers/GuardianProver.sol"; +import "src/layer1/provers/GuardianProver.sol"; import "./TaikoL1TestBase.sol"; /// @author Kirk Baird diff --git a/packages/protocol/test/layer1/based/TestTierProvider.sol b/packages/protocol/test/layer1/based/TestTierProvider.sol index b2ac61e4786..549591bcc56 100644 --- a/packages/protocol/test/layer1/based/TestTierProvider.sol +++ b/packages/protocol/test/layer1/based/TestTierProvider.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../contracts/shared/common/LibStrings.sol"; -import "../../../contracts/layer1/tiers/ITierProvider.sol"; -import "../../../contracts/layer1/tiers/LibTiers.sol"; -import "../../../contracts/layer1/tiers/ITierRouter.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/layer1/tiers/ITierProvider.sol"; +import "src/layer1/tiers/LibTiers.sol"; +import "src/layer1/tiers/ITierRouter.sol"; /// @title TestTierProvider /// @dev Labeled in AddressResolver as "tier_router" diff --git a/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol b/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol index d0d22b9a1e0..be96bb0a957 100644 --- a/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol +++ b/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; -import "../../../shared/TaikoTest.sol"; -import "../../../../contracts/layer1/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; +import "test/shared/TaikoTest.sol"; contract MyERC20 is ERC20, ERC20Votes { constructor(address owner) ERC20("Taiko Token", "TKO") ERC20Permit("Taiko Token") { diff --git a/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol b/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol index d6e6ff554ba..6a738475495 100644 --- a/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol +++ b/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../shared/TaikoTest.sol"; -import "../../../../contracts/layer1/verifiers/compose/ComposeVerifier.sol"; +import "src/layer1/verifiers/compose/ComposeVerifier.sol"; +import "test/shared/TaikoTest.sol"; contract ComposeVerifierForTest is ComposeVerifier { uint256 private threshold; diff --git a/packages/protocol/test/layer2/TaikoL2Test.sol b/packages/protocol/test/layer2/TaikoL2Test.sol index b3fdebf90a4..1e6fff16376 100644 --- a/packages/protocol/test/layer2/TaikoL2Test.sol +++ b/packages/protocol/test/layer2/TaikoL2Test.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../contracts/layer2/based/TaikoL2.sol"; -import "../../contracts/layer2/DelegateOwner.sol"; -import "../layer2/LibL2Signer.sol"; -import "../shared/TaikoTest.sol"; +import "src/layer2/DelegateOwner.sol"; +import "src/layer2/based/Lib1559Math.sol"; +import "src/layer2/based/TaikoL2.sol"; +import "test/layer2/LibL2Signer.sol"; +import "test/shared/TaikoTest.sol"; abstract contract TaikoL2Test is TaikoTest { } diff --git a/packages/protocol/test/shared/DeployCapability.sol b/packages/protocol/test/shared/DeployCapability.sol index aa54d9e0774..fd2a8681bcd 100644 --- a/packages/protocol/test/shared/DeployCapability.sol +++ b/packages/protocol/test/shared/DeployCapability.sol @@ -8,7 +8,7 @@ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "forge-std/src/console2.sol"; import "forge-std/src/Script.sol"; -import "../../contracts/shared/common/AddressManager.sol"; +import "src/shared/common/AddressManager.sol"; /// @title DeployCapability abstract contract DeployCapability is Script { diff --git a/packages/protocol/test/shared/HelperContracts.sol b/packages/protocol/test/shared/HelperContracts.sol index 15b4444dffb..769b7a5fed0 100644 --- a/packages/protocol/test/shared/HelperContracts.sol +++ b/packages/protocol/test/shared/HelperContracts.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../contracts/shared/bridge/Bridge.sol"; -import "../../contracts/shared/signal/SignalService.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/signal/SignalService.sol"; contract BadReceiver { receive() external payable { diff --git a/packages/protocol/test/shared/TaikoTest.sol b/packages/protocol/test/shared/TaikoTest.sol index ce24659cd01..a71bb75ae8f 100644 --- a/packages/protocol/test/shared/TaikoTest.sol +++ b/packages/protocol/test/shared/TaikoTest.sol @@ -6,12 +6,12 @@ import "forge-std/src/Test.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "../../contracts/shared/tokenvault/BridgedERC20V2.sol"; -import "../../contracts/shared/tokenvault/BridgedERC721.sol"; -import "../../contracts/shared/tokenvault/BridgedERC1155.sol"; -import "../../contracts/shared/tokenvault/ERC20Vault.sol"; -import "../../contracts/shared/tokenvault/ERC721Vault.sol"; -import "../../contracts/shared/tokenvault/ERC1155Vault.sol"; +import "src/shared/tokenvault/BridgedERC20V2.sol"; +import "src/shared/tokenvault/BridgedERC721.sol"; +import "src/shared/tokenvault/BridgedERC1155.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; import "./token/FreeMintERC20.sol"; import "./token/RegularERC20.sol"; import "./token/MayFailFreeMintERC20.sol"; diff --git a/packages/protocol/test/shared/common/LibAddress.t.sol b/packages/protocol/test/shared/common/LibAddress.t.sol index ce6b29a5eac..b575c56e171 100644 --- a/packages/protocol/test/shared/common/LibAddress.t.sol +++ b/packages/protocol/test/shared/common/LibAddress.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import "../TaikoTest.sol"; -import "../../../contracts/shared/common/LibAddress.sol"; +import "src/shared/common/LibAddress.sol"; contract CalldataReceiver { // Returns success diff --git a/packages/protocol/test/shared/common/LibTrieProof.t.sol b/packages/protocol/test/shared/common/LibTrieProof.t.sol index 42f2820d86f..08f5d59c309 100644 --- a/packages/protocol/test/shared/common/LibTrieProof.t.sol +++ b/packages/protocol/test/shared/common/LibTrieProof.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "../../../contracts/shared/common/LibTrieProof.sol"; +import "src/shared/common/LibTrieProof.sol"; import "../TaikoTest.sol"; contract TestLibTrieProof is TaikoTest { diff --git a/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol b/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol index cd70fd7879a..25f1c089aef 100644 --- a/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol +++ b/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title Minimal Blacklist Interface interface IMinimalBlacklist { diff --git a/packages/taiko-client/CHANGELOG.md b/packages/taiko-client/CHANGELOG.md index 226ffba0c87..43d81ace672 100644 --- a/packages/taiko-client/CHANGELOG.md +++ b/packages/taiko-client/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [0.38.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.37.0...taiko-client-v0.38.0) (2024-10-09) + + +### Features + +* **taiko-client:** add `proposer_pool_content_fetch_time` metric ([#18190](https://github.com/taikoxyz/taiko-mono/issues/18190)) ([35579df](https://github.com/taikoxyz/taiko-mono/commit/35579dfa938562969da2395492f4472c300574dd)) + + +### Chores + +* **taiko-client:** bump dependencies ([#18202](https://github.com/taikoxyz/taiko-mono/issues/18202)) ([219a7e8](https://github.com/taikoxyz/taiko-mono/commit/219a7e87c09c7e4ac8d545c65c77a29e6f818701)) + + +### Tests + +* **taiko-client:** remove an unnecessary test ([#18218](https://github.com/taikoxyz/taiko-mono/issues/18218)) ([d624e29](https://github.com/taikoxyz/taiko-mono/commit/d624e29ce1c0ae9ef6704d96516d632600213e13)) + ## [0.37.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.36.0...taiko-client-v0.37.0) (2024-09-28) diff --git a/packages/taiko-client/Dockerfile b/packages/taiko-client/Dockerfile index 45004845b22..a697627cfe5 100644 --- a/packages/taiko-client/Dockerfile +++ b/packages/taiko-client/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine as builder +FROM golang:1.23-alpine as builder RUN apk update && apk add --no-cache --update gcc musl-dev linux-headers git make build-base diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go b/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go index 3290cd7f00e..cc2c65a5150 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go @@ -5,13 +5,12 @@ import ( "fmt" "math/big" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/log" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" @@ -72,10 +71,15 @@ func (s *Syncer) TriggerBeaconSync(blockID uint64) error { return fmt.Errorf("unexpected NewPayload response status: %s", status.Status) } + lastVerifiedBlockHash, err := s.rpc.GetLastVerifiedBlockHash(s.ctx) + if err != nil { + return fmt.Errorf("failed to fetch the last verified block hash: %w", err) + } + fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(s.ctx, &engine.ForkchoiceStateV1{ HeadBlockHash: headPayload.BlockHash, - SafeBlockHash: headPayload.BlockHash, - FinalizedBlockHash: headPayload.BlockHash, + SafeBlockHash: lastVerifiedBlockHash, + FinalizedBlockHash: lastVerifiedBlockHash, }, nil) if err != nil { return err diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer.go b/packages/taiko-client/driver/chain_syncer/blob/syncer.go index 47f2d997a15..c850bb52ad7 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer.go @@ -409,10 +409,15 @@ func (s *Syncer) insertNewHead( return nil, fmt.Errorf("failed to create execution payloads: %w", err) } + lastVerifiedBlockHash, err := s.rpc.GetLastVerifiedBlockHash(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch the last verified block hash: %w", err) + } + fc := &engine.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, - SafeBlockHash: payload.BlockHash, - FinalizedBlockHash: payload.BlockHash, + SafeBlockHash: lastVerifiedBlockHash, + FinalizedBlockHash: lastVerifiedBlockHash, } // Update the fork choice diff --git a/packages/taiko-client/internal/metrics/metrics.go b/packages/taiko-client/internal/metrics/metrics.go index 44de2709188..6ac55f11865 100644 --- a/packages/taiko-client/internal/metrics/metrics.go +++ b/packages/taiko-client/internal/metrics/metrics.go @@ -4,13 +4,13 @@ import ( "context" opMetrics "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum-optimism/optimism/op-service/opio" txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum/log" "github.com/prometheus/client_golang/prometheus" "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // Metrics @@ -92,7 +92,7 @@ func Serve(ctx context.Context, c *cli.Context) error { } }() - opio.BlockOnInterruptsContext(ctx) + rpc.BlockOnInterruptsContext(ctx) return nil } diff --git a/packages/taiko-client/package.json b/packages/taiko-client/package.json index d2c11412a32..8a029b201d3 100644 --- a/packages/taiko-client/package.json +++ b/packages/taiko-client/package.json @@ -1,5 +1,5 @@ { "name": "taiko-client", - "version": "0.37.0", + "version": "0.38.0", "private": true } diff --git a/packages/taiko-client/pkg/jwt/jwt.go b/packages/taiko-client/pkg/jwt/jwt.go index 33ba0dacc66..0b0c9521dc0 100644 --- a/packages/taiko-client/pkg/jwt/jwt.go +++ b/packages/taiko-client/pkg/jwt/jwt.go @@ -6,7 +6,7 @@ import ( "fmt" "strings" - "github.com/prysmaticlabs/prysm/v4/io/file" + "github.com/prysmaticlabs/prysm/v5/io/file" ) // Taken from: https://github.com/prysmaticlabs/prysm/blob/v2.1.4/cmd/beacon-chain/execution/options.go#L43 diff --git a/packages/taiko-client/pkg/rpc/beaconclient.go b/packages/taiko-client/pkg/rpc/beaconclient.go index 29a6d78c6f1..e907acf4608 100644 --- a/packages/taiko-client/pkg/rpc/beaconclient.go +++ b/packages/taiko-client/pkg/rpc/beaconclient.go @@ -9,18 +9,15 @@ import ( "time" "github.com/ethereum/go-ethereum/log" - "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/v4/api/client" - "github.com/prysmaticlabs/prysm/v4/api/client/beacon" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/blob" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/config" + "github.com/prysmaticlabs/prysm/v5/api/client" + "github.com/prysmaticlabs/prysm/v5/api/client/beacon" + "github.com/prysmaticlabs/prysm/v5/api/server/structs" ) var ( // Request urls. sidecarsRequestURL = "/eth/v1/beacon/blob_sidecars/%d" genesisRequestURL = "/eth/v1/beacon/genesis" - getConfigSpecPath = "/eth/v1/config/spec" ) type ConfigSpec struct { @@ -70,7 +67,7 @@ func NewBeaconClient(endpoint string, timeout time.Duration) (*BeaconClient, err log.Info("L1 genesis time", "time", genesisTime) // Get the seconds per slot. - spec, err := getConfigSpec(ctx, cli) + spec, err := cli.GetConfigSpec(ctx) if err != nil { return nil, err } @@ -86,7 +83,7 @@ func NewBeaconClient(endpoint string, timeout time.Duration) (*BeaconClient, err } // GetBlobs returns the sidecars for a given slot. -func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*blob.Sidecar, error) { +func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*structs.Sidecar, error) { ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() @@ -94,13 +91,12 @@ func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*blob.Sidec if err != nil { return nil, err } - resBytes, err := c.Get(ctxWithTimeout, c.BaseURL().Path+fmt.Sprintf(sidecarsRequestURL, slot)) if err != nil { return nil, err } - var sidecars *blob.SidecarsResponse + var sidecars *structs.SidecarsResponse if err = json.Unmarshal(resBytes, &sidecars); err != nil { return nil, err } @@ -115,17 +111,3 @@ func (c *BeaconClient) timeToSlot(timestamp uint64) (uint64, error) { } return (timestamp - c.genesisTime) / c.secondsPerSlot, nil } - -// getConfigSpec retrieve the current configs of the network used by the beacon node. -func getConfigSpec(ctx context.Context, c *beacon.Client) (*config.GetSpecResponse, error) { - body, err := c.Get(ctx, c.BaseURL().Path+getConfigSpecPath) - if err != nil { - return nil, errors.Wrap(err, "error requesting configSpecPath") - } - fsr := &config.GetSpecResponse{} - err = json.Unmarshal(body, fsr) - if err != nil { - return nil, err - } - return fsr, nil -} diff --git a/packages/taiko-client/pkg/rpc/blob_datasource.go b/packages/taiko-client/pkg/rpc/blob_datasource.go index c02d1606bb1..37904158540 100644 --- a/packages/taiko-client/pkg/rpc/blob_datasource.go +++ b/packages/taiko-client/pkg/rpc/blob_datasource.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/go-resty/resty/v2" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/blob" + "github.com/prysmaticlabs/prysm/v5/api/server/structs" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" ) @@ -77,9 +77,9 @@ func (ds *BlobDataSource) GetBlobs( ctx context.Context, timestamp uint64, blobHash common.Hash, -) ([]*blob.Sidecar, error) { +) ([]*structs.Sidecar, error) { var ( - sidecars []*blob.Sidecar + sidecars []*structs.Sidecar err error ) if ds.client.L1Beacon == nil { @@ -99,9 +99,9 @@ func (ds *BlobDataSource) GetBlobs( if err != nil { return nil, err } - sidecars = make([]*blob.Sidecar, len(blobs.Data)) + sidecars = make([]*structs.Sidecar, len(blobs.Data)) for index, value := range blobs.Data { - sidecars[index] = &blob.Sidecar{ + sidecars[index] = &structs.Sidecar{ KzgCommitment: value.KzgCommitment, Blob: value.Blob, } diff --git a/packages/taiko-client/pkg/rpc/blob_datasource_test.go b/packages/taiko-client/pkg/rpc/blob_datasource_test.go deleted file mode 100644 index 439b5ee8c9b..00000000000 --- a/packages/taiko-client/pkg/rpc/blob_datasource_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package rpc - -import ( - "context" - "net/url" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" -) - -func TestGetBlobsFromBlobScan(t *testing.T) { - blobScanEndpoint, err := url.Parse("https://api.holesky.blobscan.com") - require.Nil(t, err) - require.NotNil(t, blobScanEndpoint) - ds := NewBlobDataSource( - context.Background(), - &Client{}, - blobScanEndpoint, - nil, - ) - sidecars, err := ds.GetBlobs( - context.Background(), - 0, - common.HexToHash("0x0145185449c57dee4e6c921b702e5d572fbeb026f96c220a6a17b79d157d921b"), - ) - require.Nil(t, err) - require.NotNil(t, sidecars) - require.NotNil(t, sidecars[0].Blob) -} diff --git a/packages/taiko-client/pkg/rpc/methods.go b/packages/taiko-client/pkg/rpc/methods.go index d89b1457a7c..7a747c419e6 100644 --- a/packages/taiko-client/pkg/rpc/methods.go +++ b/packages/taiko-client/pkg/rpc/methods.go @@ -510,6 +510,19 @@ func (c *Client) GetProtocolStateVariables(opts *bind.CallOpts) (*struct { return GetProtocolStateVariables(c.TaikoL1, opts) } +// GetLastVerifiedBlockHash gets the last verified block hash from TaikoL1 contract. +func (c *Client) GetLastVerifiedBlockHash(ctx context.Context) (common.Hash, error) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, defaultTimeout) + defer cancel() + + b, err := c.TaikoL1.GetLastVerifiedBlock(&bind.CallOpts{Context: ctxWithTimeout}) + if err != nil { + return common.Hash{}, err + } + + return b.BlockHash, nil +} + // GetL2BlockInfo fetches the L2 block information from the protocol. func (c *Client) GetL2BlockInfo(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlockV2, error) { ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) diff --git a/packages/taiko-client/pkg/rpc/utils.go b/packages/taiko-client/pkg/rpc/utils.go index a7c998b8aa2..191f2ed0da8 100644 --- a/packages/taiko-client/pkg/rpc/utils.go +++ b/packages/taiko-client/pkg/rpc/utils.go @@ -3,7 +3,10 @@ package rpc import ( "context" "math/big" + "os" + "os/signal" "strings" + "syscall" "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -21,6 +24,13 @@ var ( ZeroAddress common.Address BlobBytes = params.BlobTxBytesPerFieldElement * params.BlobTxFieldElementsPerBlob BlockMaxTxListBytes uint64 = (params.BlobTxBytesPerFieldElement - 1) * params.BlobTxFieldElementsPerBlob + // DefaultInterruptSignals is a set of default interrupt signals. + DefaultInterruptSignals = []os.Signal{ + os.Interrupt, + os.Kill, + syscall.SIGTERM, + syscall.SIGQUIT, + } ) // GetProtocolStateVariables gets the protocol states from TaikoL1 contract. @@ -251,3 +261,19 @@ func CtxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) return ctx, func() {} } + +// BlockOnInterruptsContext blocks until a SIGTERM is received. +// Passing in signals will override the default signals. +// The function will stop blocking if the context is closed. +func BlockOnInterruptsContext(ctx context.Context, signals ...os.Signal) { + if len(signals) == 0 { + signals = DefaultInterruptSignals + } + interruptChannel := make(chan os.Signal, 1) + signal.Notify(interruptChannel, signals...) + select { + case <-interruptChannel: + case <-ctx.Done(): + signal.Stop(interruptChannel) + } +} From c9982e62c3c5d553f09ecd54848c685dd4c0f557 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:12:01 +0800 Subject: [PATCH 06/38] refactor(protocol): extract SgxVerifierBase to be reused (#18231) --- .../contracts/layer1/based/ITaikoL1.sol | 26 +-- .../contracts/layer1/provers/ProverSet.sol | 8 +- .../layer1/verifiers/SgxVerifierBase.sol | 171 ++++++++++++++++++ packages/protocol/foundry.toml | 2 +- .../test/layer1/verifiers/SgxVerifier.t.sol | 23 ++- 5 files changed, 199 insertions(+), 31 deletions(-) create mode 100644 packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol index 91119d4787a..5ea7923c370 100644 --- a/packages/protocol/contracts/layer1/based/ITaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -56,6 +56,19 @@ interface ITaikoL1 { /// @param _pause True to pause, false to unpause. function pauseProving(bool _pause) external; + /// @notice Deposits Taiko token to be used as bonds. + /// @param _amount The amount of Taiko token to deposit. + function depositBond(uint256 _amount) external; + + /// @notice Withdraws Taiko tokens. + /// @param _amount Amount of Taiko tokens to withdraw. + function withdrawBond(uint256 _amount) external; + + /// @notice Gets the prover that actually proved a verified block. + /// @param _blockId Index of the block. + /// @return The prover's address. If the block is not verified yet, address(0) will be returned. + function getVerifiedBlockProver(uint64 _blockId) external view returns (address); + /// @notice Gets the details of a block. /// @param _blockId Index of the block. /// @return blk_ The block. @@ -73,19 +86,6 @@ interface ITaikoL1 { view returns (TaikoData.TransitionState memory); - /// @notice Deposits Taiko token to be used as bonds. - /// @param _amount The amount of Taiko token to deposit. - function depositBond(uint256 _amount) external; - - /// @notice Withdraws Taiko tokens. - /// @param _amount Amount of Taiko tokens to withdraw. - function withdrawBond(uint256 _amount) external; - - /// @notice Gets the prover that actually proved a verified block. - /// @param _blockId Index of the block. - /// @return The prover's address. If the block is not verified yet, address(0) will be returned. - function getVerifiedBlockProver(uint64 _blockId) external view returns (address); - /// @notice Gets the configuration of the TaikoL1 contract. /// @return Config struct containing configuration parameters. function getConfig() external pure returns (TaikoData.Config memory); diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol index e7ea82ee562..7de671f5a74 100644 --- a/packages/protocol/contracts/layer1/provers/ProverSet.sol +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -81,13 +81,7 @@ contract ProverSet is EssentialContract, IERC1271 { } /// @notice Propose a Taiko block. - function proposeBlockV2( - bytes calldata _params, - bytes calldata _txList - ) - external - onlyProver - { + function proposeBlockV2(bytes calldata _params, bytes calldata _txList) external onlyProver { ITaikoL1(taikoL1()).proposeBlockV2(_params, _txList); } diff --git a/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol new file mode 100644 index 00000000000..f3510a0484f --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../automata-attestation/interfaces/IAttestation.sol"; +import "../automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; + +/// @title SgxVerifierBase +/// @dev Please see references below: +/// - Reference #1: https://ethresear.ch/t/2fa-zk-rollups-using-sgx/14462 +/// - Reference #2: https://github.com/gramineproject/gramine/discussions/1579 +/// @custom:security-contact security@taiko.xyz +abstract contract SgxVerifierBase is EssentialContract { + /// @dev Each public-private key pair (Ethereum address) is generated within + /// the SGX program when it boots up. The off-chain remote attestation + /// ensures the validity of the program hash and has the capability of + /// bootstrapping the network with trustworthy instances. + struct Instance { + address addr; + uint64 validSince; + } + + /// @notice The expiry time for the SGX instance. + uint64 public constant INSTANCE_EXPIRY = 365 days; + + /// @notice A security feature, a delay until an instance is enabled when using onchain RA + /// verification + uint64 public constant INSTANCE_VALIDITY_DELAY = 0; + + /// @dev For gas savings, we shall assign each SGX instance with an id that when we need to + /// set a new pub key, just write storage once. + /// Slot 1. + uint256 public nextInstanceId; + + /// @dev One SGX instance is uniquely identified (on-chain) by it's ECDSA public key + /// (or rather ethereum address). Once that address is used (by proof verification) it has to be + /// overwritten by a new one (representing the same instance). This is due to side-channel + /// protection. Also this public key shall expire after some time + /// (for now it is a long enough 6 months setting). + /// Slot 2. + mapping(uint256 instanceId => Instance instance) public instances; + + /// @dev One address shall be registered (during attestation) only once, otherwise it could + /// bypass this contract's expiry check by always registering with the same attestation and + /// getting multiple valid instanceIds. While during proving, it is technically possible to + /// register the old addresses, it is less of a problem, because the instanceId would be the + /// same for those addresses and if deleted - the attestation cannot be reused anyways. + /// Slot 3. + mapping(address instanceAddress => bool alreadyAttested) public addressRegistered; + + uint256[47] private __gap; + + /// @notice Emitted when a new SGX instance is added to the registry, or replaced. + /// @param id The ID of the SGX instance. + /// @param instance The address of the SGX instance. + /// @param replaced The address of the SGX instance that was replaced. If it is the first + /// instance, this value is zero address. + /// @param validSince The time since the instance is valid. + event InstanceAdded( + uint256 indexed id, address indexed instance, address indexed replaced, uint256 validSince + ); + + /// @notice Emitted when an SGX instance is deleted from the registry. + /// @param id The ID of the SGX instance. + /// @param instance The address of the SGX instance. + event InstanceDeleted(uint256 indexed id, address indexed instance); + + error SGX_ALREADY_ATTESTED(); + error SGX_INVALID_ATTESTATION(); + error SGX_INVALID_INSTANCE(); + error SGX_INVALID_PROOF(); + error SGX_RA_NOT_SUPPORTED(); + + /// @notice Register an SGX instance after the attestation is verified + /// @param _attestation The parsed attestation quote. + /// @return The respective instanceId + function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) + external + returns (uint256) + { + address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); + + if (automataDcapAttestation == address(0)) { + revert SGX_RA_NOT_SUPPORTED(); + } + + (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); + + if (!verified) revert SGX_INVALID_ATTESTATION(); + + address[] memory addresses = new address[](1); + addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); + + return _addInstances(addresses, false)[0]; + } + + /// @notice Adds trusted SGX instances to the registry. + /// @param _instances The address array of trusted SGX instances. + /// @return The respective instanceId array per addresses. + function addInstances(address[] calldata _instances) + external + onlyOwner + returns (uint256[] memory) + { + return _addInstances(_instances, true); + } + + /// @notice Deletes SGX instances from the registry. + /// @param _ids The ids array of SGX instances. + function deleteInstances(uint256[] calldata _ids) + external + onlyFromOwnerOrNamed(LibStrings.B_SGX_WATCHDOG) + { + for (uint256 i; i < _ids.length; ++i) { + uint256 idx = _ids[i]; + + if (instances[idx].addr == address(0)) revert SGX_INVALID_INSTANCE(); + + emit InstanceDeleted(idx, instances[idx].addr); + + delete instances[idx]; + } + } + + function _addInstances( + address[] memory _instances, + bool instantValid + ) + internal + returns (uint256[] memory ids) + { + ids = new uint256[](_instances.length); + + uint64 validSince = uint64(block.timestamp); + + if (!instantValid) { + validSince += INSTANCE_VALIDITY_DELAY; + } + + for (uint256 i; i < _instances.length; ++i) { + if (addressRegistered[_instances[i]]) revert SGX_ALREADY_ATTESTED(); + + addressRegistered[_instances[i]] = true; + + if (_instances[i] == address(0)) revert SGX_INVALID_INSTANCE(); + + instances[nextInstanceId] = Instance(_instances[i], validSince); + ids[i] = nextInstanceId; + + emit InstanceAdded(nextInstanceId, _instances[i], address(0), validSince); + + ++nextInstanceId; + } + } + + function _replaceInstance(uint256 id, address oldInstance, address newInstance) internal { + // Replacing an instance means, it went through a cooldown (if added by on-chain RA) so no + // need to have a cooldown + instances[id] = Instance(newInstance, uint64(block.timestamp)); + emit InstanceAdded(id, newInstance, oldInstance, block.timestamp); + } + + function _isInstanceValid(uint256 id, address instance) internal view returns (bool) { + if (instance == address(0)) return false; + if (instance != instances[id].addr) return false; + return instances[id].validSince <= block.timestamp + && block.timestamp <= instances[id].validSince + INSTANCE_EXPIRY; + } +} diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 7012fe4b58d..d22f925e5d4 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -21,7 +21,7 @@ remappings = [ "@p256-verifier/contracts/=node_modules/p256-verifier/src/", "src/=contracts/", "test/=test/", - "script/=script/" + "script/=script/", ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. diff --git a/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol b/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol index 5631423fddb..2e1b115de9e 100644 --- a/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol +++ b/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +import "src/layer1/verifiers/SgxVerifierBase.sol"; import "../automata-attestation/common/AttestationBase.t.sol"; import "../based/TaikoL1TestBase.sol"; @@ -38,9 +39,11 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = Bob; vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(startInstance, instances[0], address(0), block.timestamp); + emit SgxVerifierBase.InstanceAdded(startInstance, instances[0], address(0), block.timestamp); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(startInstance + 1, instances[1], address(0), block.timestamp); + emit SgxVerifierBase.InstanceAdded( + startInstance + 1, instances[1], address(0), block.timestamp + ); // `addInstances()` uint256[] memory ids = sv.addInstances(instances); @@ -66,11 +69,11 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances2[1] = David; vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded( + emit SgxVerifierBase.InstanceAdded( startInstance + 2, instances2[0], address(0), block.timestamp ); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded( + emit SgxVerifierBase.InstanceAdded( startInstance + 3, instances2[1], address(0), block.timestamp ); @@ -103,7 +106,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = address(0); // `addInstances()` - vm.expectRevert(SgxVerifier.SGX_INVALID_INSTANCE.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_INSTANCE.selector); sv.addInstances(instances); vm.stopPrank(); @@ -117,7 +120,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = Alice; // invalid as duplicate instance // `addInstances()` - vm.expectRevert(SgxVerifier.SGX_ALREADY_ATTESTED.selector); + vm.expectRevert(SgxVerifierBase.SGX_ALREADY_ATTESTED.selector); sv.addInstances(instances); } @@ -161,7 +164,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { vm.prank(Bob, Bob); sv.registerInstance(v3quote); - vm.expectRevert(SgxVerifier.SGX_ALREADY_ATTESTED.selector); + vm.expectRevert(SgxVerifierBase.SGX_ALREADY_ATTESTED.selector); vm.prank(Carol, Carol); sv.registerInstance(v3quote); } @@ -218,7 +221,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { vm.warp(block.timestamp + 5); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(id, newInstance, KNOWN_ADDRESS, block.timestamp); + emit SgxVerifierBase.InstanceAdded(id, newInstance, KNOWN_ADDRESS, block.timestamp); // `verifyProof()` sv.verifyProof(ctx, transition, proof); @@ -294,7 +297,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { }); // `verifyProof()` - vm.expectRevert(SgxVerifier.SGX_INVALID_PROOF.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_PROOF.selector); sv.verifyProof(ctx, transition, proof); } @@ -375,7 +378,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); // `verifyProof()` - vm.expectRevert(SgxVerifier.SGX_INVALID_INSTANCE.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_INSTANCE.selector); sv.verifyProof(ctx, transition, proof); vm.stopPrank(); From 7fbfe84743f880d8221dac84563e3fbf983c9b05 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 18 Oct 2024 14:47:02 +0800 Subject: [PATCH 07/38] feat(protocol): migrate Nethermind's preconf contracts here (#18234) Co-authored-by: dantaik --- _typos.toml | 2 + packages/protocol/.solhint.json | 1 + packages/protocol/.solhintignore | 2 + .../contracts/layer1/preconf/README.md | 3 + .../preconf/avs-mvp/PreconfServiceManager.sol | 91 ++ .../preconf/avs-mvp/iface/IAVSDirectory.sol | 36 + .../avs-mvp/iface/IDelegationManager.sol | 20 + .../layer1/preconf/avs-mvp/iface/ISlasher.sol | 16 + .../avs-mvp/iface/IStrategyManager.sol | 16 + .../preconf/avs-mvp/impl/AVSDirectory.sol | 48 + .../avs-mvp/impl/DelegationManager.sol | 55 ++ .../layer1/preconf/avs-mvp/impl/Slasher.sol | 31 + .../preconf/avs-mvp/impl/StrategyManager.sol | 39 + .../eigenlayer/PreconfServiceManager.sol | 8 + .../layer1/preconf/iface/IPreconfRegistry.sol | 89 ++ .../preconf/iface/IPreconfServiceManager.sol | 23 + .../preconf/iface/IPreconfTaskManager.sol | 125 +++ .../preconf/impl/LibPreconfConstants.sol | 10 + .../layer1/preconf/impl/PreconfRegistry.sol | 253 +++++ .../preconf/impl/PreconfTaskManager.sol | 659 +++++++++++++ .../layer1/preconf/libs/LibBLS12381.sol | 466 ++++++++++ .../layer1/preconf/libs/LibBLSSignature.sol | 36 + .../layer1/preconf/libs/LibEIP4788.sol | 107 +++ .../layer1/preconf/libs/LibMerkleUtils.sol | 78 ++ .../preconf/mock/MockPreconfRegistry.sol | 253 +++++ .../layer1/preconf/mock/MockTaikoToken.sol | 13 + .../based/{Lib1559Math.sol => LibEIP1559.sol} | 4 +- .../contracts/layer2/based/TaikoL2.sol | 8 +- packages/protocol/foundry.toml | 9 +- packages/protocol/package.json | 2 + .../script/layer1/preconf/BaseScript.sol | 28 + .../layer1/preconf/deployment/DeployAVS.s.sol | 73 ++ .../deployment/DeployEigenlayerMVP.s.sol | 50 + .../layer1/preconf/deployment/deploy_avs.sh | 17 + .../deployment/deploy_eigenlayer_mvp.sh | 10 + .../deployment/mock/DeployMockAVS.s.sol | 75 ++ .../mock/DeployMockTaikoToken.s.sol | 13 + .../layer1/preconf/misc/EmptyContract.sol | 5 + .../common/AttestationBase.t.sol | 15 +- .../utils/DcapTestUtils.t.sol | 10 +- .../utils/V3QuoteParseUtils.t.sol | 15 +- .../test/layer1/based/MockTaikoL1.sol | 66 ++ .../protocol/test/layer1/preconf/BaseTest.sol | 17 + .../beacon/BeaconProofsVerification.sol | 70 ++ .../preconf/blocks/BlockProposing.t.sol | 239 +++++ .../layer1/preconf/bls/BLSExpandMsgXmd.t.sol | 129 +++ .../preconf/bls/BLSHashToFieldFp2.t.sol | 103 +++ .../bls/script-test/BLSHashToCurveG2.sol | 34 + .../bls/script-test/BLSVerifySignature.sol | 64 ++ .../layer1/preconf/fixtures/BeaconProofs.sol | 135 +++ .../preconf/fixtures/BlocksFixtures.sol | 66 ++ .../preconf/fixtures/LookaheadFixtures.sol | 53 ++ .../lookahead/IncorrectLookahead.t.sol | 661 +++++++++++++ .../preconf/lookahead/LookaheadPosting.t.sol | 428 +++++++++ .../preconf/mocks/MockBeaconBlockRoot.sol | 18 + .../preconf/mocks/MockPreconfRegistry.sol | 55 ++ .../mocks/MockPreconfServiceManager.sol | 15 + .../{Lib1559Math.t.sol => LibEIP1559.t.sol} | 34 +- packages/protocol/test/layer2/TaikoL2Test.sol | 2 +- pnpm-lock.yaml | 873 +++++++++++++++++- 60 files changed, 5780 insertions(+), 96 deletions(-) create mode 100644 packages/protocol/contracts/layer1/preconf/README.md create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol create mode 100644 packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol create mode 100644 packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol create mode 100644 packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol create mode 100644 packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol create mode 100644 packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol create mode 100644 packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol create mode 100644 packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol rename packages/protocol/contracts/layer2/based/{Lib1559Math.sol => LibEIP1559.sol} (98%) create mode 100644 packages/protocol/script/layer1/preconf/BaseScript.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh create mode 100644 packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh create mode 100644 packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol create mode 100644 packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol create mode 100644 packages/protocol/script/layer1/preconf/misc/EmptyContract.sol create mode 100644 packages/protocol/test/layer1/based/MockTaikoL1.sol create mode 100644 packages/protocol/test/layer1/preconf/BaseTest.sol create mode 100644 packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol create mode 100644 packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol create mode 100644 packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol create mode 100644 packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol create mode 100644 packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol create mode 100644 packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol create mode 100644 packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol create mode 100644 packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol create mode 100644 packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol create mode 100644 packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol create mode 100644 packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol rename packages/protocol/test/layer2/{Lib1559Math.t.sol => LibEIP1559.t.sol} (65%) diff --git a/_typos.toml b/_typos.toml index e0ba4825a7b..004806bd6cf 100644 --- a/_typos.toml +++ b/_typos.toml @@ -5,6 +5,8 @@ extend-ignore-identifiers-re = [ "bafybeiegdqpwx3he5dvoxqklspdjekjepjcobfaakyficksratn73qbbyy", "TGE", "tge", + "preconf", + "preconfer", "baed", "Groth", "groth", diff --git a/packages/protocol/.solhint.json b/packages/protocol/.solhint.json index add6256b711..43f67a418ae 100644 --- a/packages/protocol/.solhint.json +++ b/packages/protocol/.solhint.json @@ -14,6 +14,7 @@ "no-inline-assembly": "off", "not-rely-on-time": "off", "gas-custom-errors": "off", + "immutable-vars-naming": "off", "one-contract-per-file": "off" } } diff --git a/packages/protocol/.solhintignore b/packages/protocol/.solhintignore index b0045ae5f33..fa784518089 100644 --- a/packages/protocol/.solhintignore +++ b/packages/protocol/.solhintignore @@ -1,4 +1,6 @@ node_modules/ lib/ contracts/layer1/automata-attestation/ +contracts/layer1/preconf/avs-mvp/ +contracts/layer1/preconf/libs/LibBLS12381.sol test/shared/thirdparty/ diff --git a/packages/protocol/contracts/layer1/preconf/README.md b/packages/protocol/contracts/layer1/preconf/README.md new file mode 100644 index 00000000000..ea72bc235bf --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/README.md @@ -0,0 +1,3 @@ +# README + +This folder contains the contracts migrated from github.com/NethermindEth/Taiko-Preconf-AVS diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol new file mode 100644 index 00000000000..61e28c9d58c --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "./iface/ISlasher.sol"; +import "./iface/IAVSDirectory.sol"; + +/// @dev This contract would serve as the address of the AVS w.r.t the restaking platform being +/// used. +/// Currently, this is based on a mock version of Eigenlayer that we have created solely for a +/// POC. +contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { + address internal immutable preconfRegistry; + address internal immutable preconfTaskManager; + IAVSDirectory internal immutable avsDirectory; + ISlasher internal immutable slasher; + + /// @dev This is currently just a flag and not actually being used to lock the stake. + mapping(address operator => uint256 timestamp) public stakeLockedUntil; + + uint256[49] private __gap; // 50 - 1 + + constructor( + address _preconfRegistry, + address _preconfTaskManager, + IAVSDirectory _avsDirectory, + ISlasher _slasher + ) { + preconfRegistry = _preconfRegistry; + preconfTaskManager = _preconfTaskManager; + avsDirectory = _avsDirectory; + slasher = _slasher; + } + + modifier onlyCallableBy(address allowedSender) { + if (msg.sender != allowedSender) { + revert SenderIsNotAllowed(); + } + _; + } + + /// @dev Simply relays the call to the AVS directory + function registerOperatorToAVS( + address operator, + bytes calldata operatorSignature + ) + external + nonReentrant + onlyCallableBy(preconfRegistry) + { + IAVSDirectory.SignatureWithSaltAndExpiry memory sig = + abi.decode(operatorSignature, (IAVSDirectory.SignatureWithSaltAndExpiry)); + avsDirectory.registerOperatorToAVS(operator, sig); + } + + /// @dev Simply relays the call to the AVS directory + function deregisterOperatorFromAVS(address operator) + external + nonReentrant + onlyCallableBy(preconfRegistry) + { + avsDirectory.deregisterOperatorFromAVS(operator); + } + + /// @dev This not completely functional until Eigenlayer decides the logic of their Slasher. + /// for now this simply sets a value in the storage and releases an event. + function lockStakeUntil( + address operator, + uint256 timestamp + ) + external + nonReentrant + onlyCallableBy(preconfTaskManager) + { + stakeLockedUntil[operator] = timestamp; + emit StakeLockedUntil(operator, timestamp); + } + + /// @dev This not completely functional until Eigenlayer decides the logic of their Slasher. + function slashOperator(address operator) + external + nonReentrant + onlyCallableBy(preconfTaskManager) + { + if (slasher.isOperatorSlashed(operator)) { + revert OperatorAlreadySlashed(); + } + slasher.slashOperator(operator); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol new file mode 100644 index 00000000000..99f137e13c4 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +interface IAVSDirectory { + struct SignatureWithSaltAndExpiry { + // the signature itself, formatted as a single bytes object + bytes signature; + // the salt used to generate the signature + bytes32 salt; + // the expiration timestamp (UTC) of the signature + uint256 expiry; + } + + /// @dev This function will be left without implementation in the MVP + function registerOperatorToAVS( + address operator, + SignatureWithSaltAndExpiry memory operatorSignature + ) + external; + + /// @dev This function will be left without implementation in the MVP + function deregisterOperatorFromAVS(address operator) external; + + /// @dev This function will have the implementation in the MVP so that the node can pull the + /// message + /// to be signed + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) + external + view + returns (bytes32); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol new file mode 100644 index 00000000000..38301322415 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +interface IDelegationManager { + event OperatorSharesIncreased( + address indexed operator, address staker, address strategy, uint256 shares + ); + + /// @dev Called internally in EL by Strategy Manager + function increaseDelegatedShares(address operator, address strategy, uint256 shares) external; + + /// @dev Called by the AVS Stake Registry + function getOperatorShares( + address operator, + address[] memory strategies + ) + external + view + returns (uint256[] memory); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol new file mode 100644 index 00000000000..7d521f089e0 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +interface ISlasher { + event OperatorSlashed(address indexed operator, address indexed avs); + event OptedIntoSlashing(address indexed operator, address indexed avs); + + /// @dev Called externally by the AVS operator client to allow AVS to slash the operator in the + /// future + function optIntoSlashing(address avs) external; + + /// @dev Called internally by the AVS (specifically the Service Manager) to slash the operator + function slashOperator(address operator) external; + + function isOperatorSlashed(address operator) external view returns (bool); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol new file mode 100644 index 00000000000..f4f7795dde5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +interface IStrategyManager { + event Deposit(address staker, address token, address strategy, uint256 shares); + + /// @dev In EL this function is non-payable and solely for staking ERC20 tokens + function depositIntoStrategy( + address strategy, + address token, + uint256 amount + ) + external + payable + returns (uint256 shares); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol new file mode 100644 index 00000000000..3b24d2b8fdc --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IAVSDirectory.sol"; + +contract AVSDirectory is IAVSDirectory { + bytes32 private constant DOMAIN_TYPEHASH = + keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + bytes32 private constant OPERATOR_AVS_REGISTRATION_TYPEHASH = keccak256( + "OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)" + ); + + function registerOperatorToAVS( + address operator, + IAVSDirectory.SignatureWithSaltAndExpiry memory operatorSignature + ) + external + { } + + function deregisterOperatorFromAVS(address operator) external { } + + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) + public + view + returns (bytes32) + { + // calculate the struct hash + bytes32 structHash = + keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry)); + // calculate the digest hash + bytes32 digestHash = + keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); + return digestHash; + } + + function _calculateDomainSeparator() internal view returns (bytes32) { + return keccak256( + abi.encode( + DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this) + ) + ); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol new file mode 100644 index 00000000000..06fc8d9fe6f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IDelegationManager.sol"; +import "../iface/IStrategyManager.sol"; + +contract DelegationManager is IDelegationManager { + IStrategyManager internal immutable strategyManager; + + mapping(address operator => uint256 shares) internal operatorShares; + + constructor(IStrategyManager _strategyManager) { + strategyManager = _strategyManager; + } + + modifier onlyStrategyManager() { + require( + msg.sender == address(strategyManager), + "DelegationManager: Only Strategy Manager allowed" + ); + _; + } + + /// @dev In this MVP, operator and staker are used interchangeably + function increaseDelegatedShares( + address operator, + address strategy, + uint256 shares + ) + external + onlyStrategyManager + { + require(strategy == address(0), "DelegationManager: Only ETH strategy supported"); + operatorShares[operator] += shares; + emit OperatorSharesIncreased(operator, operator, strategy, shares); + } + + /// @dev This has been modified from the original EL implementation to accommodate for slashing + function getOperatorShares( + address operator, + address[] memory strategies + ) + external + view + returns (uint256[] memory) + { + uint256[] memory shares = new uint256[](strategies.length); + + for (uint256 i; i < strategies.length; ++i) { + require(strategies[i] == address(0), "DelegationManager: Only ETH strategy supported"); + shares[i] = operatorShares[operator]; + } + return shares; + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol new file mode 100644 index 00000000000..94a668fa4df --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/ISlasher.sol"; + +contract Slasher is ISlasher { + mapping(address operator => mapping(address avs => bool canSlash)) internal slashingAllowed; + mapping(address operator => bool slashed) internal isSlashed; + + modifier onlyIfSlashingAllowed(address operator, address caller) { + require( + slashingAllowed[operator][caller], + "Slasher: Caller is not allowed to slash the operator" + ); + _; + } + + function optIntoSlashing(address avs) external { + slashingAllowed[msg.sender][avs] = true; + emit OptedIntoSlashing(msg.sender, avs); + } + + function slashOperator(address operator) external onlyIfSlashingAllowed(operator, msg.sender) { + isSlashed[operator] = true; + emit OperatorSlashed(operator, msg.sender); + } + + function isOperatorSlashed(address operator) external view returns (bool) { + return isSlashed[operator]; + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol new file mode 100644 index 00000000000..307e3d4815e --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IStrategyManager.sol"; +import "../iface/IDelegationManager.sol"; + +contract StrategyManager is IStrategyManager { + IDelegationManager internal immutable delegation; + + uint256 internal constant ETH_DEPOSIT = 1 ether; + + constructor(IDelegationManager _delegation) { + delegation = _delegation; + } + + function depositIntoStrategy( + address strategy, + address token, + uint256 amount + ) + external + payable + returns (uint256 shares) + { + require(strategy == address(0), "StrategyManager: Only ETH strategy supported"); + require(token == address(0), "StrategyManager: Only ETH deposits supported"); + require( + msg.value == ETH_DEPOSIT && amount == ETH_DEPOSIT, + "StrategyManager: Invalid ETH deposit" + ); + + // In the MVP, the shares equal the sent amount as we do not have any form of reward accrual + shares = amount; + + delegation.increaseDelegatedShares(msg.sender, strategy, shares); + + emit Deposit(msg.sender, token, strategy, shares); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol new file mode 100644 index 00000000000..f710eb2e53c --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "../iface/IPreconfServiceManager.sol"; + +/// @dev An implementation of IPreconfServiceManager on top of Eigenlayer restaking. +abstract contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { } diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol new file mode 100644 index 00000000000..b4cb69f2ad7 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../libs/LibBLS12381.sol"; + +interface IPreconfRegistry { + struct Validator { + // Preconfer that the validator proposer blocks for + address preconfer; + // Timestamp at which the preconfer may start proposing for the preconfer + // 2 epochs from validator addition timestamp + uint40 startProposingAt; + // Timestamp at which the preconfer must stop proposing for the preconfer + // 2 epochs from validator removal timestamp + uint40 stopProposingAt; + } + // ^ Note: 40 bits are enough for UNIX timestamp. This way we also compress the data to a single + // slot. + + struct AddValidatorParam { + // The public key of the validator + LibBLS12381.G1Point pubkey; + // The signature of the validator + LibBLS12381.G2Point signature; + // The timestamp at which the above signature expires + uint256 signatureExpiry; + } + + struct RemoveValidatorParam { + // The public key of the validator + LibBLS12381.G1Point pubkey; + // The signature of the validator + LibBLS12381.G2Point signature; + // The timestamp at which the above signature expires + uint256 signatureExpiry; + } + + enum ValidatorOp { + REMOVE, + ADD + } + + event PreconferRegistered(address indexed preconfer); + event PreconferDeregistered(address indexed preconfer); + event ValidatorAdded(bytes32 indexed pubKeyHash, address indexed preconfer); + event ValidatorRemoved(bytes32 indexed pubKeyHash, address indexed preconfer); + + error PreconferAlreadyRegistered(); + error PreconferNotRegistered(); + error InvalidValidatorSignature(); + error ValidatorSignatureExpired(); + error ValidatorAlreadyActive(); + error ValidatorAlreadyInactive(); + + /// @dev Registers a preconfer by giving them a non-zero registry index + function registerPreconfer(bytes calldata operatorSignature) external; + + /// @dev Deregisters a preconfer from the registry + function deregisterPreconfer() external; + + /// @dev Adds consensus layer validators to the system by assigning preconfers to them + function addValidators(AddValidatorParam[] calldata addValidatorParams) external; + + /// @dev Removes active validators who are proposing for a preconfer + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external; + + /// @dev Returns the message that the validator must sign to add or remove themselves from a + /// preconfer + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory); + + /// @dev Returns the index of the next preconfer + function getNextPreconferIndex() external view returns (uint256); + + /// @dev Returns the index of the preconfer + function getPreconferIndex(address preconfer) external view returns (uint256); + + /// @dev Returns the preconfer at the given index + function getPreconferAtIndex(uint256 index) external view returns (address); + + /// @dev Returns a validator who is proposing for a registered preconfer + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory); +} diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol new file mode 100644 index 00000000000..7a7fb65955b --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +interface IPreconfServiceManager { + event StakeLockedUntil(address indexed operator, uint256 timestamp); + + error SenderIsNotAllowed(); + error OperatorAlreadySlashed(); + + /// @dev Only callable by the registry + function registerOperatorToAVS(address operator, bytes calldata operatorSignature) external; + + /// @dev Only callable by the registry + function deregisterOperatorFromAVS(address operator) external; + + /// @dev Only Callable by PreconfTaskManager to prevent withdrawals of stake during preconf or + /// lookahead dispute period + function lockStakeUntil(address operator, uint256 timestamp) external; + + /// @dev Only Callable by PreconfTaskManager to slash an operator for incorrect lookahead or + /// preconfirmation + function slashOperator(address operator) external; +} diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol new file mode 100644 index 00000000000..f3fb1e7a8f9 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../libs/LibEIP4788.sol"; + +interface IPreconfTaskManager { + struct LookaheadBufferEntry { + // True when the preconfer is randomly selected + bool isFallback; + // Timestamp of the slot at which the provided preconfer is the L1 validator + uint40 timestamp; + // Timestamp of the last slot that had a valid preconfer + uint40 prevTimestamp; + // Address of the preconfer who is also the L1 validator + // The preconfer will have rights to propose a block in the range (prevTimestamp, timestamp] + address preconfer; + } + + struct LookaheadSetParam { + // The timestamp of the slot + uint256 timestamp; + // The AVS operator who is also the L1 validator for the slot and will preconf L2 + // transactions + address preconfer; + } + + event LookaheadUpdated(LookaheadSetParam[]); + + event ProvedIncorrectLookahead( + address indexed poster, uint256 indexed timestamp, address indexed disputer + ); + + /// @dev The current (or provided) timestamp does not fall in the range provided by the + /// lookahead pointer + error InvalidLookaheadPointer(); + /// @dev The block proposer is not the assigned preconfer for the current slot/timestamp + error SenderIsNotThePreconfer(); + /// @dev Preconfer is not present in the registry + error PreconferNotRegistered(); + /// @dev Epoch timestamp is incorrect + error InvalidEpochTimestamp(); + /// @dev The timestamp in the lookahead is not of a valid future slot in the present epoch + error InvalidSlotTimestamp(); + /// @dev The chain id on which the preconfirmation was signed is different from the current + /// chain's id + error PreconfirmationChainIdMismatch(); + /// @dev The dispute window for proving incorrectc lookahead or preconfirmation is over + error MissedDisputeWindow(); + /// @dev The lookahead poster for the epoch has already been slashed or there is no lookahead + /// for epoch + error PosterAlreadySlashedOrLookaheadIsEmpty(); + /// @dev The lookahead preconfer matches the one the actual validator is proposing for + error LookaheadEntryIsCorrect(); + /// @dev Cannot force push a lookahead since it is not lagging behind + error LookaheadIsNotRequired(); + /// @dev The registry does not have a single registered preconfer + error NoRegisteredPreconfer(); + + /// @dev Accepts block proposal by an operator and forwards it to TaikoL1 contract + function newBlockProposals( + bytes[] calldata blockParamsArr, + bytes[] calldata txListArr, + uint256 lookaheadPointer, + LookaheadSetParam[] calldata lookaheadSetParams + ) + external; + + /// @dev Slashes a preconfer if the validator lookahead pushed by them has an incorrect entry + function proveIncorrectLookahead( + uint256 lookaheadPointer, + uint256 slotTimestamp, + bytes calldata validatorBLSPubKey, + LibEIP4788.InclusionProof calldata validatorInclusionProof + ) + external; + + /// @dev Forces the lookahead to be set for the next epoch if it is lagging behind + function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external; + + /// @dev Returns the fallback preconfer for the given epoch + function getFallbackPreconfer(uint256 epochTimestamp) external view returns (address); + + /// @dev Returns the full 32 slot preconfer lookahead for the epoch + function getLookaheadForEpoch(uint256 epochTimestamp) + external + view + returns (address[32] memory); + + /// @dev Return the parameters required for the lookahead to be set for the given epoch + function getLookaheadParamsForEpoch( + uint256 epochTimestamp, + bytes[32] calldata validatorBLSPubKeys + ) + external + view + returns (LookaheadSetParam[] memory); + + /// @dev Returns true is a lookahead is not posted for an epoch + /// @dev In the event that a lookahead was posted but later invalidated, this returns false + function isLookaheadRequired() external view returns (bool); + + /// @dev Returns the current lookahead tail + function getLookaheadTail() external view returns (uint256); + + /// @dev Returns the entire lookahead buffer + function getLookaheadBuffer() external view returns (LookaheadBufferEntry[128] memory); + + /// @dev Returns the lookahead poster for an epoch + function getLookaheadPoster(uint256 epochTimestamp) external view returns (address); + + /// @dev Returns the preconf service manager contract address + function getPreconfServiceManager() external view returns (address); + + /// @dev Returns the preconf registry contract address + function getPreconfRegistry() external view returns (address); + + /// @dev Returns the Taiko L1 contract address + function getTaikoL1() external view returns (address); + + /// @dev Returns the beacon genesis timestamp + function getBeaconGenesis() external view returns (uint256); + + /// @dev Returns the beacon block root contract address + function getBeaconBlockRootContract() external view returns (address); +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol new file mode 100644 index 00000000000..7a24709180d --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +library LibPreconfConstants { + uint256 internal constant MAINNET_BEACON_GENESIS = 1_606_824_023; + uint256 internal constant SECONDS_IN_SLOT = 12; + uint256 internal constant SECONDS_IN_EPOCH = SECONDS_IN_SLOT * 32; + uint256 internal constant TWO_EPOCHS = 2 * SECONDS_IN_EPOCH; + uint256 internal constant DISPUTE_PERIOD = 2 * SECONDS_IN_EPOCH; +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol new file mode 100644 index 00000000000..31fe787827f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../libs/LibBLSSignature.sol"; +import "./LibPreconfConstants.sol"; + +contract PreconfRegistry is IPreconfRegistry, Initializable { + using LibBLS12381 for LibBLS12381.G1Point; + + IPreconfServiceManager internal immutable preconfServiceManager; + + uint256 internal nextPreconferIndex; + + // Maps the preconfer's address to an index that may change over the lifetime of a preconfer + mapping(address preconfer => uint256 index) internal preconferToIndex; + + // Maps an index to the preconfer's address + // We need this mapping to deregister a preconfer in O(1) time. + // While it may also be done by just using the above map and sending a "witness" that is + // calculated offchain, + // we ideally do not want the node to maintain historical state. + mapping(uint256 index => address preconfer) internal indexToPreconfer; + + // Maps a validator's BLS pub key hash to the validator's details + mapping(bytes32 publicKeyHash => Validator validator) internal validators; + + uint256[46] private __gap; // = 50 - 4 + + constructor(IPreconfServiceManager _preconfServiceManager) { + preconfServiceManager = _preconfServiceManager; + } + + function init() external initializer { + nextPreconferIndex = 1; + } + + /** + * @notice Registers a preconfer in the registry by giving it a non-zero index + * @dev This function internally accesses the restaking platform via the AVS service manager + * @param operatorSignature The signature of the operator in the format expected by the + * restaking platform + */ + function registerPreconfer(bytes calldata operatorSignature) external { + // Preconfer must not have registered already + if (preconferToIndex[msg.sender] != 0) { + revert PreconferAlreadyRegistered(); + } + + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[msg.sender] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = msg.sender; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + + emit PreconferRegistered(msg.sender); + + preconfServiceManager.registerOperatorToAVS(msg.sender, operatorSignature); + } + + /** + * @notice Deregisters a preconfer from the registry by setting its index to zero + * @dev It assigns the index of the last preconfer to the preconfer being removed and + * decrements the global index counter. + */ + function deregisterPreconfer() external { + // Preconfer must have registered already + uint256 removedPreconferIndex = preconferToIndex[msg.sender]; + if (removedPreconferIndex == 0) { + revert PreconferNotRegistered(); + } + + // Remove the preconfer and exchange its index with the last preconfer + preconferToIndex[msg.sender] = 0; + + unchecked { + // Update to the decremented index to account for the removed preconfer + uint256 lastPreconferIndex = nextPreconferIndex - 1; + nextPreconferIndex = lastPreconferIndex; + + if (removedPreconferIndex == lastPreconferIndex) { + indexToPreconfer[removedPreconferIndex] = address(0); + } else { + address lastPreconfer = indexToPreconfer[lastPreconferIndex]; + preconferToIndex[lastPreconfer] = removedPreconferIndex; + indexToPreconfer[removedPreconferIndex] = lastPreconfer; + } + } + + emit PreconferDeregistered(msg.sender); + + preconfServiceManager.deregisterOperatorFromAVS(msg.sender); + } + + /** + * @notice Assigns a validator to a preconfer + * @dev This function verifies BLS signatures which is a very expensive operation costing about + * ~350K units of gas per signature. + * @param addValidatorParams Contains the public key, signature, expiry, and preconfer + */ + function addValidators(AddValidatorParam[] calldata addValidatorParams) external { + for (uint256 i; i < addValidatorParams.length; ++i) { + // Revert if preconfer is not registered + if (preconferToIndex[msg.sender] == 0) { + revert PreconferNotRegistered(); + } + + // Note: BLS signature checks are commented out for the POC + + // bytes memory message = _createMessage(ValidatorOp.ADD, + // addValidatorParams[i].signatureExpiry, msg.sender); + + // Revert if any signature is invalid + // if (!verifySignature(message, addValidatorParams[i].signature, + // addValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + // } + + // Revert if the signature has expired + // if (block.timestamp > addValidatorParams[i].signatureExpiry) { + // revert ValidatorSignatureExpired(); + // } + + bytes32 pubKeyHash = _hashBLSPubKey(addValidatorParams[i].pubkey); + Validator memory validator = validators[pubKeyHash]; + + // Update the validator if it has no preconfer assigned, or if it has stopped proposing + // for the former preconfer + if ( + validator.preconfer == address(0) + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt) + ) { + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); + } + } else { + // Validator is already proposing for a preconfer + revert ValidatorAlreadyActive(); + } + + emit ValidatorAdded(pubKeyHash, msg.sender); + } + } + + /** + * @notice Unassigns a validator from a preconfer + * @dev Instead of removing the validator immediately, we delay the removal by two epochs, + * & set the `stopProposingAt` timestamp. + * @param removeValidatorParams Contains the public key, signature and expiry + */ + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external { + for (uint256 i; i < removeValidatorParams.length; ++i) { + bytes32 pubKeyHash = _hashBLSPubKey(removeValidatorParams[i].pubkey); + Validator memory validator = validators[pubKeyHash]; + + // Revert if the validator is not active (or already removed, but waiting to stop + // proposing) + if (validator.preconfer == address(0) || validator.stopProposingAt != 0) { + revert ValidatorAlreadyInactive(); + } + + // Note: BLS signature checks have been commented out + // Todo: It would be reasonable to remove BLS checks altogether for validator removals. + + // bytes memory message = + // _createMessage(ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, + // validator.preconfer); + + // // Revert if any signature is invalid + // if (!verifySignature(message, removeValidatorParams[i].signature, + // removeValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + // } + + // // Revert if the signature has expired + // if (block.timestamp > removeValidatorParams[i].signatureExpiry) { + // revert ValidatorSignatureExpired(); + // } + + unchecked { + // We also need to delay the removal by two epochs to avoid contradicting the + // lookahead + validators[pubKeyHash].stopProposingAt = + uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS); + } + + emit ValidatorRemoved(pubKeyHash, validator.preconfer); + } + } + + //======= + // Views + //======= + + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory) + { + return _createMessage(validatorOp, expiry, preconfer); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } + + //========= + // Helpers + //========= + + function _createMessage( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + internal + view + returns (bytes memory) + { + return abi.encodePacked(block.chainid, validatorOp, expiry, preconfer); + } + + function _hashBLSPubKey(LibBLS12381.G1Point calldata pubkey) internal pure returns (bytes32) { + uint256[2] memory compressedPubKey = pubkey.compress(); + return keccak256(abi.encodePacked(compressedPubKey)); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol new file mode 100644 index 00000000000..225d875102f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol @@ -0,0 +1,659 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "src/layer1/based/ITaikoL1.sol"; +import "../iface/IPreconfTaskManager.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../libs/LibEIP4788.sol"; +import "./LibPreconfConstants.sol"; + +contract PreconfTaskManager is IPreconfTaskManager, Initializable { + // Cannot be kept in `LibPreconfConstants` file because solidity expects array sizes + // to be stored in the main contract file itself. + uint256 internal constant SLOTS_IN_EPOCH = 32; + uint256 internal constant LOOKAHEAD_BUFFER_SIZE = 128; + uint256 internal constant POSTER_BUFFER_SIZE = LibPreconfConstants.SECONDS_IN_EPOCH * 16; + + struct Poster { + // Address of lookahead poster + address addr; + // Start timestamp of the epoch for which the lookahead was posted + uint64 epochTimestamp; + } + + IPreconfServiceManager internal immutable preconfServiceManager; + IPreconfRegistry internal immutable preconfRegistry; + ITaikoL1 internal immutable taikoL1; + + // EIP-4788 + uint256 internal immutable beaconGenesis; + address internal immutable beaconBlockRootContract; + + // A ring buffer of upcoming preconfers (who are also the L1 validators) + uint256 internal lookaheadTail; + mapping( + uint256 lookaheadIndex_mod_LOOKAHEAD_BUFFER_SIZE + => LookaheadBufferEntry lookaheadBufferEntry + ) internal lookahead; + + // A ring buffer that maps beginning timestamp of an epoch to the lookahead poster for that + // epoch. + // If the lookahead poster has been slashed or the lookahead is not yet posted, the poster is + // the 0-address. + mapping(uint256 epochTimestamp_mod_POSTER_BUFFER_SIZE => Poster poster) internal + lookaheadPosters; + + uint256[47] private __gap; // = 50 - 3 + + constructor( + IPreconfServiceManager _serviceManager, + IPreconfRegistry _registry, + ITaikoL1 _taikoL1, + uint256 _beaconGenesis, + address _beaconBlockRootContract + ) { + preconfServiceManager = _serviceManager; + preconfRegistry = _registry; + taikoL1 = _taikoL1; + beaconGenesis = _beaconGenesis; + beaconBlockRootContract = _beaconBlockRootContract; + } + + function init(IERC20 _taikoToken) external initializer { + _taikoToken.approve(address(taikoL1), type(uint256).max); + } + + /** + * @notice Proposes a new Taiko L2 block. + * @dev The first caller in every epoch is expected to pass along the lookahead entries for the + * next epoch. + * The function reverts if the lookahead is lagging behind. This is possible if it is + * the first block proposal of the system or no lookahead was posted for the current epoch due + * to missed proposals. + * In this case, `forcePushLookahead` must be called in order to update the lookahead for the + * next epoch. + * @param blockParamsArr A list of block parameters expected by TaikoL1 contract + * @param txListArr A list of RLP encoded transaction list expected by TaikoL1 contract + * @param lookaheadPointer A pointer to the lookahead entry that may prove that the sender is + * the preconfer + * for the slot. + * @param lookaheadSetParams Collection of timestamps and preconfer addresses to be inserted in + * the lookahead + */ + function newBlockProposals( + bytes[] calldata blockParamsArr, + bytes[] calldata txListArr, + uint256 lookaheadPointer, + LookaheadSetParam[] calldata lookaheadSetParams + ) + external + { + LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); + + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + + // The current L1 block's timestamp must be within the range retrieved from the lookahead + // entry. + // The preconfer is allowed to propose a block in advanced if there are no other entries in + // the + // lookahead between the present slot and the preconfer's own slot. + // + // ------[Last slot with an entry]---[X]---[X]----[X]----[Preconfer]------- + // ------[ prevTimestamp ]---[ ]---[ ]----[ ]----[timestamp]------- + // + if ( + block.timestamp <= lookaheadEntry.prevTimestamp + || block.timestamp > lookaheadEntry.timestamp + ) { + revert InvalidLookaheadPointer(); + } else if (msg.sender != lookaheadEntry.preconfer) { + revert SenderIsNotThePreconfer(); + } + + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Update the lookahead for the next epoch. + // Only called during the first block proposal of the current epoch. + if (_isLookaheadRequired(epochTimestamp, nextEpochTimestamp)) { + _updateLookahead(nextEpochTimestamp, lookaheadSetParams); + } + + // Block the preconfer from withdrawing stake from the restaking service during the dispute + // window + preconfServiceManager.lockStakeUntil( + msg.sender, block.timestamp + LibPreconfConstants.DISPUTE_PERIOD + ); + + // Forward the block to Taiko's L1 contract + taikoL1.proposeBlocksV2(blockParamsArr, txListArr); + } + + /** + * @notice Proves that the lookahead for a specific slot was incorrect + * @dev The logic in this function only works once the lookahead slot has passed. This is + * because + * we pull the proposer from a past beacon block and verify if it is associated with the + * preconfer. + * @param lookaheadPointer The pointer to the lookahead entry that represents the incorrect slot + * @param slotTimestamp The timestamp of the slot for which the lookahead was incorrect + * @param validatorBLSPubKey The BLS public key of the validator who is proposed the block in + * the slot + * @param validatorInclusionProof The inclusion proof of the above validator in the Beacon state + */ + function proveIncorrectLookahead( + uint256 lookaheadPointer, + uint256 slotTimestamp, + bytes calldata validatorBLSPubKey, + LibEIP4788.InclusionProof calldata validatorInclusionProof + ) + external + { + uint256 epochTimestamp = _getEpochTimestamp(slotTimestamp); + + address poster = getLookaheadPoster(epochTimestamp); + + // Poster must not have been slashed + if (poster == address(0)) { + revert PosterAlreadySlashedOrLookaheadIsEmpty(); + } + + // Must not have missed dispute period + if (block.timestamp - slotTimestamp > LibPreconfConstants.DISPUTE_PERIOD) { + revert MissedDisputeWindow(); + } + + // Verify that the sent validator is the one in Beacon state + LibEIP4788.verifyValidator( + validatorBLSPubKey, _getBeaconBlockRoot(slotTimestamp), validatorInclusionProof + ); + + LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); + + // Validate lookahead pointer + if ( + slotTimestamp > lookaheadEntry.timestamp + || slotTimestamp <= lookaheadEntry.prevTimestamp + ) { + revert InvalidLookaheadPointer(); + } + + // We pull the preconfer present at the required slot timestamp in the lookahead. + // If no preconfer is present for a slot, we simply use the 0-address to denote the + // preconfer. + address preconferInLookahead; + if (lookaheadEntry.timestamp == slotTimestamp && !lookaheadEntry.isFallback) { + // The slot was dedicated to a specific preconfer + preconferInLookahead = lookaheadEntry.preconfer; + } + + // Reduce validator's BLS pub key to the pub key hash expected by the registry + bytes32 validatorPubKeyHash = _getValidatorPubKeyHash(validatorBLSPubKey); + + // Retrieve the validator object + IPreconfRegistry.Validator memory validatorInRegistry = + preconfRegistry.getValidator(validatorPubKeyHash); + + // Fetch the preconfer associated with the validator from the registry + address preconferInRegistry = validatorInRegistry.preconfer; + if ( + slotTimestamp < validatorInRegistry.startProposingAt + || ( + validatorInRegistry.stopProposingAt != 0 + && slotTimestamp >= validatorInRegistry.stopProposingAt + ) + ) { + // The validator is no longer allowed to propose for the former preconfer + preconferInRegistry = address(0); + } + + // Revert if the lookahead preconfer matches the one that the validator pulled from beacon + // state + // is proposing for + if (preconferInLookahead == preconferInRegistry) { + revert LookaheadEntryIsCorrect(); + } + + uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // If it is the current epoch's lookahead being proved incorrect then insert a fallback + // preconfer + if (block.timestamp < epochEndTimestamp) { + uint256 _lookaheadTail = lookaheadTail; + + uint256 lastSlotTimestamp = epochEndTimestamp - LibPreconfConstants.SECONDS_IN_SLOT; + + // If the lookahead for next epoch is available + if (_getLookaheadEntry(_lookaheadTail).timestamp >= epochEndTimestamp) { + // Get to the entry in the next epoch that connects to a slot in the current epoch + while (_getLookaheadEntry(_lookaheadTail).prevTimestamp >= epochEndTimestamp) { + _lookaheadTail -= 1; + } + + // Switch the connection to the last slot of the current epoch + lookahead[_lookaheadTail % LOOKAHEAD_BUFFER_SIZE].prevTimestamp = + uint40(lastSlotTimestamp); + + // Head to the last entry in current epoch + _lookaheadTail -= 1; + } + + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: true, + timestamp: uint40(lastSlotTimestamp), + prevTimestamp: uint40(epochTimestamp - LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: getFallbackPreconfer(epochTimestamp) + }) + ); + + _lookaheadTail -= 1; + + // Nullify the rest of the lookahead entries for this epoch + while (_getLookaheadEntry(_lookaheadTail).timestamp >= epochTimestamp) { + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: false, + timestamp: 0, + prevTimestamp: 0, + preconfer: address(0) + }) + ); + _lookaheadTail -= 1; + } + } + + // Slash the poster + lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE].addr = address(0); + preconfServiceManager.slashOperator(poster); + + emit ProvedIncorrectLookahead(poster, slotTimestamp, msg.sender); + } + + /** + * @notice Forces the lookahead to be set for the next epoch if it is not already set. + * @dev This is called once when the system starts up to push the first lookahead, and later + * anytime + * when the lookahead is lagging due to missed proposals. + * @param lookaheadSetParams Collection of timestamps and preconfer addresses to be inserted in + * the lookahead + */ + function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external { + // Sender must be a preconfer + if (preconfRegistry.getPreconferIndex(msg.sender) == 0) { + revert PreconferNotRegistered(); + } + + // Lookahead must be missing + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + if (!_isLookaheadRequired(epochTimestamp, nextEpochTimestamp)) { + revert LookaheadIsNotRequired(); + } + + // Update the lookahead for next epoch + _updateLookahead(nextEpochTimestamp, lookaheadSetParams); + + // Block the preconfer from withdrawing stake from Eigenlayer during the dispute window + preconfServiceManager.lockStakeUntil( + msg.sender, block.timestamp + LibPreconfConstants.DISPUTE_PERIOD + ); + } + + //========= + // Helpers + //========= + + /// @dev Updates the lookahead for an epoch + function _updateLookahead( + uint256 epochTimestamp, + LookaheadSetParam[] calldata lookaheadSetParams + ) + private + { + uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // The tail of the lookahead is tracked and connected to the first new lookahead entry so + // that when no more preconfers are present in the remaining slots of the current epoch, + // the next epoch's preconfer may start preconfing in advanced. + // + // --[]--[]--[p1]--[]--[]---|---[]--[]--[P2]--[]--[] + // 1 2 3 4 5 6 7 8 9 10 + // Epoch 1 Epoch 2 + // + // Here, P2 may start preconfing and proposing blocks from slot 4 itself + // + uint256 _lookaheadTail = lookaheadTail; + uint256 prevSlotTimestamp = _getLookaheadEntry(_lookaheadTail).timestamp; + + if (lookaheadSetParams.length == 0) { + // If no preconfers are present in the lookahead, we use the fallback preconfer for the + // entire epoch + address fallbackPreconfer = getFallbackPreconfer(epochTimestamp); + _lookaheadTail += 1; + + // and, insert it in the last slot of the epoch so that it may start preconfing in + // advanced + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: true, + timestamp: uint40(epochEndTimestamp - LibPreconfConstants.SECONDS_IN_SLOT), + prevTimestamp: uint40(prevSlotTimestamp), + preconfer: fallbackPreconfer + }) + ); + } else { + for (uint256 i; i < lookaheadSetParams.length; ++i) { + _lookaheadTail += 1; + + address preconfer = lookaheadSetParams[i].preconfer; + uint256 slotTimestamp = lookaheadSetParams[i].timestamp; + + // Each entry must be registered in the preconf registry + if (preconfRegistry.getPreconferIndex(preconfer) == 0) { + revert PreconferNotRegistered(); + } + + // Ensure that the timestamps belong to a valid slot in the epoch + if ( + (slotTimestamp - epochTimestamp) % 12 != 0 || slotTimestamp >= epochEndTimestamp + || slotTimestamp <= prevSlotTimestamp + ) { + revert InvalidSlotTimestamp(); + } + + // Update the lookahead entry + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: false, + timestamp: uint40(slotTimestamp), + prevTimestamp: uint40(prevSlotTimestamp), + preconfer: preconfer + }) + ); + prevSlotTimestamp = slotTimestamp; + } + } + + lookaheadTail = _lookaheadTail; + lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE] = + Poster({ addr: msg.sender, epochTimestamp: uint64(epochTimestamp) }); + + // We directly use the lookahead set params even in the case of a fallback preconfer to + // assist the nodes in identifying an incorrect lookahead. The contents of this event can be + // matched against + // the output of `getLookaheadParamsForEpoch` to verify the correctness of the lookahead. + emit LookaheadUpdated(lookaheadSetParams); + } + + /** + * @notice Computes the timestamp of the epoch containing the provided slot timestamp + */ + function _getEpochTimestamp(uint256 slotTimestamp) private view returns (uint256) { + uint256 timePassedSinceGenesis = slotTimestamp - beaconGenesis; + uint256 timeToCurrentEpochFromGenesis = ( + timePassedSinceGenesis / LibPreconfConstants.SECONDS_IN_EPOCH + ) * LibPreconfConstants.SECONDS_IN_EPOCH; + return beaconGenesis + timeToCurrentEpochFromGenesis; + } + + /** + * @notice Retrieves the beacon block root for the block at the specified timestamp + */ + function _getBeaconBlockRoot(uint256 timestamp) private view returns (bytes32) { + // At block N, we get the beacon block root for block N - 1. So, to get the block root of + // the Nth block, + // we query the root at block N + 1. If N + 1 is a missed slot, we keep querying until we + // find a block N + x + // that has the block root for Nth block. + uint256 targetTimestamp = timestamp + LibPreconfConstants.SECONDS_IN_SLOT; + while (true) { + (bool success, bytes memory result) = + beaconBlockRootContract.staticcall(abi.encode(targetTimestamp)); + if (success && result.length > 0) { + return abi.decode(result, (bytes32)); + } + + unchecked { + targetTimestamp += LibPreconfConstants.SECONDS_IN_SLOT; + } + } + return bytes32(0); + } + + function _getLookaheadEntry(uint256 index) + internal + view + returns (LookaheadBufferEntry memory) + { + return lookahead[index % LOOKAHEAD_BUFFER_SIZE]; + } + + function _setLookaheadEntry(uint256 index, LookaheadBufferEntry memory entry) internal { + lookahead[index % LOOKAHEAD_BUFFER_SIZE] = entry; + } + + function _isLookaheadRequired( + uint256 epochTimestamp, + uint256 nextEpochTimestamp + ) + internal + view + returns (bool) + { + // If it's the first slot of current epoch, we don't need the lookahead since the offchain + // node may not have access to it yet. + return block.timestamp != epochTimestamp + && getLookaheadPoster(nextEpochTimestamp) == address(0); + } + + /** + * @dev Assumes that validatorBLSPubKey is 48 bytes long. + * Puts 16 empty bytes infront to make it equivalent to 48-byte long pub key stored in + * uint256[2] + */ + function _getValidatorPubKeyHash(bytes memory validatorBLSPubKey) + internal + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(bytes16(0), validatorBLSPubKey)); + } + + function _validateEpochTimestamp(uint256 epochTimestamp) internal view { + if ( + epochTimestamp < beaconGenesis + || (epochTimestamp - beaconGenesis) % LibPreconfConstants.SECONDS_IN_EPOCH != 0 + ) { + revert InvalidEpochTimestamp(); + } + } + + //======= + // Views + //======= + + /// @dev We use the beacon block root at the first block in the last epoch as randomness to + /// decide on the preconfer for the given epoch + function getFallbackPreconfer(uint256 epochTimestamp) public view returns (address) { + _validateEpochTimestamp(epochTimestamp); + + uint256 nextPreconferIndex = preconfRegistry.getNextPreconferIndex(); + + // Registry must have at least one preconfer + if (nextPreconferIndex == 1) { + revert NoRegisteredPreconfer(); + } + + // Start of the last epoch + uint256 lastEpochTimestamp = epochTimestamp - LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 randomness = uint256(_getBeaconBlockRoot(lastEpochTimestamp)); + uint256 preconferIndex = randomness % (nextPreconferIndex - 1) + 1; + + return preconfRegistry.getPreconferAtIndex(preconferIndex); + } + + /** + * @notice Returns the full 32 slot preconfer lookahead for the epoch + * @dev This function has been added as a helper for the node to get the full 32 slot lookahead + * without + * the need of deconstructing the contract storage. Due to the fact that we are deconstructing + * an efficient + * data structure to fill in all the slots, this is very heavy on gas, and onchain calls to it + * should be avoided. + * @param epochTimestamp The start timestamp of the epoch for which the lookahead is to be + * generated + */ + function getLookaheadForEpoch(uint256 epochTimestamp) + external + view + returns (address[SLOTS_IN_EPOCH] memory) + { + _validateEpochTimestamp(epochTimestamp); + + address[SLOTS_IN_EPOCH] memory lookaheadForEpoch; + + uint256 _lookaheadTail = lookaheadTail; + uint256 lastSlotTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Take the tail to the entry that fills the last slot of the epoch. + // This may be an entry in the next epoch who starts preconfing in advanced. + // This may also be an empty slot since the lookahead for next epoch is not yet posted. + while (_getLookaheadEntry(_lookaheadTail).prevTimestamp >= lastSlotTimestamp) { + _lookaheadTail -= 1; + } + + LookaheadBufferEntry memory _entry = _getLookaheadEntry(_lookaheadTail); + + // Iterate backwards and fill in the slots + for (uint256 i = SLOTS_IN_EPOCH; i > 0; --i) { + if (_entry.timestamp >= lastSlotTimestamp) { + lookaheadForEpoch[i - 1] = _entry.preconfer; + } + + lastSlotTimestamp -= LibPreconfConstants.SECONDS_IN_SLOT; + if (lastSlotTimestamp == _entry.prevTimestamp) { + _lookaheadTail -= 1; + // Reuse the memory space of _entry + _entry.preconfer = _getLookaheadEntry(_lookaheadTail).preconfer; + _entry.prevTimestamp = _getLookaheadEntry(_lookaheadTail).prevTimestamp; + } + } + + return lookaheadForEpoch; + } + + /** + * @notice Builds and returns lookahead set parameters for an epoch + * @dev This function can be used by the offchain node to create the lookahead to be posted. + * @param epochTimestamp The start timestamp of the epoch for which the lookahead is to be + * generated + * @param validatorBLSPubKeys The BLS public keys of the validators who are expected to propose + * in the epoch + * in the same sequence as they appear in the epoch. So at index n - 1, we have the validator + * for slot n in that + * epoch. + */ + function getLookaheadParamsForEpoch( + uint256 epochTimestamp, + bytes[SLOTS_IN_EPOCH] memory validatorBLSPubKeys + ) + external + view + returns (LookaheadSetParam[] memory) + { + _validateEpochTimestamp(epochTimestamp); + + uint256 index; + LookaheadSetParam[32] memory lookaheadSetParamsTemp; + + for (uint256 i = 0; i < 32; ++i) { + uint256 slotTimestamp = epochTimestamp + (i * LibPreconfConstants.SECONDS_IN_SLOT); + + // Fetch the validator object from the registry + IPreconfRegistry.Validator memory validator = + preconfRegistry.getValidator(_getValidatorPubKeyHash(validatorBLSPubKeys[i])); + + // Skip deregistered preconfers + if (preconfRegistry.getPreconferIndex(validator.preconfer) == 0) { + continue; + } + + // If the validator is allowed to propose in the epoch, add the associated preconfer to + // the lookahead + if ( + validator.preconfer != address(0) && slotTimestamp >= validator.startProposingAt + && (validator.stopProposingAt == 0 || slotTimestamp < validator.stopProposingAt) + ) { + lookaheadSetParamsTemp[index] = + LookaheadSetParam({ timestamp: slotTimestamp, preconfer: validator.preconfer }); + ++index; + } + } + + // Not very gas efficient, but is okay for a view expected to be used offchain + LookaheadSetParam[] memory lookaheadSetParams = new LookaheadSetParam[](index); + for (uint256 i; i < index; ++i) { + lookaheadSetParams[i] = lookaheadSetParamsTemp[i]; + } + + return lookaheadSetParams; + } + + /// @dev Returns true if the contract is expecting a lookahead for the next epoch + function isLookaheadRequired() external view returns (bool) { + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + return _isLookaheadRequired(epochTimestamp, nextEpochTimestamp); + } + + function getPreconfServiceManager() external view returns (address) { + return address(preconfServiceManager); + } + + function getPreconfRegistry() external view returns (address) { + return address(preconfRegistry); + } + + function getTaikoL1() external view returns (address) { + return address(taikoL1); + } + + function getBeaconGenesis() external view returns (uint256) { + return beaconGenesis; + } + + function getBeaconBlockRootContract() external view returns (address) { + return beaconBlockRootContract; + } + + function getLookaheadTail() external view returns (uint256) { + return lookaheadTail; + } + + function getLookaheadBuffer() + external + view + returns (LookaheadBufferEntry[LOOKAHEAD_BUFFER_SIZE] memory) + { + LookaheadBufferEntry[LOOKAHEAD_BUFFER_SIZE] memory _lookahead; + for (uint256 i; i < LOOKAHEAD_BUFFER_SIZE; ++i) { + _lookahead[i] = lookahead[i]; + } + return _lookahead; + } + + function getLookaheadPoster(uint256 epochTimestamp) public view returns (address) { + _validateEpochTimestamp(epochTimestamp); + Poster memory poster = lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE]; + return poster.epochTimestamp == epochTimestamp ? poster.addr : address(0); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol new file mode 100644 index 00000000000..c7d839ac6d8 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol @@ -0,0 +1,466 @@ +// SPDX-License-Identifier: MIT +// Functions in this library have been adapted from: +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/src/HashToCurve.sol +pragma solidity ^0.8.24; + +library LibBLS12381 { + using LibBLS12381 for *; + + struct FieldPoint2 { + uint256[2] u; + uint256[2] u_I; + } + + struct G1Point { + uint256[2] x; + uint256[2] y; + } + + struct G2Point { + uint256[2] x; + uint256[2] x_I; + uint256[2] y; + uint256[2] y_I; + } + + /// @dev Referenced from https://eips.ethereum.org/EIPS/eip-2537#curve-parameters + function baseFieldModulus() internal pure returns (uint256[2] memory) { + return [ + 0x000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd7, + 0x64774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab + ]; + } + + /// @dev Referenced from https://eips.ethereum.org/EIPS/eip-2537#curve-parameters + function negGeneratorG1() internal pure returns (G1Point memory) { + return G1Point({ + x: [ + 0x0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0f, + 0xc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb + ], + y: [ + 0x00000000000000000000000000000000114d1d6855d545a8aa7d76c8cf2e21f2, + 0x67816aef1db507c96655b9d5caac42364e6f38ba0ecb751bad54dcd6b939c2ca + ] + }); + } + + /** + * @notice Negates a G1 point, by reflecting it over the x-axis + * @dev Assumes that the Y coordinate is always less than the field modulus + * @param point The G1 point to negate + */ + function negate(G1Point memory point) internal pure returns (G1Point memory) { + uint256[2] memory fieldModulus = baseFieldModulus(); + uint256[2] memory yNeg; + + // Perform word-wise elementary subtraction + if (fieldModulus[1] < point.y[1]) { + yNeg[1] = type(uint256).max - (point.y[1] - fieldModulus[1]) + 1; + fieldModulus[0] -= 1; // borrow + } else { + yNeg[1] = fieldModulus[1] - point.y[1]; + } + yNeg[0] = fieldModulus[0] - point.y[0]; + + return G1Point({ x: point.x, y: yNeg }); + } + + /** + * @notice Transforms a sequence of bytes into a G2 point + * @dev Based on https://datatracker.ietf.org/doc/html/rfc9380 + * @param message The message to hash + * @param dst The domain separation tag + */ + function hashToCurveG2( + bytes memory message, + bytes memory dst + ) + internal + view + returns (G2Point memory r) + { + // 1. u = hash_to_field(msg, 2) + FieldPoint2[2] memory u = hashToFieldFp2(message, dst); + // 2. Q0 = map_to_curve(u[0]) + G2Point memory q0 = u[0].mapToG2(); + // 3. Q1 = map_to_curve(u[1]) + G2Point memory q1 = u[1].mapToG2(); + // 4. R = Q0 + Q1 + r = q0.plus(q1); + // 5. P = clear_cofactor(R) + // Not needed as map fp to g2 already does it + } + + /** + * @notice Transforms a sequence of bytes into an element in the FP2 field + * @dev Based on https://datatracker.ietf.org/doc/html/rfc9380 + * @param message The message to hash + * @param dst The domain separation tag + */ + function hashToFieldFp2( + bytes memory message, + bytes memory dst + ) + internal + view + returns (FieldPoint2[2] memory) + { + // 1. len_in_bytes = count * m * L + // so always 2 * 2 * 64 = 256 + uint16 lenInBytes = 256; + // 2. uniform_bytes = expand_message(msg, DST, len_in_bytes) + uint256[] memory pseudoRandomBytes = _expandMsgXmd(message, dst, lenInBytes); + FieldPoint2[2] memory u; + // No loop here saves 800 gas hardcoding offset an additional 300 + // 3. for i in (0, ..., count - 1): + // 4. for j in (0, ..., m - 1): + // 5. elm_offset = L * (j + i * m) + // 6. tv = substr(uniform_bytes, elm_offset, HTF_L) + // uint8 HTF_L = 64; + // bytes memory tv = new bytes(64); + // 7. e_j = OS2IP(tv) mod p + // 8. u_i = (e_0, ..., e_(m - 1)) + // tv = bytes.concat(pseudo_random_bytes[0], pseudo_random_bytes[1]); + u[0].u = _modfield(pseudoRandomBytes[0], pseudoRandomBytes[1]); + u[0].u_I = _modfield(pseudoRandomBytes[2], pseudoRandomBytes[3]); + u[1].u = _modfield(pseudoRandomBytes[4], pseudoRandomBytes[5]); + u[1].u_I = _modfield(pseudoRandomBytes[6], pseudoRandomBytes[7]); + // 9. return (u_0, ..., u_(count - 1)) + return u; + } + + /** + * @notice Returns a G1Point in the compressed form + * @dev Based on + * https://github.com/zcash/librustzcash/blob/6e0364cd42a2b3d2b958a54771ef51a8db79dd29/pairing/src/bls12_381/README.md#serialization + * @param point The G1 point to compress + */ + function compress(G1Point memory point) internal pure returns (uint256[2] memory) { + uint256[2] memory r = point.x; + + // Set the first MSB + r[0] = r[0] | (1 << 127); + + // Second MSB is left to be 0 since we are assuming that no infinity points are involved + + // Set the third MSB if point.y is lexicographically larger than the y in negated point + if (_greaterThan(point.y, point.negate().y)) { + r[0] = r[0] | (1 << 125); + } + + return r; + } + + //================== + // Precompile calls + //================== + + /** + * @notice Adds two G2 points using the precompile at 0x0e + */ + function plus( + G2Point memory point1, + G2Point memory point2 + ) + internal + view + returns (G2Point memory) + { + uint256[8] memory r; + + uint256[16] memory input = [ + point1.x[0], + point1.x[1], + point1.x_I[0], + point1.x_I[1], + point1.y[0], + point1.y[1], + point1.y_I[0], + point1.y_I[1], + point2.x[0], + point2.x[1], + point2.x_I[0], + point2.x_I[1], + point2.y[0], + point2.y[1], + point2.y_I[0], + point2.y_I[1] + ]; + + // ABI for G2 addition precompile + // G2 addition call expects 512 bytes as an input that is interpreted as byte concatenation + // of two G2 points (256 bytes each). Output is an encoding of addition operation result - + // single G2 point (256 bytes). + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 800 + 0x0e, // address of BLS12_G2ADD + input, //input offset + 512, // input size + r, // output offset + 256 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return _resolveG2Point(r); + } + + /** + * @notice Maps an element of the FP2 field to a G2 point using the precompile at 0x13 + */ + function mapToG2(FieldPoint2 memory fp2) internal view returns (G2Point memory) { + uint256[8] memory r; + + uint256[4] memory input = [fp2.u[0], fp2.u[1], fp2.u_I[0], fp2.u_I[1]]; + + // ABI for mapping Fp2 element to G2 point precompile + // Field-to-curve call expects 128 bytes an an input that is interpreted as a an element of + // the quadratic extension field. Output of this call is 256 bytes and is G2 point following + // respective encoding rules. + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 75000 + 0x13, // address of BLS12_MAP_FP2_TO_G2 + input, //input offset + 128, // input size + r, // output offset + 256 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return _resolveG2Point(r); + } + + /** + * @notice Pairing check using the precompile at 0x11 + */ + function pairing( + G1Point memory a1, + G2Point memory b1, + G1Point memory a2, + G2Point memory b2 + ) + internal + view + returns (bool) + { + bool[1] memory r; + + uint256[24] memory input = [ + a1.x[0], + a1.x[1], + a1.y[0], + a1.y[1], + b1.x[0], + b1.x[1], + b1.x_I[0], + b1.x_I[1], + b1.y[0], + b1.y[1], + b1.y_I[0], + b1.y_I[1], + a2.x[0], + a2.x[1], + a2.y[0], + a2.y[1], + b2.x[0], + b2.x[1], + b2.x_I[0], + b2.x_I[1], + b2.y[0], + b2.y[1], + b2.y_I[0], + b2.y_I[1] + ]; + + // ABI for pairing precompile + // Pairing expects 384 (G1Point = 128 bytes, G2Point = 256 bytes) * k bytes as input. + // In this case, since two pairs of points are being passed, the input size is 384 * 2 = 768 + // bytes. + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 151000 + 0x11, // address of BLS12_PAIRING + input, //input offset + 768, // input size + r, // output offset + 32 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return r[0]; + } + + //========= + // Helpers + //========= + + function _expandMsgXmd( + bytes memory message, + bytes memory dst, + uint16 lenInBytes + ) + internal + pure + returns (uint256[] memory) + { + // 1. ell = ceil(len_in_bytes / b_in_bytes) + // b_in_bytes seems to be 32 for sha256 + // ceil the division + uint256 ell = (lenInBytes - 1) / 32 + 1; + + // 2. ABORT if ell > 255 or len_in_bytes > 65535 or len(DST) > 255 + require(ell <= 255, "len_in_bytes too large for sha256"); + // Not really needed because of parameter type + // require(lenInBytes <= 65535, "len_in_bytes too large"); + // no length normalizing via hashing + require(dst.length <= 255, "dst too long"); + + bytes memory dstPrime = bytes.concat(dst, bytes1(uint8(dst.length))); + + // 4. Z_pad = I2OSP(0, s_in_bytes) + // this should be sha256 blocksize so 64 bytes + bytes memory zPad = + hex"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + + // 5. l_i_b_str = I2OSP(len_in_bytes, 2) + // length in byte string? + bytes2 libStr = bytes2(lenInBytes); + + // 6. msg_prime = Z_pad || msg || l_i_b_str || I2OSP(0, 1) || DST_prime + bytes memory msgPrime = bytes.concat(zPad, message, libStr, hex"00", dstPrime); + + uint256 b_0; + uint256[] memory b = new uint256[](ell); + + // 7. b_0 = H(msg_prime) + b_0 = uint256(sha256(msgPrime)); + + // 8. b_1 = H(b_0 || I2OSP(1, 1) || DST_prime) + b[0] = uint256(sha256(bytes.concat(bytes32(b_0), hex"01", dstPrime))); + + // 9. for i in (2, ..., ell): + for (uint8 i = 2; i <= ell; i++) { + // 10. b_i = H(strxor(b_0, b_(i - 1)) || I2OSP(i, 1) || DST_prime) + bytes memory tmp = abi.encodePacked(b_0 ^ b[i - 2], i, dstPrime); + b[i - 1] = uint256(sha256(tmp)); + } + // 11. uniform_bytes = b_1 || ... || b_ell + // 12. return substr(uniform_bytes, 0, len_in_bytes) + // Here we don't need the uniform_bytes because b is already properly formed + return b; + } + + function _modfield(uint256 _b1, uint256 _b2) internal view returns (uint256[2] memory r) { + assembly { + let bl := 0x40 + let ml := 0x40 + + let freemem := mload(0x40) // Free memory pointer is always stored at 0x40 + + // arg[0] = base.length @ +0 + mstore(freemem, bl) + // arg[1] = exp.length @ +0x20 + mstore(add(freemem, 0x20), 0x20) + // arg[2] = mod.length @ +0x40 + mstore(add(freemem, 0x40), ml) + + // arg[3] = base.bits @ + 0x60 + // places the first 32 bytes of _b1 and the last 32 bytes of _b2 + mstore(add(freemem, 0x60), _b1) + mstore(add(freemem, 0x80), _b2) + + // arg[4] = exp.bits @ +0x60+base.length + // exponent always 1 + mstore(add(freemem, 0xa0), 1) + + // arg[5] = mod.bits @ +96+base.length+exp.length + // this field_modulus as hex + // 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787 + // we add the 0 prefix so that the result will be exactly 64 bytes + // saves 300 gas per call instead of sending it along every time + // places the first 32 bytes and the last 32 bytes of the field modulus + mstore( + add(freemem, 0xc0), + 0x000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd7 + ) + mstore( + add(freemem, 0xe0), + 0x64774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab + ) + + // Invoke contract 0x5, put return value right after mod.length, @ 0x60 + let success := + staticcall( + sub(gas(), 1350), // gas + 0x5, // mpdexp precompile + freemem, //input offset + 0x100, // input size = 0x60+base.length+exp.length+mod.length + add(freemem, 0x60), // output offset + ml // output size + ) + if iszero(success) { revert(0, 0) } + + // point to mod length, result was placed immediately after + r := add(freemem, 0x60) + //adjust freemem pointer + mstore(0x40, add(add(freemem, 0x60), ml)) + } + } + + /** + * @notice Returns true if `a` is lexicographically greater than `b` + * @dev It makes the comparison bit-wise. + * This functions also assumes that the passed values are 48-byte long BLS pub keys that have + * 16 functional bytes in the first word, and 32 bytes in the second. + */ + function _greaterThan(uint256[2] memory a, uint256[2] memory b) internal pure returns (bool) { + uint256 wordA; + uint256 wordB; + uint256 mask; + + // Only compare the unequal words + if (a[0] == b[0]) { + wordA = a[1]; + wordB = b[1]; + mask = 1 << 255; + } else { + wordA = a[0]; + wordB = b[0]; + mask = 1 << 127; // Only check for lower 16 bytes in the first word + } + + // We may safely set the control value to be less than 256 since it is guaranteed that the + // the loop returns if the first words are different. + for (uint256 i; i < 256; ++i) { + uint256 x = wordA & mask; + uint256 y = wordB & mask; + + if (x == 0 && y != 0) return false; + if (x != 0 && y == 0) return true; + + mask = mask >> 1; + } + + return false; + } + + function _resolveG2Point(uint256[8] memory flattened) internal pure returns (G2Point memory) { + return G2Point({ + x: [flattened[0], flattened[1]], + x_I: [flattened[2], flattened[3]], + y: [flattened[4], flattened[5]], + y_I: [flattened[6], flattened[7]] + }); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol new file mode 100644 index 00000000000..3ec591cdfbd --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./LibBLS12381.sol"; + +library LibBLSSignature { + using LibBLS12381 for *; + + /// @dev The domain separation tag for the BLS signature + function dst() internal pure returns (bytes memory) { + // Set based on the recommendations of RFC9380 + return bytes("Taiko Based Rollup Preconfirmation v0.1.0"); + } + + /** + * @notice Returns `true` if the BLS signature on the message matches against the public key + * @param message The message bytes + * @param sig The BLS signature + * @param pubkey The BLS public key of the expected signer + */ + function verifySignature( + bytes memory message, + LibBLS12381.G2Point memory sig, + LibBLS12381.G1Point memory pubkey + ) + public + view + returns (bool) + { + // Hash the message bytes into a G2 point + LibBLS12381.G2Point memory msgG2 = message.hashToCurveG2(dst()); + + // Return the pairing check that denotes the correctness of the signature + return LibBLS12381.pairing(pubkey, msgG2, LibBLS12381.negGeneratorG1(), sig); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol new file mode 100644 index 00000000000..1331f708a25 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT + +// Referenced from: https://ethresear.ch/t/slashing-proofoor-on-chain-slashed-validator-proofs/19421 +pragma solidity ^0.8.24; + +import "./LibMerkleUtils.sol"; + +library LibEIP4788 { + struct InclusionProof { + // `Chunks` of the SSZ encoded validator + bytes32[8] validator; + // Index of the validator in the beacon state validator list + uint256 validatorIndex; + // Proof of inclusion of validator in beacon state validator list + bytes32[] validatorProof; + // Root of the validator list in the beacon state + bytes32 validatorsRoot; + // Proof of inclusion of validator list in the beacon state + bytes32[] beaconStateProof; + // Root of the beacon state + bytes32 beaconStateRoot; + // Proof of inclusion of beacon state in the beacon block + bytes32[] beaconBlockProofForState; + // Proof of inclusion of the validator index in the beacon block + bytes32[] beaconBlockProofForProposerIndex; + } + + /// @dev The validator pub key failed verification against the pub key hash tree root in the + /// validator chunks + error InvalidValidatorBLSPubKey(); + /// @dev The proof that the validator is a part of the validator list is invalid. + error ValidatorProofFailed(); + /// @dev The proof that the validator list is a part of the beacon state is invalid. + error BeaconStateProofFailed(); + /// @dev The proof that the beacon state is a part of the beacon block is invalid. + error BeaconBlockProofForStateFailed(); + /// @dev The proof that the actual validator index is a part of the beacon is invalid. + error BeaconBlockProofForProposerIndex(); + + function verifyValidator( + bytes memory validatorBLSPubKey, + bytes32 beaconBlockRoot, + InclusionProof memory inclusionProof + ) + internal + pure + { + // Validator's BLS public key is verified against the hash tree root within Validator chunks + bytes32 pubKeyHashTreeRoot = sha256(abi.encodePacked(validatorBLSPubKey, bytes16(0))); + if (pubKeyHashTreeRoot != inclusionProof.validator[0]) { + revert InvalidValidatorBLSPubKey(); + } + + // Validator is verified against the validator list in the beacon state + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(inclusionProof.validator); + if ( + !LibMerkleUtils.verifyProof( + inclusionProof.validatorProof, + inclusionProof.validatorsRoot, + validatorHashTreeRoot, + inclusionProof.validatorIndex + ) + ) { + // Revert if the proof that the expected validator is a part of the validator + // list in beacon state fails + revert ValidatorProofFailed(); + } + + if ( + !LibMerkleUtils.verifyProof( + inclusionProof.beaconStateProof, + inclusionProof.beaconStateRoot, + inclusionProof.validatorsRoot, + 11 + ) + ) { + // Revert if the proof that the validator list is a part of the beacon state fails + revert BeaconStateProofFailed(); + } + + // Beacon state is verified against the beacon block + if ( + !LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForState, + beaconBlockRoot, + inclusionProof.beaconStateRoot, + 3 + ) + ) { + // Revert if the proof for the beacon state being a part of the beacon block fails + revert BeaconBlockProofForStateFailed(); + } + + // Validator index is verified against the beacon block + if ( + !LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForProposerIndex, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(inclusionProof.validatorIndex), + 1 + ) + ) { + // Revert if the proof that the proposer index is a part of the beacon block fails + revert BeaconBlockProofForProposerIndex(); + } + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol new file mode 100644 index 00000000000..6b5214cfdac --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +library LibMerkleUtils { + uint256 internal constant CHUNKS_LENGTH = 8; + uint256 internal constant TMP_LENGTH = 4; + + function hash(bytes32 a, bytes32 b) internal pure returns (bytes32) { + return sha256(abi.encodePacked(a, b)); + } + + function merkleize(bytes32[CHUNKS_LENGTH] memory chunks) internal pure returns (bytes32) { + bytes32[] memory tmp = new bytes32[](TMP_LENGTH); + + for (uint256 i; i < CHUNKS_LENGTH; ++i) { + merge(tmp, i, chunks[i]); + } + + return tmp[TMP_LENGTH - 1]; + } + + function merge(bytes32[] memory tmp, uint256 index, bytes32 chunk) internal pure { + bytes32 h = chunk; + uint256 j = 0; + while (true) { + if (index & 1 << j == 0) { + break; + } else { + h = hash(tmp[j], h); + } + j += 1; + } + tmp[j] = h; + } + + function verifyProof( + bytes32[] memory proof, + bytes32 root, + bytes32 leaf, + uint256 leafIndex + ) + internal + pure + returns (bool) + { + bytes32 h = leaf; + uint256 index = leafIndex; + + for (uint256 i = 0; i < proof.length; i++) { + bytes32 proofElement = proof[i]; + + if (index % 2 == 0) { + h = sha256(bytes.concat(h, proofElement)); + } else { + h = sha256(bytes.concat(proofElement, h)); + } + + index = index / 2; + } + + return h == root; + } + + function toLittleEndian(uint256 n) internal pure returns (bytes32) { + uint256 v = n; + v = ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) + | ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8); + v = ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) + | ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16); + v = ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) + | ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32); + v = ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) + | ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64); + v = (v >> 128) | (v << 128); + return bytes32(v); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol new file mode 100644 index 00000000000..fd73adb3889 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../impl/LibPreconfConstants.sol"; +import "../libs/LibBLSSignature.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../avs-mvp/iface/IAVSDirectory.sol"; + +contract MockPreconfRegistry is IPreconfRegistry, Initializable { + using LibBLS12381 for LibBLS12381.G1Point; + + IPreconfServiceManager internal immutable preconfServiceManager; + + uint256 internal nextPreconferIndex; + + // Maps the preconfer's address to an index that may change over the lifetime of a preconfer + mapping(address preconfer => uint256 index) internal preconferToIndex; + + // Maps an index to the preconfer's address + // We need this mapping to deregister a preconfer in O(1) time. + // While it may also be done by just using the above map and sending a "witness" that is + // calculated offchain, + // we ideally do not want the node to maintain historical state. + mapping(uint256 index => address preconfer) internal indexToPreconfer; + + // Maps a validator's BLS pub key hash to the validator's details + mapping(bytes32 publicKeyHash => Validator validator) internal validators; + + constructor(IPreconfServiceManager _preconfServiceManager) { + preconfServiceManager = _preconfServiceManager; + } + + function init() external initializer { + nextPreconferIndex = 1; + } + + /** + * @notice Registers a preconfer in the registry by giving it a non-zero index + * @dev This function internally accesses Eigenlayer via the AVS service manager + * @param operatorSignature The signature of the operator in the format expected by Eigenlayer + */ + function registerPreconfer(bytes calldata operatorSignature) external { + // Preconfer must not have registered already + if (preconferToIndex[msg.sender] != 0) { + revert PreconferAlreadyRegistered(); + } + + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[msg.sender] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = msg.sender; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + + emit PreconferRegistered(msg.sender); + + preconfServiceManager.registerOperatorToAVS(msg.sender, operatorSignature); + } + + /** + * @notice Deregisters a preconfer from the registry by setting its index to zero + * @dev It assigns the index of the last preconfer to the preconfer being removed and + * decrements the global index counter. + */ + function deregisterPreconfer() external { + // Preconfer must have registered already + if (preconferToIndex[msg.sender] == 0) { + revert PreconferNotRegistered(); + } + + unchecked { + uint256 _nextPreconferIndex = nextPreconferIndex - 1; + + // Update to the decremented index to account for the removed preconfer + nextPreconferIndex = _nextPreconferIndex; + + uint256 removedPreconferIndex = preconferToIndex[msg.sender]; + address lastPreconfer = indexToPreconfer[_nextPreconferIndex]; + + // Remove the preconfer and exchange its index with the last preconfer + preconferToIndex[msg.sender] = 0; + preconferToIndex[lastPreconfer] = removedPreconferIndex; + indexToPreconfer[removedPreconferIndex] = lastPreconfer; + } + + emit PreconferDeregistered(msg.sender); + + preconfServiceManager.deregisterOperatorFromAVS(msg.sender); + } + + /** + * @notice Assigns a validator to a preconfer + * @dev The function allows different validators to be assigned to different preconfers, but + * generally, it will be called by a preconfer to assign validators to itself. + * @param addValidatorParams Contains the public key, signature, expiry, and preconfer + */ + function addValidators(AddValidatorParam[] calldata addValidatorParams) external { + for (uint256 i; i < addValidatorParams.length; ++i) { + // Revert if preconfer is not registered + if (preconferToIndex[msg.sender] == 0) { + revert PreconferNotRegistered(); + } + + // bytes memory message = _createMessage(ValidatorOp.ADD, + // addValidatorParams[i].signatureExpiry, msg.sender); + + // Revert if any signature is invalid + //if (!verifySignature(message, addValidatorParams[i].signature, + // addValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + //} + + // Revert if the signature has expired + if (block.timestamp > addValidatorParams[i].signatureExpiry) { + revert ValidatorSignatureExpired(); + } + + // Point compress the public key just how it is done on the consensus layer + uint256[2] memory compressedPubKey = addValidatorParams[i].pubkey.compress(); + // Use the hash for ease of mapping + bytes32 pubKeyHash = keccak256(abi.encodePacked(compressedPubKey)); + + Validator memory validator = validators[pubKeyHash]; + + // Update the validator if it has no preconfer assigned, or if it has stopped proposing + // for the former preconfer + if ( + validator.preconfer == address(0) + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt) + ) { + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); + } + } else { + // Validator is already proposing for a preconfer + revert ValidatorAlreadyActive(); + } + + emit ValidatorAdded(pubKeyHash, msg.sender); + } + } + + /** + * @notice Unassigns a validator from a preconfer + * @dev Instead of removing the validator immediately, we delay the removal by two epochs, + * & set the `stopProposingAt` timestamp. + * @param removeValidatorParams Contains the public key, signature and expiry + */ + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external { + for (uint256 i; i < removeValidatorParams.length; ++i) { + // Point compress the public key just how it is done on the consensus layer + uint256[2] memory compressedPubKey = removeValidatorParams[i].pubkey.compress(); + // Use the hash for ease of mapping + bytes32 pubKeyHash = keccak256(abi.encodePacked(compressedPubKey)); + + Validator memory validator = validators[pubKeyHash]; + + // Revert if the validator is not active (or already removed, but waiting to stop + // proposing) + if (validator.preconfer == address(0) || validator.stopProposingAt != 0) { + revert ValidatorAlreadyInactive(); + } + + bytes memory message = _createMessage( + ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, validator.preconfer + ); + + // Revert if any signature is invalid + if ( + !LibBLSSignature.verifySignature( + message, removeValidatorParams[i].signature, removeValidatorParams[i].pubkey + ) + ) { + revert InvalidValidatorSignature(); + } + + // Revert if the signature has expired + if (block.timestamp > removeValidatorParams[i].signatureExpiry) { + revert ValidatorSignatureExpired(); + } + + unchecked { + // We also need to delay the removal by two epochs to avoid contradicting the + // lookahead + validators[pubKeyHash].stopProposingAt = + uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS); + } + + emit ValidatorRemoved(pubKeyHash, validator.preconfer); + } + } + + //======= + // Views + //======= + + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory) + { + return _createMessage(validatorOp, expiry, preconfer); + } + + function getPreconfServiceManager() external view returns (address) { + return address(preconfServiceManager); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } + + //========= + // Helpers + //========= + + function _createMessage( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + internal + view + returns (bytes memory) + { + return abi.encodePacked(block.chainid, validatorOp, expiry, preconfer); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol b/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol new file mode 100644 index 00000000000..2f6d915e32e --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockTaikoToken { + address public lastAddr; + uint256 public lastAmount; + + function approve(address spender, uint256 amount) external returns (bool) { + lastAddr = spender; + lastAmount = amount; + return true; + } +} diff --git a/packages/protocol/contracts/layer2/based/Lib1559Math.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol similarity index 98% rename from packages/protocol/contracts/layer2/based/Lib1559Math.sol rename to packages/protocol/contracts/layer2/based/LibEIP1559.sol index 44f91ff2484..1c0b2593fd9 100644 --- a/packages/protocol/contracts/layer2/based/Lib1559Math.sol +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -4,12 +4,12 @@ pragma solidity ^0.8.24; import "@solady/src/utils/FixedPointMathLib.sol"; import "src/shared/common/LibMath.sol"; -/// @title Lib1559Math +/// @title LibEIP1559 /// @notice Implements e^(x) based bonding curve for EIP-1559 /// @dev See https://ethresear.ch/t/make-eip-1559-more-like-an-amm-curve/9082 but some minor /// difference as stated in docs/eip1559_on_l2.md. /// @custom:security-contact security@taiko.xyz -library Lib1559Math { +library LibEIP1559 { using LibMath for uint256; uint128 public constant MAX_EXP_INPUT = 135_305_999_368_893_231_588; diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol index 663f46e073d..2d64a3f9229 100644 --- a/packages/protocol/contracts/layer2/based/TaikoL2.sol +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -9,7 +9,7 @@ import "src/shared/common/EssentialContract.sol"; import "src/shared/common/LibStrings.sol"; import "src/shared/common/LibAddress.sol"; import "src/shared/signal/ISignalService.sol"; -import "./Lib1559Math.sol"; +import "./LibEIP1559.sol"; import "./LibL2Config.sol"; import "./IBlockHash.sol"; @@ -268,7 +268,7 @@ contract TaikoL2 is EssentialContract, IBlockHash { { LibL2Config.Config memory config = LibL2Config.get(); - (basefee_, parentGasExcess_) = Lib1559Math.calc1559BaseFee( + (basefee_, parentGasExcess_) = LibEIP1559.calc1559BaseFee( uint256(config.gasTargetPerL1Block) * config.basefeeAdjustmentQuotient, parentGasExcess, uint64(_anchorBlockId - lastSyncedBlock) * config.gasTargetPerL1Block, @@ -298,7 +298,7 @@ contract TaikoL2 is EssentialContract, IBlockHash { pure returns (uint64 newGasExcess_) { - return Lib1559Math.adjustExcess(_currGasExcess, _currGasTarget, _newGasTarget); + return LibEIP1559.adjustExcess(_currGasExcess, _currGasTarget, _newGasTarget); } /// @notice Tells if we need to validate basefee (for simulation). @@ -340,7 +340,7 @@ contract TaikoL2 is EssentialContract, IBlockHash { uint256 gasTarget = uint256(_baseFeeConfig.gasIssuancePerSecond) * _baseFeeConfig.adjustmentQuotient; - return Lib1559Math.calc1559BaseFee( + return LibEIP1559.calc1559BaseFee( gasTarget, _parentGasExcess, gasIssuance, _parentGasUsed, _baseFeeConfig.minGasExcess ); } diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index d22f925e5d4..f66986cfb74 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -8,10 +8,9 @@ ffi = true memory_limit = 2_073_741_824 solc_version = "0.8.27" remappings = [ - "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", - "openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", - "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", - "openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "openzeppelin/=node_modules/@openzeppelin/", + "@openzeppelin=node_modules/@openzeppelin", + "@openzeppelin-upgrades/contracts/=node_modules/@openzeppelin/contracts-upgradeable/", "@risc0/contracts/=node_modules/risc0-ethereum/contracts/src/", "@solady/=node_modules/solady/", "@optimism/=node_modules/optimism/", @@ -19,6 +18,8 @@ remappings = [ "forge-std/=node_modules/forge-std/", "ds-test/=node_modules/ds-test/src/", "@p256-verifier/contracts/=node_modules/p256-verifier/src/", + "eigenlayer-middleware/=node_modules/eigenlayer-middleware/", + "eigenlayer-contracts/=node_modules/eigenlayer-contracts/", "src/=contracts/", "test/=test/", "script/=script/", diff --git a/packages/protocol/package.json b/packages/protocol/package.json index a066d9a0ad6..00f523d589b 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -44,6 +44,8 @@ "@openzeppelin/contracts": "4.9.6", "@openzeppelin/contracts-upgradeable": "4.9.6", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", + "eigenlayer-contracts": "github:Layr-labs/eigenlayer-contracts#dev", + "eigenlayer-middleware": "github:layr-Labs/eigenlayer-middleware#mainnet", "forge-std": "github:foundry-rs/forge-std#v1.7.5", "merkletreejs": "^0.4.0", "optimism": "github:ethereum-optimism/optimism#v1.8.0", diff --git a/packages/protocol/script/layer1/preconf/BaseScript.sol b/packages/protocol/script/layer1/preconf/BaseScript.sol new file mode 100644 index 00000000000..e0a8926d9ae --- /dev/null +++ b/packages/protocol/script/layer1/preconf/BaseScript.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract BaseScript is Script { + modifier broadcast() { + uint256 privateKey = vm.envUint("PRIVATE_KEY"); + require(privateKey != 0, "BaseScript: invalid private key"); + + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function deployProxy( + address _impl, + address _admin, + bytes memory _data + ) + internal + returns (address) + { + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(_impl, _admin, _data); + return address(proxy); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol b/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol new file mode 100644 index 00000000000..702f4df46a4 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/based/ITaikoL1.sol"; +import "src/layer1/preconf/impl/PreconfRegistry.sol"; +import "src/layer1/preconf/avs-mvp/PreconfServiceManager.sol"; +import "src/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol"; +import "src/layer1/preconf/avs-mvp/iface/ISlasher.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; + +import "../BaseScript.sol"; +import "../misc/EmptyContract.sol"; + +contract DeployAVS is BaseScript { + // Required by service manager + address public implDirectory = vm.envAddress("AVS_DIRECTORY"); + address public slasher = vm.envAddress("SLASHER"); + + // Required by task manager + address public taikoL1 = vm.envAddress("TAIKO_L1"); + address public taikoToken = vm.envAddress("TAIKO_TOKEN"); + uint256 public beaconGenesisTimestamp = vm.envUint("BEACON_GENESIS_TIMESTAMP"); + address public beaconBlockRootContract = vm.envAddress("BEACON_BLOCK_ROOT_CONTRACT"); + + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address preconfRegistry = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfServiceManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfTaskManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + PreconfRegistry preconfRegistryImpl = + new PreconfRegistry(IPreconfServiceManager(preconfServiceManager)); + PreconfServiceManager preconfServiceManagerImpl = new PreconfServiceManager( + preconfRegistry, preconfTaskManager, IAVSDirectory(implDirectory), ISlasher(slasher) + ); + PreconfTaskManager preconfTaskManagerImpl = new PreconfTaskManager( + IPreconfServiceManager(preconfServiceManager), + IPreconfRegistry(preconfRegistry), + ITaikoL1(taikoL1), + beaconGenesisTimestamp, + beaconBlockRootContract + ); + + // Upgrade proxies with implementations + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfRegistry), + address(preconfRegistryImpl), + abi.encodeCall(PreconfRegistry.init, ()) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(preconfServiceManager), address(preconfServiceManagerImpl) + ); + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfTaskManager), + address(preconfTaskManagerImpl), + abi.encodeCall(PreconfTaskManager.init, IERC20(taikoToken)) + ); + + console2.log("Proxy admin: ", address(proxyAdmin)); + console2.log("Preconf Registry: ", preconfRegistry); + console2.log("Preconf Service Manager: ", preconfServiceManager); + console2.log("Preconf Task Manager: ", preconfTaskManager); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol b/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol new file mode 100644 index 00000000000..cec20b27f87 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/preconf/avs-mvp/impl/DelegationManager.sol"; +import "src/layer1/preconf/avs-mvp/impl/StrategyManager.sol"; +import "src/layer1/preconf/avs-mvp/impl/Slasher.sol"; +import "src/layer1/preconf/avs-mvp/impl/AVSDirectory.sol"; + +import "../BaseScript.sol"; +import "../misc/EmptyContract.sol"; + +contract DeployEigenlayerMVP is BaseScript { + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address avsDirectory = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address delegationManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address strategyManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address slasher = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + AVSDirectory avsDirectoryImpl = new AVSDirectory(); + DelegationManager delegationManagerImpl = + new DelegationManager(IStrategyManager(strategyManager)); + StrategyManager strategyManagerImpl = + new StrategyManager(IDelegationManager(delegationManager)); + Slasher slasherImpl = new Slasher(); + + // Upgrade proxies with implementations + proxyAdmin.upgrade(ITransparentUpgradeableProxy(avsDirectory), address(avsDirectoryImpl)); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(delegationManager), address(delegationManagerImpl) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(strategyManager), address(strategyManagerImpl) + ); + proxyAdmin.upgrade(ITransparentUpgradeableProxy(slasher), address(slasherImpl)); + + console2.log("AVS Directory: ", avsDirectory); + console2.log("Delegation Manager: ", delegationManager); + console2.log("Strategy Manager: ", strategyManager); + console2.log("Slasher: ", slasher); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh b/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh new file mode 100644 index 00000000000..eb494a26207 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh @@ -0,0 +1,17 @@ +set -e + +: "${PRIVATE_KEY:?Environment variable PRIVATE_KEY is required}" +: "${FORK_URL:?Environment variable FORK_URL is required}" +: "${AVS_DIRECTORY:?Environment variable AVS_DIRECTORY is required}" +: "${SLASHER:?Environment variable SLASHER is required}" +: "${TAIKO_L1:?Environment variable TAIKO_L1 is required}" +: "${TAIKO_TOKEN:?Environment variable TAIKO_TOKEN is required}" +: "${BEACON_GENESIS_TIMESTAMP:?Environment variable BEACON_GENESIS_TIMESTAMP is required}" +: "${BEACON_BLOCK_ROOT_CONTRACT:?Environment variable BEACON_BLOCK_ROOT_CONTRACT is required}" +echo "BEACON_GENESIS_TIMESTAMP: $BEACON_GENESIS_TIMESTAMP" + +forge script scripts/deployment/DeployAVS.s.sol:DeployAVS \ + --fork-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --private-key $PRIVATE_KEY \ No newline at end of file diff --git a/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh b/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh new file mode 100644 index 00000000000..b0465281eb1 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh @@ -0,0 +1,10 @@ +set -e + +: "${PRIVATE_KEY:?Environment variable PRIVATE_KEY is required}" +: "${FORK_URL:?Environment variable FORK_URL is required}" + +forge script scripts/deployment/DeployEigenlayerMVP.s.sol:DeployEigenlayerMVP \ + --rpc-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --private-key $PRIVATE_KEY \ No newline at end of file diff --git a/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol new file mode 100644 index 00000000000..a0dbcb9d095 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/based/ITaikoL1.sol"; +import "src/layer1/preconf/mock/MockPreconfRegistry.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; +import "src/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol"; +import "src/layer1/preconf/avs-mvp/iface/ISlasher.sol"; +import "src/layer1/preconf/avs-mvp/PreconfServiceManager.sol"; + +import "../../BaseScript.sol"; +import "../../misc/EmptyContract.sol"; + +contract DeployMockAVS is BaseScript { + // Required by service manager + address public avsDirectory = vm.envAddress("AVS_DIRECTORY"); + address public slasher = vm.envAddress("SLASHER"); + + // Required by task manager + address public taikoL1 = vm.envAddress("TAIKO_L1"); + address public taikoToken = vm.envAddress("TAIKO_TOKEN"); + uint256 public beaconGenesisTimestamp = vm.envUint("BEACON_GENESIS_TIMESTAMP"); + address public beaconBlockRootContract = vm.envAddress("BEACON_BLOCK_ROOT_CONTRACT"); + + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address preconfRegistry = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfServiceManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfTaskManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + MockPreconfRegistry preconfRegistryImpl = + new MockPreconfRegistry(IPreconfServiceManager(preconfServiceManager)); + PreconfServiceManager preconfServiceManagerImpl = new PreconfServiceManager( + preconfRegistry, preconfTaskManager, IAVSDirectory(avsDirectory), ISlasher(slasher) + ); + PreconfTaskManager preconfTaskManagerImpl = new PreconfTaskManager( + IPreconfServiceManager(preconfServiceManager), + IPreconfRegistry(preconfRegistry), + ITaikoL1(taikoL1), + beaconGenesisTimestamp, + beaconBlockRootContract + ); + + // Upgrade proxies with implementations + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfRegistry), + address(preconfRegistryImpl), + abi.encodeCall(MockPreconfRegistry.init, ()) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(preconfServiceManager), address(preconfServiceManagerImpl) + ); + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfTaskManager), + address(preconfTaskManagerImpl), + abi.encodeCall(PreconfTaskManager.init, IERC20(taikoToken)) + ); + + console2.log("Proxy admin: ", address(proxyAdmin)); + console2.log("Preconf Registry: ", preconfRegistry); + console2.log("Preconf Service Manager: ", preconfServiceManager); + console2.log("Preconf Task Manager: ", preconfTaskManager); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol new file mode 100644 index 00000000000..a9a8428beea --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "src/layer1/preconf/mock/MockTaikoToken.sol"; +import "../../BaseScript.sol"; + +contract DeployMockTaikoToken is BaseScript { + function run() external broadcast { + MockTaikoToken myContract = new MockTaikoToken(); + console2.log("MockTaikoToken:", address(myContract)); + } +} diff --git a/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol b/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol new file mode 100644 index 00000000000..c1158fe8b1f --- /dev/null +++ b/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @dev This is solely used as a placeholder during empty proxy deployment +contract EmptyContract { } diff --git a/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol index cd641b3c919..1f2d71a67ce 100644 --- a/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol @@ -7,16 +7,15 @@ import "forge-std/src/StdJson.sol"; import "@optimism/packages/contracts-bedrock/src/libraries/Bytes.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import { P256Verifier } from "@p256-verifier/contracts/P256Verifier.sol"; +import "@p256-verifier/contracts/P256Verifier.sol"; import "src/layer1/verifiers/SgxVerifier.sol"; -import { AutomataDcapV3Attestation } from - "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; -import { SigVerifyLib } from "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; -import { PEMCertChainLib } from "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; -import { V3Struct } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { BytesUtils } from "src/layer1/automata-attestation/utils/BytesUtils.sol"; -import { Base64 } from "solady/src/utils/Base64.sol"; +import "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "src/layer1/automata-attestation/utils/BytesUtils.sol"; +import "solady/src/utils/Base64.sol"; import "../utils/DcapTestUtils.t.sol"; import "../utils/V3QuoteParseUtils.t.sol"; diff --git a/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol index c4afdd57283..6cc808c00f0 100644 --- a/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { TCBInfoStruct } from "src/layer1/automata-attestation/lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from "src/layer1/automata-attestation/lib/EnclaveIdStruct.sol"; -import { V3Struct } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; +import "src/layer1/automata-attestation/lib/TCBInfoStruct.sol"; +import "src/layer1/automata-attestation/lib/EnclaveIdStruct.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "solady/src/utils/JSONParserLib.sol"; +import "solady/src/utils/LibString.sol"; contract DcapTestUtils { using JSONParserLib for JSONParserLib.Item; diff --git a/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol index ed09df809c6..ae40bc25c0e 100644 --- a/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol @@ -1,14 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { V3Struct } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; -import { IPEMCertChainLib } from - "src/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; -import { Base64 } from "solady/src/utils/Base64.sol"; -import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; +import "src/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "solady/src/utils/Base64.sol"; +import "solady/src/utils/JSONParserLib.sol"; +import "solady/src/utils/LibString.sol"; contract V3QuoteParseUtils { using JSONParserLib for JSONParserLib.Item; diff --git a/packages/protocol/test/layer1/based/MockTaikoL1.sol b/packages/protocol/test/layer1/based/MockTaikoL1.sol new file mode 100644 index 00000000000..344a51ffc7f --- /dev/null +++ b/packages/protocol/test/layer1/based/MockTaikoL1.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/ITaikoL1.sol"; + +/// @title MockTaikoL1 +/// @custom:security-contact security@taiko.xyz +contract MockTaikoL1 is ITaikoL1 { + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + virtual + returns (TaikoData.BlockMetadataV2 memory meta_) + { } + + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + virtual + returns (TaikoData.BlockMetadataV2[] memory metaArr_) + { } + + function proveBlock(uint64 _blockId, bytes calldata _input) external virtual { } + + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external + virtual + { } + + function verifyBlocks(uint64 _maxBlocksToVerify) external virtual { } + + function pauseProving(bool _pause) external virtual { } + + function depositBond(uint256 _amount) external virtual { } + + function withdrawBond(uint256 _amount) external virtual { } + + function getVerifiedBlockProver(uint64 _blockId) external view virtual returns (address) { } + + function getBlockV2(uint64 _blockId) + external + view + virtual + returns (TaikoData.BlockV2 memory blk_) + { } + + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + virtual + returns (TaikoData.TransitionState memory) + { } + + function getConfig() external pure virtual returns (TaikoData.Config memory) { } +} diff --git a/packages/protocol/test/layer1/preconf/BaseTest.sol b/packages/protocol/test/layer1/preconf/BaseTest.sol new file mode 100644 index 00000000000..de6486e533a --- /dev/null +++ b/packages/protocol/test/layer1/preconf/BaseTest.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Test.sol"; + +contract BaseTest is Test { + address addr_1 = vm.addr(1); + address addr_2 = vm.addr(2); + address addr_3 = vm.addr(3); + address addr_4 = vm.addr(4); + address addr_5 = vm.addr(5); + address addr_6 = vm.addr(6); + address addr_7 = vm.addr(7); + address addr_8 = vm.addr(8); + address addr_9 = vm.addr(9); + address addr_10 = vm.addr(10); +} diff --git a/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol b/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol new file mode 100644 index 00000000000..e162fe84025 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/preconf/libs/LibMerkleUtils.sol"; +import "../BaseTest.sol"; +import "../fixtures/BeaconProofs.sol"; + +/// @dev The beacon chain data used here is from slot 9000000 on Ethereum mainnet. +contract BeaconProofsVerification is BaseTest { + function test_beaconProofsVerification_validatorInclusionInValidatorList() public { + bytes32[8] memory validatorChunks = BeaconProofs.validatorChunks(); + + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(validatorChunks); + + bytes32[] memory validatorProof = BeaconProofs.validatorProof(); + + bytes32 validatorsRoot = BeaconProofs.validatorsRoot(); + uint256 validatorIndex = BeaconProofs.validatorIndex(); + + assertTrue( + LibMerkleUtils.verifyProof( + validatorProof, validatorsRoot, validatorHashTreeRoot, validatorIndex + ) + ); + } + + function test_beaconProofsVerification_validatorListInclusionInBeaconState() public { + bytes32[] memory beaconStateProofForValidatorList = + BeaconProofs.beaconStateProofForValidatorList(); + + bytes32 validatorListRoot = BeaconProofs.validatorsRoot(); + bytes32 beaconStateRoot = BeaconProofs.beaconStateRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconStateProofForValidatorList, beaconStateRoot, validatorListRoot, 11 + ) + ); + } + + function test_beaconProofsVerification_beaconStateInclusionInBeaconBlock() public { + bytes32[] memory beaconBlockProofForBeaconState = + BeaconProofs.beaconBlockProofForBeaconState(); + + bytes32 beaconStateRoot = BeaconProofs.beaconStateRoot(); + bytes32 beaconBlockRoot = BeaconProofs.beaconBlockRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconBlockProofForBeaconState, beaconBlockRoot, beaconStateRoot, 3 + ) + ); + } + + function test_beaconProofsVerification_proposerInclusionInBeaconBlock() public { + bytes32[] memory beaconBlockProofForProposer = BeaconProofs.beaconBlockProofForProposer(); + + uint256 validatorIndex = BeaconProofs.validatorIndex(); + bytes32 beaconBlockRoot = BeaconProofs.beaconBlockRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconBlockProofForProposer, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(validatorIndex), + 1 + ) + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol b/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol new file mode 100644 index 00000000000..f0b53ef580b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/BlocksFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract BlockProposing is BlocksFixtures { + function setUp() public override { + super.setUp(); + } + + function test_newBlockProposal_preconferCanProposeBlockInAdvanced_Case1() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to an arbitrary timestamp before the preconfer's slot + uint256 currentSlotTimestamp = + currentEpochStart + (10 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 1 proposes the block + vm.prank(addr_1); + _newBlockProposal("Block Params", "Txn List", 1, lookaheadSetParams); + } + + function test_newBlockProposal_preconferCanProposeBlockInAdvanced_Case2() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to an arbitrary timestamp after Address 1's slot but before Address 3's slot + uint256 currentSlotTimestamp = + currentEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 3 proposes the block in advance + vm.prank(addr_3); + _newBlockProposal("Block Params 2", "Txn List 2", 2, lookaheadSetParams); + } + + function test_newBlockProposal_preconferCanProposeBlockAtDedicatedSlot() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to the exact timestamp of the preconfer's dedicated slot + uint256 currentSlotTimestamp = + currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 1 proposes the block at its dedicated slot + vm.prank(addr_1); + _newBlockProposal("Block Params 3", "Txn List 3", 1, lookaheadSetParams); + } + + function test_newBlockProposal_updatesLookaheadForNextEpoch() external { + // Prepare initial lookahead + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 nextEpochStart = currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + + uint256 currentSlotTimestamp = currentEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT); + // Warp to a slot where address 1 can propose a block + vm.warp(currentSlotTimestamp); + + // Prepare lookahead set for the next epoch + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + // Slot 10 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: addr_1 + }); + // Slot 20 + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: addr_2 + }); + + // Address 1 proposes a block and updates the lookahead + vm.prank(addr_1); + _newBlockProposal("Block Params", "Txn List", 1, lookaheadSetParams); + + // Verify that the lookahead for the next epoch has been updated + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + + // Check the first entry + assertEq(lookaheadBuffer[3].preconfer, addr_1); + assertEq( + lookaheadBuffer[3].timestamp, nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq( + lookaheadBuffer[3].prevTimestamp, + currentEpochStart + (22 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[3].isFallback, false); + + // Check the second entry + assertEq(lookaheadBuffer[4].preconfer, addr_2); + assertEq( + lookaheadBuffer[4].timestamp, + nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq( + lookaheadBuffer[4].prevTimestamp, + nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[4].isFallback, false); + + // Verify that the lookahead tail has been updated + assertEq(preconfTaskManager.getLookaheadTail(), 4); + + // Verify that the lookahead poster for the next epoch has been set + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + } + + function test_newBlockProposal_revertWhenTimestampAboveDedicatedSlot() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 dedicatedSlotTimestamp = + currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a timestamp after the dedicated slot + vm.warp(dedicatedSlotTimestamp + LibPreconfConstants.SECONDS_IN_SLOT); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 1, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenTimestampBelowPrevTimestamp() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 prevSlotTimestamp = currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a timestamp before the previous slot + vm.warp(prevSlotTimestamp - LibPreconfConstants.SECONDS_IN_SLOT); + + vm.prank(addr_3); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenTimestampEqualToPrevTimestamp() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 prevSlotTimestamp = currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to the exact timestamp of the previous slot + vm.warp(prevSlotTimestamp); + + vm.prank(addr_3); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenSenderIsNotThePreconfer() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 currentSlotTimestamp = + currentEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a slot when Address 3 is the expected preconfer + vm.warp(currentSlotTimestamp); + + // Try to propose with a different address than the expected preconfer + vm.prank(addr_2); // addr_2 is not the expected preconfer (It is addr_3) + vm.expectRevert(IPreconfTaskManager.SenderIsNotThePreconfer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function _newBlockProposal( + bytes memory blockParams, + bytes memory txList, + uint256 lookaheadPointer, + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams + ) + internal + { + bytes[] memory blockParamsArr = new bytes[](1); + blockParamsArr[0] = blockParams; + + bytes[] memory txListArr = new bytes[](1); + txListArr[0] = txList; + + preconfTaskManager.newBlockProposals( + blockParamsArr, txListArr, lookaheadPointer, lookaheadSetParams + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol b/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol new file mode 100644 index 00000000000..2a9d893faf8 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +// Test has been referenced from +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/test/expandMsgXmd.sol +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +contract BLSExpendMsgXmd is BaseTest { + bytes internal expand_msg_dst = "QUUX-V01-CS02-with-expander-SHA256-128"; + + function test_expandMsgXmd_empty_msg_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("", expand_msg_dst, 0x20); + uint256 expected = 0x68a985b87eb6b46952128911f2a4412bbc302a9d759667f87f7a21d803f07235; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_abc_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("abc", expand_msg_dst, 0x20); + uint256 expected = 0xd8ccab23b5985ccea865c6c97b6e5b8350e794e603b4b97902f53a8a0d605615; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_abcdef0123456789_0x20() public { + uint256[] memory result = + LibBLS12381._expandMsgXmd("abcdef0123456789", expand_msg_dst, 0x20); + uint256 expected = 0xeff31487c770a893cfb36f912fbfcbff40d5661771ca4b2cb4eafe524333f5c1; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_q128_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + expand_msg_dst, + 0x20 + ); + uint256 expected = 0xb23a1d2b4d97b2ef7785562a7e8bac7eed54ed6e97e29aa51bfe3f12ddad1ff9; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_a512_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + expand_msg_dst, + 0x20 + ); + uint256 expected = 0x4623227bcc01293b8c130bf771da8c298dede7383243dc0993d2d94823958c4c; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_empty_msg_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("", expand_msg_dst, 0x80); + bytes memory expected = + hex"af84c27ccfd45d41914fdff5df25293e221afc53d8ad2ac06d5e3e29485dadbee0d121587713a3e0dd4d5e69e93eb7cd4f5df4cd103e188cf60cb02edc3edf18eda8576c412b18ffb658e3dd6ec849469b979d444cf7b26911a08e63cf31f9dcc541708d3491184472c2c29bb749d4286b004ceb5ee6b9a7fa5b646c993f0ced"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_abc_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("abc", expand_msg_dst, 0x80); + bytes memory expected = + hex"abba86a6129e366fc877aab32fc4ffc70120d8996c88aee2fe4b32d6c7b6437a647e6c3163d40b76a73cf6a5674ef1d890f95b664ee0afa5359a5c4e07985635bbecbac65d747d3d2da7ec2b8221b17b0ca9dc8a1ac1c07ea6a1e60583e2cb00058e77b7b72a298425cd1b941ad4ec65e8afc50303a22c0f99b0509b4c895f40"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_abcdef0123456789_0x80() public { + uint256[] memory result = + LibBLS12381._expandMsgXmd("abcdef0123456789", expand_msg_dst, 0x80); + bytes memory expected = + hex"ef904a29bffc4cf9ee82832451c946ac3c8f8058ae97d8d629831a74c6572bd9ebd0df635cd1f208e2038e760c4994984ce73f0d55ea9f22af83ba4734569d4bc95e18350f740c07eef653cbb9f87910d833751825f0ebefa1abe5420bb52be14cf489b37fe1a72f7de2d10be453b2c9d9eb20c7e3f6edc5a60629178d9478df"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_q128_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + expand_msg_dst, + 0x80 + ); + bytes memory expected = + hex"80be107d0884f0d881bb460322f0443d38bd222db8bd0b0a5312a6fedb49c1bbd88fd75d8b9a09486c60123dfa1d73c1cc3169761b17476d3c6b7cbbd727acd0e2c942f4dd96ae3da5de368d26b32286e32de7e5a8cb2949f866a0b80c58116b29fa7fabb3ea7d520ee603e0c25bcaf0b9a5e92ec6a1fe4e0391d1cdbce8c68a"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_a512_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + expand_msg_dst, + 0x80 + ); + bytes memory expected = + hex"546aff5444b5b79aa6148bd81728704c32decb73a3ba76e9e75885cad9def1d06d6792f8a7d12794e90efed817d96920d728896a4510864370c207f99bd4a608ea121700ef01ed879745ee3e4ceef777eda6d9e5e38b90c86ea6fb0b36504ba4a45d22e86f6db5dd43d98a294bebb9125d5b794e9d2a81181066eb954966a487"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol b/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol new file mode 100644 index 00000000000..da305ab7957 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +// Test has been referenced from +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/test/hashToField.sol +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +contract BLSHashToFieldFp2 is BaseTest { + bytes internal hash_to_dst = "QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_"; + + function test_hashToFieldFp2_empty_msg() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2("", hash_to_dst); + bytes memory expected_u0 = + hex"0000000000000000000000000000000003dbc2cce174e91ba93cbb08f26b917f98194a2ea08d1cce75b2b9cc9f21689d80bd79b594a613d0a68eb807dfdc1cf8"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000005a2acec64114845711a54199ea339abd125ba38253b70a92c876df10598bd1986b739cad67961eb94f7076511b3b39a"; + bytes memory expected_u1 = + hex"0000000000000000000000000000000002f99798e8a5acdeed60d7e18e9120521ba1f47ec090984662846bc825de191b5b7641148c0dbc237726a334473eee94"; + bytes memory expected_u1_I = + hex"00000000000000000000000000000000145a81e418d4010cc027a68f14391b30074e89e60ee7a22f87217b2f6eb0c4b94c9115b436e6fa4607e95a98de30a435"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_abc() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2("abc", hash_to_dst); + bytes memory expected_u0 = + hex"0000000000000000000000000000000015f7c0aa8f6b296ab5ff9c2c7581ade64f4ee6f1bf18f55179ff44a2cf355fa53dd2a2158c5ecb17d7c52f63e7195771"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000001c8067bf4c0ba709aa8b9abc3d1cef589a4758e09ef53732d670fd8739a7274e111ba2fcaa71b3d33df2a3a0c8529dd"; + bytes memory expected_u1 = + hex"00000000000000000000000000000000187111d5e088b6b9acfdfad078c4dacf72dcd17ca17c82be35e79f8c372a693f60a033b461d81b025864a0ad051a06e4"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000008b852331c96ed983e497ebc6dee9b75e373d923b729194af8e72a051ea586f3538a6ebb1e80881a082fa2b24df9f566"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hash_to_field_msg_fp2_abcdef0123456789() public { + LibBLS12381.FieldPoint2[2] memory result = + LibBLS12381.hashToFieldFp2("abcdef0123456789", hash_to_dst); + bytes memory expected_u0 = + hex"000000000000000000000000000000000313d9325081b415bfd4e5364efaef392ecf69b087496973b229303e1816d2080971470f7da112c4eb43053130b785e1"; + bytes memory expected_u0_I = + hex"00000000000000000000000000000000062f84cb21ed89406890c051a0e8b9cf6c575cf6e8e18ecf63ba86826b0ae02548d83b483b79e48512b82a6c0686df8f"; + bytes memory expected_u1 = + hex"000000000000000000000000000000001739123845406baa7be5c5dc74492051b6d42504de008c635f3535bb831d478a341420e67dcc7b46b2e8cba5379cca97"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000001897665d9cb5db16a27657760bbea7951f67ad68f8d55f7113f24ba6ddd82caef240a9bfa627972279974894701d975"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_q128() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + hash_to_dst + ); + bytes memory expected_u0 = + hex"00000000000000000000000000000000025820cefc7d06fd38de7d8e370e0da8a52498be9b53cba9927b2ef5c6de1e12e12f188bbc7bc923864883c57e49e253"; + bytes memory expected_u0_I = + hex"00000000000000000000000000000000034147b77ce337a52e5948f66db0bab47a8d038e712123bb381899b6ab5ad20f02805601e6104c29df18c254b8618c7b"; + bytes memory expected_u1 = + hex"000000000000000000000000000000000930315cae1f9a6017c3f0c8f2314baa130e1cf13f6532bff0a8a1790cd70af918088c3db94bda214e896e1543629795"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000010c4df2cacf67ea3cb3108b00d4cbd0b3968031ebc8eac4b1ebcefe84d6b715fde66bef0219951ece29d1facc8a520ef"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_a512() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + hash_to_dst + ); + bytes memory expected_u0 = + hex"00000000000000000000000000000000190b513da3e66fc9a3587b78c76d1d132b1152174d0b83e3c1114066392579a45824c5fa17649ab89299ddd4bda54935"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000012ab625b0fe0ebd1367fe9fac57bb1168891846039b4216b9d94007b674de2d79126870e88aeef54b2ec717a887dcf39"; + bytes memory expected_u1 = + hex"000000000000000000000000000000000e6a42010cf435fb5bacc156a585e1ea3294cc81d0ceb81924d95040298380b164f702275892cedd81b62de3aba3f6b5"; + bytes memory expected_u1_I = + hex"00000000000000000000000000000000117d9a0defc57a33ed208428cb84e54c85a6840e7648480ae428838989d25d97a0af8e3255be62b25c2a85630d2dddd8"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol b/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol new file mode 100644 index 00000000000..9caf95cdaea --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// solhint-disable-next-line +pragma solidity ^0.8.24; + +import "script/layer1/preconf/BaseScript.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +/** + * @dev At the time of writing this (Sept, 2024) foundry does not support the LibBLS12381 + * precompile, + * thus + * a traditional foundry test is not possible for hash to curve functionality. Instead, we test it + * manually by sending a transaction to a Pectra devnet and verify the outputs on the explorer. + */ +contract BLSHashToCurveG2 is BaseScript { + function run() external broadcast { + Target target = new Target(); + target.hashToCurveG2(); + } +} + +contract Target { + bytes internal HASH_TO_G2_DST = "QUUX-V01-CS02-with-LibBLS12381G2_XMD:SHA-256_SSWU_RO_"; + + event Output(LibBLS12381.G2Point); + + function hashToCurveG2() external { + /** + * Expected output: + * 0x0000000000000000000000000000000002c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e600000000000000000000000000000000139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8000000000000000000000000000000001787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba480000000000000000000000000000000000aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16 + */ + emit Output(LibBLS12381.hashToCurveG2("abc", HASH_TO_G2_DST)); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol b/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol new file mode 100644 index 00000000000..244b2bcf629 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +// solhint-disable-next-line +pragma solidity ^0.8.24; + +import "script/layer1/preconf/BaseScript.sol"; +import "src/layer1/preconf/libs/LibBLSSignature.sol"; + +/** + * @dev At the time of writing this (Sept, 2024) foundry does not support the LibBLS12381 + * precompile, + * thus + * a traditional foundry test is not possible to verify a signature. Instead, we test it + * manually by sending a transaction to a Pectra devnet and verify the outputs on the explorer. + */ +contract BLSVerifySignature is BaseScript { + using LibBLS12381 for *; + + function run() external broadcast { + Target target = new Target(); + target.verify(); + } +} + +contract Target { + event Output(bool); + + function verify() external { + LibBLS12381.G2Point memory sig = LibBLS12381.G2Point({ + x: [ + 0x00000000000000000000000000000000075785f1ffe7faabd27259035731c4ff, + 0x881c38e87fc963a47425ce52f12f18c348370eaea53008bc683206d7770f5bdf + ], + x_I: [ + 0x0000000000000000000000000000000002f8146bf138cbc35aeeccd4570d121c, + 0x8aec29661e8108e4094dc37b5a499272a6a680f015d0527c312a82457db8b979 + ], + y: [ + 0x000000000000000000000000000000000f5357626a9be51a0e689244b1a28d7b, + 0xe6132ad16f8d1852c2c75804fccf473902a5b8bbe6dd182d04643f34bb34fbe6 + ], + y_I: [ + 0x000000000000000000000000000000000544d2c2834eebb7cfbd5498cc0c328b, + 0x619d482161808b7e27dbb92941df85f704a6218ce9903af72eabdb3dbead70c7 + ] + }); + + LibBLS12381.G1Point memory pubkey = LibBLS12381.G1Point({ + x: [ + 0x00000000000000000000000000000000101936a69d6fbd2feae29545220ad66e, + 0xb60c3171b8d15de582dd2c645f67cb32377de0c97666e4b4fc7fad8a1c9a81af + ], + y: [ + 0x00000000000000000000000000000000056cde7adcc8f412efa58ee343569d76, + 0xa95176133a52fbf43979f46c0658010c573c093f3814a5d4dded92b52d197dff + ] + }); + + /** + * Expected output using DST as empty string "": + * 0x0000000000000000000000000000000000000000000000000000000000000001 + */ + emit Output(LibBLSSignature.verifySignature("abc", sig, pubkey)); + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol b/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol new file mode 100644 index 00000000000..e6ada1d91c3 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/preconf/libs/LibEIP4788.sol"; + +/// @dev Data has been taken from beacon block at slot 9000000 on Ethereum mainnet +library BeaconProofs { + function validator() internal pure returns (bytes memory) { + return + hex"98fb8eacf684f80712faa9354535620f94a10687c2243c0cdae7280cf6220fb64c78e49efe8eef599406b33e5aac4dd0"; + } + + function validatorsRoot() internal pure returns (bytes32) { + return 0x0ccf56d8e76d16306c6e6e78ec20c07be5fa5ae89b18873b43cc823075a5df0b; + } + + function validatorIndex() internal pure returns (uint256) { + return 912_203; + } + + function beaconStateRoot() internal pure returns (bytes32) { + return 0xcd918afbe365c6dcabab551e32fae5f3f9677433876049dc035e5135122a2e7e; + } + + function beaconBlockRoot() internal pure returns (bytes32) { + return 0xcc8a36da0d5112c8dd602530ac7c7b8364edfd92cdc6f0d62365de392e8e5bb6; + } + + function validatorChunks() internal pure returns (bytes32[8] memory) { + bytes32[8] memory chunks; + chunks[0] = 0x8d7c2b324f41a1d395fc265d42c6e1293b38c33a674244cae9ac67d68367036d; + chunks[1] = 0x0100000000000000000000006661be71769ff00c5e403f327869505caf0b7f70; + chunks[2] = 0x0040597307000000000000000000000000000000000000000000000000000000; + chunks[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + chunks[4] = 0xe271030000000000000000000000000000000000000000000000000000000000; + chunks[5] = 0x6084030000000000000000000000000000000000000000000000000000000000; + chunks[6] = 0xffffffffffffffff000000000000000000000000000000000000000000000000; + chunks[7] = 0xffffffffffffffff000000000000000000000000000000000000000000000000; + + return chunks; + } + + function validatorProof() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](41); + proof[0] = 0xf5ee350215176477a7fb48aa80292de237856ad3068f46728da26aedca8a3b2b; + proof[1] = 0xfbeca4cff4f86c2ff5f1ff6808f57b12e7a6f3365d59a35c90f19715995f8be8; + proof[2] = 0x06ee0000b0cf0c0531c2a4f3368eb8df6079216bb6cca127a76e459c62058615; + proof[3] = 0x5b8c291888e7936b46e36d7b71d36c846fbfc04d48cab6beb20e23642f64ee69; + proof[4] = 0xa748ed979e88b53c303ece0946d13d2def12e003b90b562474dac1768d1d0975; + proof[5] = 0xe667bf725f0e72f47409d089248b50a9a11d08591b83374f18ed338f5c3ff964; + proof[6] = 0xd86b77a649fad1d48e109b8bc98d2a2dbc88a4b9b86c5e06878e0b980ebda3b7; + proof[7] = 0xc2db7c18d080f2b21f2c981f65414d00b0cc8542fda38233fa1c1ee33df4bbe1; + proof[8] = 0xe72e80d2ce704957f507af587e19a61ceadad2411c9728315e1f294fadae23f1; + proof[9] = 0x32f30ee3311d96e0544e2e4b0f4e1e1863d06224636ea8004e49a27280a81a11; + proof[10] = 0x89d191926d7681be7545b42b9ef95d413fbe1d8c014400c5ece8141be300b238; + proof[11] = 0x0c924ac306b692750b3285f974edf991dd4f05fff0ab3dd114430499722ff93b; + proof[12] = 0x1eb9a358bbe044159a2bed16a0b69b5b988ba0c57f2c267cfd390b3fb86fde6a; + proof[13] = 0xda60132f38fc053c26ba06136e03a861fd5e59734dc3e6cc1b69c072b9ce600a; + proof[14] = 0xcee182aa676671046ccf49213a58ef8d35e227a3adfaa146f7b71dc47c7bdd73; + proof[15] = 0xf1d0df094ceceed165886daf4c52c467710ed19a53df98ab2607629dbf7036ba; + proof[16] = 0x81917306117277e02aa4174ae73a2ec414862aced0491ec933434d9bd2279e3f; + proof[17] = 0xc562f7ffddaec138272a84b043216c1c906f68198f752ad6b80171794fcba3b5; + proof[18] = 0xcdfeaaff006b40d110ff925b18bffc36cf55543a35c84d25da0b196ea81c6029; + proof[19] = 0x8bd5e9cadc78cd0b0e0abd32a63a39596ad24e14552926bce0f6c54e39c29b99; + proof[20] = 0x6187b4f2f4b3e572fe26a6c73567ab5b1695303b0ad9dd5c9ab9679266fba2e3; + proof[21] = 0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c; + proof[22] = 0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167; + proof[23] = 0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7; + proof[24] = 0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0; + proof[25] = 0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544; + proof[26] = 0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765; + proof[27] = 0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4; + proof[28] = 0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1; + proof[29] = 0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636; + proof[30] = 0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c; + proof[31] = 0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7; + proof[32] = 0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff; + proof[33] = 0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5; + proof[34] = 0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d; + proof[35] = 0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c; + proof[36] = 0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327; + proof[37] = 0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74; + proof[38] = 0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76; + proof[39] = 0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f; + proof[40] = 0x2821150000000000000000000000000000000000000000000000000000000000; + + return proof; + } + + function beaconStateProofForValidatorList() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](5); + proof[0] = 0x8c53160000000000000000000000000000000000000000000000000000000000; + proof[1] = 0xd9cb62ffd113d2a2b71b4539c54bf01587d8a2a5a7c81baa2c2ae89d245578d6; + proof[2] = 0xefbad4c97640101fc18122e8b818e8cc3c278a18e05dc601af4095d5519d834a; + proof[3] = 0x775d61d75ab0731115447847764383a42283b502eb4ed3ca7ba412ac67da5138; + proof[4] = 0xbb5cf5c0273b8d100f329ea0c78c471d0833f048c7fc264c285c3696d7aed412; + + return proof; + } + + function beaconBlockProofForBeaconState() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](3); + proof[0] = 0xf47de6dfa04049ce0586d989821321111d896f3cc37e40637fc226bee212e43d; + proof[1] = 0x7506bc99ed6f0e48ad0e1ded3e878dfcfe08ca4a89308910ba1941e912673258; + proof[2] = 0x00f48b46fd6aac7f8a72d8e1eed4f3b5bd244bf6242cb538ca94b44aed02857a; + + return proof; + } + + function beaconBlockProofForProposer() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](3); + proof[0] = 0x4054890000000000000000000000000000000000000000000000000000000000; + proof[1] = 0xd22083672621f940e26b3f1e627f8c311a3f5f0874c193b40974f244668e1372; + proof[2] = 0x00f48b46fd6aac7f8a72d8e1eed4f3b5bd244bf6242cb538ca94b44aed02857a; + + return proof; + } + + function eip4788ValidatorInclusionProof() + internal + pure + returns (LibEIP4788.InclusionProof memory) + { + return LibEIP4788.InclusionProof({ + validator: validatorChunks(), + validatorIndex: validatorIndex(), + validatorProof: validatorProof(), + validatorsRoot: validatorsRoot(), + beaconStateProof: beaconStateProofForValidatorList(), + beaconStateRoot: beaconStateRoot(), + beaconBlockProofForState: beaconBlockProofForBeaconState(), + beaconBlockProofForProposerIndex: beaconBlockProofForProposer() + }); + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol b/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol new file mode 100644 index 00000000000..291da5cb39b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "../mocks/MockPreconfRegistry.sol"; +import "../mocks/MockPreconfServiceManager.sol"; +import "../mocks/MockBeaconBlockRoot.sol"; +import "test/layer1/based/MockTaikoL1.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfServiceManager.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract BlocksFixtures is BaseTest { + PreconfTaskManager internal preconfTaskManager; + MockPreconfRegistry internal preconfRegistry; + MockPreconfServiceManager internal preconfServiceManager; + MockBeaconBlockRoot internal beaconBlockRootContract; + MockTaikoL1 internal taikoL1; + + function setUp() public virtual { + preconfRegistry = new MockPreconfRegistry(); + preconfServiceManager = new MockPreconfServiceManager(); + beaconBlockRootContract = new MockBeaconBlockRoot(); + taikoL1 = new MockTaikoL1(); + + preconfTaskManager = new PreconfTaskManager( + IPreconfServiceManager(address(preconfServiceManager)), + IPreconfRegistry(address(preconfRegistry)), + ITaikoL1(taikoL1), + LibPreconfConstants.MAINNET_BEACON_GENESIS, + address(beaconBlockRootContract) + ); + } + + /// @dev Inserts two preconfers in the lookahead for the next epoch at the given slots. + function prepareLookahead(uint256 slot1, uint256 slot2) internal { + addPreconfersToRegistry(3); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT * (slot1 - 1) + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_3, + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT * (slot2 - 1) + }); + + vm.warp(LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT); + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function addPreconfersToRegistry(uint256 count) internal { + for (uint256 i = 1; i <= count; i++) { + preconfRegistry.registerPreconfer(vm.addr(i)); + } + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol b/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol new file mode 100644 index 00000000000..d9e77fe34bc --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/layer1/based/MockTaikoL1.sol"; +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfServiceManager.sol"; + +import "../BaseTest.sol"; +import "../mocks/MockPreconfRegistry.sol"; +import "../mocks/MockPreconfServiceManager.sol"; +import "../mocks/MockBeaconBlockRoot.sol"; + +contract LookaheadFixtures is BaseTest { + PreconfTaskManager internal preconfTaskManager; + MockPreconfRegistry internal preconfRegistry; + MockPreconfServiceManager internal preconfServiceManager; + MockBeaconBlockRoot internal beaconBlockRootContract; + MockTaikoL1 internal taikoL1; + + function setUp() public virtual { + preconfRegistry = new MockPreconfRegistry(); + preconfServiceManager = new MockPreconfServiceManager(); + beaconBlockRootContract = new MockBeaconBlockRoot(); + taikoL1 = new MockTaikoL1(); + + preconfTaskManager = new PreconfTaskManager( + IPreconfServiceManager(address(preconfServiceManager)), + IPreconfRegistry(address(preconfRegistry)), + ITaikoL1(taikoL1), + LibPreconfConstants.MAINNET_BEACON_GENESIS, + address(beaconBlockRootContract) + ); + } + + function addPreconfersToRegistry(uint256 count) internal { + for (uint256 i = 1; i <= count; i++) { + preconfRegistry.registerPreconfer(vm.addr(i)); + } + } + + function computeFallbackPreconfer( + bytes32 randomness, + uint256 nextPreconferIndex + ) + internal + pure + returns (address) + { + return vm.addr(uint256(randomness) % (nextPreconferIndex - 1) + 1); + } +} diff --git a/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol b/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol new file mode 100644 index 00000000000..46ff9691ec7 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol @@ -0,0 +1,661 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/BeaconProofs.sol"; +import "../fixtures/LookaheadFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +/// @dev The beacon chain data used here is from slot 9000000 on Ethereum mainnet. +contract IncorrectLookahead is LookaheadFixtures { + // Most tests in this file use a lookahead that has a preconfer (addr_1) set at slot 16 in epoch + // 2. + // Epoch 1 starts at the genesis timestamp. + uint256 internal nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 internal slot16Timestamp = nextEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + + function setUp() public override { + super.setUp(); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case1() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case2() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is not allowed to propose at slot 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, slot16Timestamp + LibPreconfConstants.SECONDS_IN_SLOT, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case3() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is has lost proposal rights at slot + // 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, LibPreconfConstants.MAINNET_BEACON_GENESIS, slot16Timestamp + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case4() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is has lost proposal rights before + // slot 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, + addr_1, + LibPreconfConstants.MAINNET_BEACON_GENESIS, + slot16Timestamp - LibPreconfConstants.SECONDS_IN_SLOT + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case5() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer belongs to another preconfer + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case6() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Take a slot for which their is no dedicated lookahead entry and set it's beacon block + // root + // containing a proposer mapped to a valid preconfer + uint256 slot15Timestamp = slot16Timestamp - LibPreconfConstants.SECONDS_IN_SLOT; + beaconBlockRootContract.set(slot16Timestamp, BeaconProofs.beaconBlockRoot()); + + // The beacon proposer belongs to a valid preconfer who is not in the lookahead at slot 15 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot15Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case7() + external + { + addPreconfersToRegistry(10); + // addr_1 posts empty lookahead for next epoch to set fallback preconfer + postEmptyLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Take the last slot in the lookahead with the fallback preconfer and set it's beacon block + // root + // containing a proposer mapped to an active preconfer + beaconBlockRootContract.set(nextEpochEnd, BeaconProofs.beaconBlockRoot()); + + // The beacon proposer belongs to a valid preconfer who is not in the lookahead at slot 32 + // as the lookahead has the fallback preconfer + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 1, + nextEpochEnd - LibPreconfConstants.SECONDS_IN_SLOT, + beaconProposer, + BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_setsFallbackPreconfer_Case1() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to an arbitrary timestamp after the incorrect slot in the next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + bytes32 randomness = bytes32(uint256(4)); + + // Set beacon block root such that addr_4 is randomly selected + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + uint256 lastSlotTimestamp = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Verify that the lookahead has the fallback preconfer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[3].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[3].timestamp, lastSlotTimestamp); + assertEq( + lookaheadBuffer[3].prevTimestamp, nextEpochStart - LibPreconfConstants.SECONDS_IN_SLOT + ); + assertEq(lookaheadBuffer[3].isFallback, true); + + // Verify that the remaining entries for the epoch have been removed + assertEq(lookaheadBuffer[2].preconfer, address(0)); + assertEq(lookaheadBuffer[2].timestamp, 0); + assertEq(lookaheadBuffer[2].prevTimestamp, 0); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[1].preconfer, address(0)); + assertEq(lookaheadBuffer[1].timestamp, 0); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + } + + function test_proveIncorrectLookahead_setsFallbackPreconfer_Case2() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to an arbitrary timestamp after the incorrect slot in the next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Force push lookahead for next epoch + // This to ensure if the first entry in the following epoch connects correctly to the newly + // inserted + // fallback preconfer + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + + uint256 nextToNextEpochStart = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Slot 13 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + // Slot 22 + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: nextToNextEpochStart + (21 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + bytes32 randomness = bytes32(uint256(4)); + + // Set beacon block root such that addr_4 is randomly selected + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + uint256 lastSlotTimestamp = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Verify that the lookahead has the fallback preconfer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[3].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[3].timestamp, lastSlotTimestamp); + assertEq( + lookaheadBuffer[3].prevTimestamp, nextEpochStart - LibPreconfConstants.SECONDS_IN_SLOT + ); + assertEq(lookaheadBuffer[3].isFallback, true); + + // Verify that the remaining entries for the epoch have been removed + assertEq(lookaheadBuffer[2].preconfer, address(0)); + assertEq(lookaheadBuffer[2].timestamp, 0); + assertEq(lookaheadBuffer[2].prevTimestamp, 0); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[1].preconfer, address(0)); + assertEq(lookaheadBuffer[1].timestamp, 0); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + // Verify that the first entry in the following epoch is connected to the fallback preconfer + assertEq(lookaheadBuffer[4].preconfer, addr_1); + assertEq( + lookaheadBuffer[4].timestamp, + nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[4].prevTimestamp, lastSlotTimestamp); + assertEq(lookaheadBuffer[4].isFallback, false); + } + + function test_proveIncorrectLookahead_revertsWhenPosterIsAlreadySlashedOrLookaheadIsEmpty() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Reverts when the timestamp belongs to an epoch that does not have a lookahead yet + vm.expectRevert(IPreconfTaskManager.PosterAlreadySlashedOrLookaheadIsEmpty.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, + // Epoch does not have a poster yet + LibPreconfConstants.MAINNET_BEACON_GENESIS + (4 * LibPreconfConstants.SECONDS_IN_EPOCH), + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenDisputeWindowIsMissed() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Wrap into the future when the dispute window is missed + vm.warp( + slot16Timestamp + LibPreconfConstants.DISPUTE_PERIOD + + LibPreconfConstants.SECONDS_IN_SLOT + ); + + // Reverts when the dispute period is over + vm.expectRevert(IPreconfTaskManager.MissedDisputeWindow.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case1() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Reverts because the pointer is in the past and slot timestamp in future + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 1, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case2() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Reverts because the pointer is in the future (slotTimestamp == pointer.prevTimestamp) + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 3, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case3() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Wrap to arbitrary timestamp in next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Push a lookahead for the following epoch + // This will enable simulating the condition slotTimestamp < pointer.prevTimestamps + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + uint256 nextToNextEpochStart = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + // Slot 13 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Reverts because the pointer is in the future (slotTimestamp < pointer.prevTimestamp) + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 4, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadEntryIsCorrect() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + // Sets slot 16 to its own address + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Add the validator for addr_1 in registry + // This is also the proposer for the beacon block whose root we have stored (see + // `postLookahead()`) + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Reverts when the lookahead is tried to be proven incorrect + vm.expectRevert(IPreconfTaskManager.LookaheadEntryIsCorrect.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_emitsProvedIncorrectLookaheadEvent() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + // Prove the lookahead to be incorrect + vm.expectEmit(); + emit IPreconfTaskManager.ProvedIncorrectLookahead(addr_1, slot16Timestamp, address(this)); + + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + //========= + // Helpers + //========= + + /// @dev Makes addr_1 push a fixed lookeahead + function postLookahead() internal { + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](3); + + // Slot 5 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: nextEpochStart + (4 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + // Slot 16 (Slot used for fault proofs) + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: slot16Timestamp }); + // Slot 25 + lookaheadSetParams[2] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_3, + timestamp: nextEpochStart + (24 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Set the beacon block root for slot 16 (in the timestamp of slot 17) + beaconBlockRootContract.set( + slot16Timestamp + LibPreconfConstants.SECONDS_IN_SLOT, BeaconProofs.beaconBlockRoot() + ); + } + + /// @dev Makes addr_1 push an empty lookeahead + function postEmptyLookahead() internal { + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + bytes32(uint256(4)) + ); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } +} diff --git a/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol b/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol new file mode 100644 index 00000000000..cbee4ba898c --- /dev/null +++ b/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol @@ -0,0 +1,428 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/LookaheadFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract LookaheadPosting is LookaheadFixtures { + function setUp() public override { + super.setUp(); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case1() external { + addPreconfersToRegistry(5); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Verify storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case2() external { + addPreconfersToRegistry(7); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 slot20Timestamp = nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + // Slot 20 + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_3, timestamp: slot20Timestamp }); + + // Address 3 pushes the lookahead + vm.prank(addr_3); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 2); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(lookaheadBuffer[2].preconfer, addr_3); + assertEq(lookaheadBuffer[2].timestamp, slot20Timestamp); + assertEq(lookaheadBuffer[2].prevTimestamp, nextEpochStart); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_3); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case3() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 slot14Timestamp = nextEpochStart + (13 * LibPreconfConstants.SECONDS_IN_SLOT); + uint256 slot31Timestamp = nextEpochStart + (30 * LibPreconfConstants.SECONDS_IN_SLOT); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](3); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + // Slot 14 + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_2, timestamp: slot14Timestamp }); + // Slot 31 + lookaheadSetParams[2] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_5, timestamp: slot31Timestamp }); + + // Address 2 pushes the lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 3); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(lookaheadBuffer[2].preconfer, addr_2); + assertEq(lookaheadBuffer[2].timestamp, slot14Timestamp); + assertEq(lookaheadBuffer[2].prevTimestamp, nextEpochStart); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[3].preconfer, addr_5); + assertEq(lookaheadBuffer[3].timestamp, slot31Timestamp); + assertEq(lookaheadBuffer[3].prevTimestamp, slot14Timestamp); + assertEq(lookaheadBuffer[3].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_setsFallbackPreconfer_Case1() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 lastSlotTimestampInNextEpoch = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Create an empty lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + bytes32 randomness = bytes32(uint256(4)); + + // Push a required root to the mock beacon block root contract + // This root as a source of randomness selects the preconfer with index 4 + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Address 2 pushes the empty lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + + // Verify that the lookahead is empty + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + // Verify that correct preconfer is inserted as fallback in lookahead buffer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[1].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[1].timestamp, lastSlotTimestampInNextEpoch); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, true); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_setsFallbackPreconfer_Case2() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 lastSlotTimestampInNextEpoch = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Create an empty lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + bytes32 randomness = bytes32(uint256(4)); + + // Unlike Case 1, we push the root at a later timestamp to simulate "skipped blocks" and see + // if the contract iterates forward and finds the required root + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + 3 * LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Address 2 pushes the empty lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + + // Verify that the lookahead is empty + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + // Verify that correct preconfer is inserted as fallback in lookahead buffer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[1].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[1].timestamp, lastSlotTimestampInNextEpoch); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, true); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_revertsWhenPreconferNotRegistered_Case1() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + // Transaction is expected to revert as addr_6 is not registered in the preconfer registry + vm.prank(addr_6); + vm.expectRevert(IPreconfTaskManager.PreconferNotRegistered.selector); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenPreconferNotRegistered_Case2() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with an unregistered preconfer (addr_6) + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_6 // addr_6 is not registered + }); + + // Transaction is expected to revert as addr_6 is not registered in the preconfer registry + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.PreconferNotRegistered.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenLookaheadIsNotRequired() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a valid lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + + // First push should succeed + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + + // Attempt to push the lookahead again fails + vm.prank(addr_2); + vm.expectRevert(IPreconfTaskManager.LookaheadIsNotRequired.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_notMultipleOf12() external { + // Add addr_1 to the registry + addPreconfersToRegistry(1); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with an invalid timestamp (not a multiple of 12 seconds from epoch + // start) + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 5, // Not a multiple of 12 + preconfer: addr_1 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_exceedsEpochEnd() external { + // Add addr_1 to the registry + addPreconfersToRegistry(1); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with a timestamp that exceeds the epoch end + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH, // Exactly one epoch + // later, which is the start of the next epoch + preconfer: addr_1 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_notGreaterThanPrevious() + external + { + // Add addr_1 and addr_2 to the registry + addPreconfersToRegistry(2); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with timestamps in the wrong order + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 2 * LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, // Earlier than the + // previous timestamp + preconfer: addr_2 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_emitsLookaheadUpdatedEvent() external { + // Add addr_1 and addr_2 to the registry + addPreconfersToRegistry(2); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a valid lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 2 * LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_2 + }); + + vm.prank(addr_1); + vm.expectEmit(); + emit IPreconfTaskManager.LookaheadUpdated(lookaheadSetParams); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol b/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol new file mode 100644 index 00000000000..35f3caba2db --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockBeaconBlockRoot { + mapping(uint256 => bytes32) internal blockRoots; + + function set(uint256 timestamp, bytes32 root) external { + blockRoots[timestamp] = root; + } + + fallback(bytes calldata data) external payable returns (bytes memory) { + bytes32 root = blockRoots[abi.decode(data, (uint256))]; + require(root != bytes32(0), "no root"); + return abi.encode(root); + } + + receive() external payable { } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol b/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol new file mode 100644 index 00000000000..d28561a6fb6 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockPreconfRegistry { + struct Validator { + address preconfer; + uint40 startProposingAt; + uint40 stopProposingAt; + } + + mapping(address preconfer => uint256 index) internal preconferToIndex; + mapping(uint256 index => address preconfer) internal indexToPreconfer; + mapping(bytes32 pubKeyhash => Validator validator) internal validators; + + uint256 internal nextPreconferIndex = 1; + + function registerPreconfer(address preconfer) external { + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[preconfer] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = preconfer; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + } + + function addValidator( + bytes memory pubKey, + address preconfer, + uint256 startProposingAt, + uint256 stopProposingAt + ) + external + { + bytes32 key = keccak256(abi.encodePacked(bytes16(0), pubKey)); + validators[key] = Validator(preconfer, uint40(startProposingAt), uint40(stopProposingAt)); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol b/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol new file mode 100644 index 00000000000..c46ea65303b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockPreconfServiceManager { + mapping(address => uint256) public stakeLockTimestamps; + mapping(address => bool) public operatorSlashed; + + function lockStakeUntil(address operator, uint256 timestamp) external { + stakeLockTimestamps[operator] = timestamp; + } + + function slashOperator(address operator) external { + operatorSlashed[operator] = true; + } +} diff --git a/packages/protocol/test/layer2/Lib1559Math.t.sol b/packages/protocol/test/layer2/LibEIP1559.t.sol similarity index 65% rename from packages/protocol/test/layer2/Lib1559Math.t.sol rename to packages/protocol/test/layer2/LibEIP1559.t.sol index dd821e0e13e..ab4c7533a47 100644 --- a/packages/protocol/test/layer2/Lib1559Math.t.sol +++ b/packages/protocol/test/layer2/LibEIP1559.t.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.24; import "./TaikoL2Test.sol"; -contract TestLib1559Math is TaikoL2Test { +contract TestLibEIP1559 is TaikoL2Test { using LibMath for uint256; function test_ethQty() external { - assertEq(Lib1559Math.ethQty(0, 60_000_000 * 8), 1); - assertEq(Lib1559Math.ethQty(60_000_000, 60_000_000 * 8), 1); - assertEq(Lib1559Math.ethQty(60_000_000 * 100, 60_000_000 * 8), 268_337); - assertEq(Lib1559Math.ethQty(60_000_000 * 200, 60_000_000 * 8), 72_004_899_337); + assertEq(LibEIP1559.ethQty(0, 60_000_000 * 8), 1); + assertEq(LibEIP1559.ethQty(60_000_000, 60_000_000 * 8), 1); + assertEq(LibEIP1559.ethQty(60_000_000 * 100, 60_000_000 * 8), 268_337); + assertEq(LibEIP1559.ethQty(60_000_000 * 200, 60_000_000 * 8), 72_004_899_337); } function test_basefee() external pure { @@ -22,7 +22,7 @@ contract TestLib1559Math is TaikoL2Test { uint256 excess = i * 5_000_000; uint256 target = 5_000_000 * 8; - basefee = Lib1559Math.basefee(excess, target); + basefee = LibEIP1559.basefee(excess, target); if (basefee != 0) { console2.log( string.concat(Strings.toString(excess), ", ", Strings.toString(basefee)) @@ -33,7 +33,7 @@ contract TestLib1559Math is TaikoL2Test { } function test_mainnet_min_basefee() external pure { - console2.log("Mainnet minimal basefee: ", Lib1559Math.basefee(1_340_000_000, 5_000_000 * 8)); + console2.log("Mainnet minimal basefee: ", LibEIP1559.basefee(1_340_000_000, 5_000_000 * 8)); } function test_change_of_quotient_and_gips() public { @@ -42,20 +42,20 @@ contract TestLib1559Math is TaikoL2Test { uint256 unit = 10_000_000; // 0.01 gwei // uint 0.01 gwei - uint256 baselineBasefee = Lib1559Math.basefee(excess, target) / unit; + uint256 baselineBasefee = LibEIP1559.basefee(excess, target) / unit; console2.log("baseline basefee: ", baselineBasefee); - uint256 basefee = Lib1559Math.basefee(excess, target * 2) / unit; + uint256 basefee = LibEIP1559.basefee(excess, target * 2) / unit; console2.log("basefee will decrease if target increases:", basefee); - basefee = Lib1559Math.basefee(excess, target / 2) / unit; + basefee = LibEIP1559.basefee(excess, target / 2) / unit; console2.log("basefee will increase if target decreases:", basefee); console2.log("maintain basefee when target increases"); { uint64 newTarget = 5 * 2_000_000; - uint64 newExcess = Lib1559Math.adjustExcess(excess, target, newTarget); - basefee = Lib1559Math.basefee(newExcess, newTarget) / unit; + uint64 newExcess = LibEIP1559.adjustExcess(excess, target, newTarget); + basefee = LibEIP1559.basefee(newExcess, newTarget) / unit; console2.log("old gas excess: ", excess); console2.log("new gas excess: ", newExcess); console2.log("basefee: ", basefee); @@ -65,8 +65,8 @@ contract TestLib1559Math is TaikoL2Test { console2.log("maintain basefee when target decreases"); { uint64 newTarget = 3 * 2_000_000; - uint64 newExcess = Lib1559Math.adjustExcess(excess, target, newTarget); - basefee = Lib1559Math.basefee(newExcess, newTarget) / unit; + uint64 newExcess = LibEIP1559.adjustExcess(excess, target, newTarget); + basefee = LibEIP1559.basefee(newExcess, newTarget) / unit; console2.log("old gas excess: ", excess); console2.log("new gas excess: ", newExcess); console2.log("basefee: ", basefee); @@ -80,13 +80,13 @@ contract TestLib1559Math is TaikoL2Test { uint256 unit = 10_000_000; // 0.01 gwei // uint 0.01 gwei - uint256 baselineBasefee = Lib1559Math.basefee(excess, target) / unit; + uint256 baselineBasefee = LibEIP1559.basefee(excess, target) / unit; console2.log("baseline basefee: ", baselineBasefee); console2.log("maintain basefee when target changes"); uint64 newTarget = 5_000_000 * 8; - uint64 newExcess = Lib1559Math.adjustExcess(excess, target, newTarget); - uint256 basefee = Lib1559Math.basefee(newExcess, newTarget) / unit; + uint64 newExcess = LibEIP1559.adjustExcess(excess, target, newTarget); + uint256 basefee = LibEIP1559.basefee(newExcess, newTarget) / unit; console2.log("old gas excess: ", excess); console2.log("new gas excess: ", newExcess); console2.log("basefee: ", basefee); diff --git a/packages/protocol/test/layer2/TaikoL2Test.sol b/packages/protocol/test/layer2/TaikoL2Test.sol index 1e6fff16376..a57ad6c00d7 100644 --- a/packages/protocol/test/layer2/TaikoL2Test.sol +++ b/packages/protocol/test/layer2/TaikoL2Test.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import "src/layer2/DelegateOwner.sol"; -import "src/layer2/based/Lib1559Math.sol"; +import "src/layer2/based/LibEIP1559.sol"; import "src/layer2/based/TaikoL2.sol"; import "test/layer2/LibL2Signer.sol"; import "test/shared/TaikoTest.sol"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d706304da68..8af98ce7997 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,7 +24,7 @@ importers: version: 2.26.2(debug@4.3.4) '@wagmi/connectors': specifier: ^4.3.1 - version: 4.3.10(yrxxgsr3s6m7a4itnzsb2c7inm) + version: 4.3.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@wagmi/core': specifier: ^2.8.1 version: 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) @@ -36,7 +36,7 @@ importers: version: 2.6.2(@types/react@18.3.5)(react@18.2.0) '@web3modal/wagmi': specifier: ^4.1.11 - version: 4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(yrxxgsr3s6m7a4itnzsb2c7inm))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4)) + version: 4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4)) '@zerodevx/svelte-toast': specifier: ^0.9.5 version: 0.9.5(svelte@4.2.17) @@ -424,6 +424,12 @@ importers: ds-test: specifier: github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0 version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + eigenlayer-contracts: + specifier: github:Layr-labs/eigenlayer-contracts#dev + version: https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)) + eigenlayer-middleware: + specifier: github:layr-Labs/eigenlayer-middleware#mainnet + version: https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990 forge-std: specifier: github:foundry-rs/forge-std#v1.7.5 version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3 @@ -516,7 +522,7 @@ importers: version: 4.2.3 '@web3modal/wagmi': specifier: ^4.2.2 - version: 4.2.3(hoyagxhmve75vyxjsj4tjya6zm) + version: 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/connectors@5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@zerodevx/svelte-toast': specifier: ^0.9.5 version: 0.9.5(svelte@4.2.17) @@ -745,7 +751,7 @@ importers: version: 4.1.11 '@web3modal/wagmi': specifier: ^4.1.1 - version: 4.1.11(xgqwdfny5esqdjztzawvofqbai) + version: 4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)) '@zerodevx/svelte-toast': specifier: ^0.9.5 version: 0.9.5(svelte@4.2.13) @@ -3350,6 +3356,10 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + '@metamask/json-rpc-engine@7.3.2': resolution: {integrity: sha512-dVjBPlni4CoiBpESVqrxh6k4OR14w6GRXKSSXHFuITjuhALE42gNCkXTpL4cjNeOBUgTba3eGe5EI8cyc2QLRg==} engines: {node: '>=16.0.0'} @@ -3628,6 +3638,96 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nomicfoundation/edr-darwin-arm64@0.6.3': + resolution: {integrity: sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-darwin-x64@0.6.3': + resolution: {integrity: sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': + resolution: {integrity: sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': + resolution: {integrity: sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': + resolution: {integrity: sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': + resolution: {integrity: sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': + resolution: {integrity: sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr@0.6.3': + resolution: {integrity: sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + '@openzeppelin/contracts-upgradeable@4.9.6': resolution: {integrity: sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==} @@ -4254,6 +4354,34 @@ packages: '@scure/bip39@1.4.0': resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + '@shikijs/core@1.17.6': resolution: {integrity: sha512-9ztslig6/YmCg/XwESAXbKjAjOhaq6HVced9NY6qcbDz1X5g/S90Wco2vMjBNX/6V71ASkzri76JewSGPa7kiQ==} @@ -4827,6 +4955,9 @@ packages: '@types/babel__traverse@7.20.5': resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + '@types/bn.js@5.1.5': resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} @@ -4914,6 +5045,9 @@ packages: '@types/lodash@4.17.7': resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -5732,16 +5866,28 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.0: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -5769,6 +5915,10 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} @@ -6089,6 +6239,10 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -6123,6 +6277,9 @@ packages: browser-readablestream-to-it@2.0.6: resolution: {integrity: sha512-csJm66U/gTC6VHjeaOaziK6Y6ENdrzlNLdXnsdnvGX+3hGvedkxTyiMk2WbgKR8F15ACxDLJhDuE/cmovLPBQQ==} + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} @@ -6415,6 +6572,14 @@ packages: class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -6446,6 +6611,9 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -6599,6 +6767,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -6769,6 +6941,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -7006,6 +7182,14 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + eigenlayer-contracts@https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0: + resolution: {tarball: https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0} + version: 1.0.0 + + eigenlayer-middleware@https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990: + resolution: {tarball: https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990} + version: 0.0.0 + electron-fetch@1.9.1: resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} engines: {node: '>=6'} @@ -7069,6 +7253,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + envinfo@7.11.1: resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} engines: {node: '>=4'} @@ -7467,6 +7655,12 @@ packages: ethereum-cryptography@2.1.3: resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} @@ -7482,6 +7676,10 @@ packages: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} @@ -7661,6 +7859,10 @@ packages: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} engines: {node: '>=18'} + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -7688,6 +7890,10 @@ packages: resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} hasBin: true + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} @@ -7757,6 +7963,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -7880,6 +8089,10 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -7956,6 +8169,11 @@ packages: h3@1.10.2: resolution: {integrity: sha512-r1iNNcFGL4G9pL3lgYxwX0O2ZmqdKqhILAJsnlw5icn5I1QHnADM4TgVdYRtHUqy+NntVpHIEFwnw/XCbebICg==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} @@ -7965,6 +8183,18 @@ packages: engines: {node: '>=6'} deprecated: this library is no longer supported + hardhat@2.22.13: + resolution: {integrity: sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -8068,6 +8298,10 @@ packages: hastscript@9.0.0: resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} @@ -8148,6 +8382,10 @@ packages: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} @@ -8221,6 +8459,9 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} @@ -8283,6 +8524,9 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + ioredis@5.3.2: resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} engines: {node: '>=12.22.0'} @@ -8778,6 +9022,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -8955,6 +9203,10 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -9065,6 +9317,9 @@ packages: lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -9477,6 +9732,10 @@ packages: resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} engines: {node: '>=10'} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} @@ -9544,6 +9803,14 @@ packages: mlly@1.5.0: resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true + mock-fs@4.14.0: resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} @@ -9809,6 +10076,9 @@ packages: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + oboe@2.1.5: resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} @@ -9921,6 +10191,10 @@ packages: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -9941,6 +10215,10 @@ packages: resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} engines: {node: '>=18'} + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -9961,6 +10239,10 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + p-map@7.0.2: resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} engines: {node: '>=18'} @@ -9973,6 +10255,10 @@ packages: resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} engines: {node: '>=14.16'} + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -10747,6 +11033,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -10956,6 +11245,9 @@ packages: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -11104,6 +11396,11 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + solhint@4.5.4: resolution: {integrity: sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==} hasBin: true @@ -11112,6 +11409,14 @@ packages: resolution: {integrity: sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ==} hasBin: true + solidity-ast@0.4.59: + resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} + + solidity-docgen@0.6.0-beta.36: + resolution: {integrity: sha512-f/I5G2iJgU1h0XrrjRD0hHMr7C10u276vYvm//rw1TzFcYQ4xTOyAoi9oNAHRU0JU4mY9eTuxdVc2zahdMuhaQ==} + peerDependencies: + hardhat: ^2.8.0 + solidity-stringutils@https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: resolution: {tarball: https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461} version: 0.0.0 @@ -11703,6 +12008,9 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -11719,9 +12027,15 @@ packages: tween-functions@1.2.0: resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -11734,6 +12048,10 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} @@ -11789,6 +12107,11 @@ packages: ufo@1.4.0: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + uint8-varint@2.0.4: resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} @@ -12605,6 +12928,10 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} @@ -12613,6 +12940,12 @@ packages: resolution: {integrity: sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==} engines: {node: '>= 0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -12805,14 +13138,26 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -13014,7 +13359,7 @@ snapshots: '@astrojs/telemetry@3.1.0': dependencies: ci-info: 4.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) dlv: 1.1.3 dset: 3.1.3 is-docker: 3.0.0 @@ -13097,10 +13442,10 @@ snapshots: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.577.0 - '@aws-sdk/client-sts': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/client-sts': 3.577.0 '@aws-sdk/core': 3.576.0 - '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) '@aws-sdk/middleware-bucket-endpoint': 3.577.0 '@aws-sdk/middleware-expect-continue': 3.577.0 '@aws-sdk/middleware-flexible-checksums': 3.577.0 @@ -13155,13 +13500,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.577.0': + '@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/client-sts': 3.577.0 '@aws-sdk/core': 3.576.0 - '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -13198,6 +13543,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso@3.577.0': @@ -13243,13 +13589,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': + '@aws-sdk/client-sts@3.577.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.577.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) '@aws-sdk/core': 3.576.0 - '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -13286,7 +13632,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.576.0': @@ -13318,12 +13663,12 @@ snapshots: '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@aws-sdk/credential-provider-ini@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0)': + '@aws-sdk/credential-provider-ini@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/client-sts': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/client-sts': 3.577.0 '@aws-sdk/credential-provider-env': 3.577.0 '@aws-sdk/credential-provider-process': 3.577.0 - '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)) '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 @@ -13335,13 +13680,13 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0)': + '@aws-sdk/credential-provider-node@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0)': dependencies: '@aws-sdk/credential-provider-env': 3.577.0 '@aws-sdk/credential-provider-http': 3.577.0 - '@aws-sdk/credential-provider-ini': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-ini': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) '@aws-sdk/credential-provider-process': 3.577.0 - '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)) '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 @@ -13362,10 +13707,10 @@ snapshots: '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-sso@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': + '@aws-sdk/credential-provider-sso@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))': dependencies: '@aws-sdk/client-sso': 3.577.0 - '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -13377,7 +13722,7 @@ snapshots: '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/client-sts': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/client-sts': 3.577.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 @@ -13502,9 +13847,9 @@ snapshots: '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': + '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))': dependencies: - '@aws-sdk/client-sso-oidc': 3.577.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -13584,7 +13929,7 @@ snapshots: '@babel/traverse': 7.25.6 '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -13639,7 +13984,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -14451,7 +14796,7 @@ snapshots: '@babel/parser': 7.25.6 '@babel/template': 7.25.0 '@babel/types': 7.25.6 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15880,6 +16225,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + '@metamask/json-rpc-engine@7.3.2': dependencies: '@metamask/rpc-errors': 6.1.0 @@ -16444,6 +16797,81 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nomicfoundation/edr-darwin-arm64@0.6.3': {} + + '@nomicfoundation/edr-darwin-x64@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': {} + + '@nomicfoundation/edr@0.6.3': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.6.3 + '@nomicfoundation/edr-darwin-x64': 0.6.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.6.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-x64-musl': 0.6.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.6.3 + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-util@9.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + '@openzeppelin/contracts-upgradeable@4.9.6': {} '@openzeppelin/contracts-upgradeable@5.0.2(@openzeppelin/contracts@5.0.2)': @@ -17315,6 +17743,55 @@ snapshots: '@noble/hashes': 1.5.0 '@scure/base': 1.1.8 + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + '@shikijs/core@1.17.6': dependencies: '@shikijs/engine-javascript': 1.17.6 @@ -18290,6 +18767,10 @@ snapshots: dependencies: '@babel/types': 7.25.6 + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 20.12.7 + '@types/bn.js@5.1.5': dependencies: '@types/node': 20.12.7 @@ -18395,6 +18876,8 @@ snapshots: '@types/lodash@4.17.7': {} + '@types/lru-cache@5.1.1': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.2 @@ -19138,8 +19621,8 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@4.3.10(yrxxgsr3s6m7a4itnzsb2c7inm)': - dependencies: + ? '@wagmi/connectors@4.3.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)' + : dependencies: '@coinbase/wallet-sdk': 3.9.1 '@metamask/sdk': 0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) @@ -20415,42 +20898,42 @@ snapshots: lit: 3.1.0 qrcode: 1.5.3 - '@web3modal/wagmi@4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(yrxxgsr3s6m7a4itnzsb2c7inm))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))': - dependencies: - '@wagmi/connectors': 4.3.10(yrxxgsr3s6m7a4itnzsb2c7inm) - '@wagmi/core': 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + ? '@web3modal/wagmi@4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))' + : dependencies: + '@wagmi/connectors': 4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@wagmi/core': 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@web3modal/polyfills': 4.1.11 '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) - viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@web3modal/wagmi@4.1.11(xgqwdfny5esqdjztzawvofqbai)': - dependencies: - '@wagmi/connectors': 4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + ? '@web3modal/wagmi@4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))' + : dependencies: + '@wagmi/connectors': 4.3.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@web3modal/polyfills': 4.1.11 '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) - viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@web3modal/wagmi@4.2.3(hoyagxhmve75vyxjsj4tjya6zm)': - dependencies: + ? '@web3modal/wagmi@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/connectors@5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))' + : dependencies: '@wagmi/connectors': 5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@wagmi/core': 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@walletconnect/ethereum-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) @@ -20573,16 +21056,29 @@ snapshots: acorn@8.12.1: {} + adm-zip@0.4.16: {} + aes-js@3.0.0: {} aes-js@4.0.0-beta.5: {} + agent-base@6.0.2: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + agent-base@7.1.0: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.12.0): optionalDependencies: ajv: 8.12.0 @@ -20619,6 +21115,10 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-fragments@0.2.1: dependencies: colorette: 1.4.0 @@ -20783,7 +21283,7 @@ snapshots: common-ancestor-path: 1.0.1 cookie: 0.6.0 cssesc: 3.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) deterministic-object-hash: 2.0.2 devalue: 5.0.0 diff: 5.2.0 @@ -20914,7 +21414,7 @@ snapshots: axios@1.7.7: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -21051,6 +21551,17 @@ snapshots: bowser@2.11.0: {} + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + boxen@7.1.1: dependencies: ansi-align: 3.0.1 @@ -21091,6 +21602,8 @@ snapshots: browser-readablestream-to-it@2.0.6: {} + browser-stdout@1.3.1: {} + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 @@ -21407,6 +21920,10 @@ snapshots: class-is@1.1.0: {} + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + cli-boxes@3.0.0: {} cli-color@2.0.3: @@ -21443,6 +21960,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -21591,6 +22114,8 @@ snapshots: cookie-signature@1.0.6: {} + cookie@0.4.2: {} + cookie@0.6.0: {} core-js-compat@3.36.0: @@ -21780,12 +22305,16 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.7: + debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decamelize@1.2.0: {} + decamelize@4.0.0: {} + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -21994,6 +22523,14 @@ snapshots: ee-first@1.1.1: {} + eigenlayer-contracts@https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)): + dependencies: + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - hardhat + + eigenlayer-middleware@https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990: {} + electron-fetch@1.9.1: dependencies: encoding: 0.1.13 @@ -22082,6 +22619,8 @@ snapshots: entities@4.5.0: {} + env-paths@2.2.1: {} + envinfo@7.11.1: {} err-code@3.0.1: {} @@ -23018,6 +23557,21 @@ snapshots: '@scure/bip32': 1.3.3 '@scure/bip39': 1.2.2 + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.7 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.5 @@ -23080,6 +23634,11 @@ snapshots: bn.js: 4.11.6 number-to-bn: 1.7.0 + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + event-emitter@0.3.5: dependencies: d: 1.0.1 @@ -23322,6 +23881,10 @@ snapshots: find-up-simple@1.0.0: {} + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -23356,6 +23919,8 @@ snapshots: dependencies: is-buffer: 2.0.5 + flat@5.0.2: {} + flatted@3.2.9: {} flattie@1.1.1: {} @@ -23368,7 +23933,9 @@ snapshots: optionalDependencies: debug: 4.3.4 - follow-redirects@1.15.9: {} + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7(supports-color@8.1.1) for-each@0.3.3: dependencies: @@ -23403,6 +23970,8 @@ snapshots: forwarded@0.2.0: {} + fp-ts@1.19.3: {} + fraction.js@4.3.7: {} fresh@0.5.2: {} @@ -23526,6 +24095,15 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 2.0.0 + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -23658,6 +24236,15 @@ snapshots: uncrypto: 0.1.3 unenv: 1.9.0 + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + har-schema@2.0.0: {} har-validator@5.1.5: @@ -23665,6 +24252,61 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 + hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.6.3 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 4.0.0 + ci-info: 2.0.0 + debug: 4.3.7(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.7.3 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.3.7) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + tsort: 0.0.1 + undici: 5.28.3 + uuid: 8.3.2 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -23899,6 +24541,8 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + header-case@2.0.4: dependencies: capital-case: 1.0.4 @@ -23992,6 +24636,13 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.0 @@ -24055,6 +24706,8 @@ snapshots: immediate@3.0.6: {} + immutable@4.3.7: {} + import-fresh@2.0.0: dependencies: caller-path: 2.0.0 @@ -24118,6 +24771,10 @@ snapshots: dependencies: loose-envify: 1.4.0 + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + ioredis@5.3.2: dependencies: '@ioredis/commands': 1.2.0 @@ -24722,6 +25379,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stream-stringify@3.1.6: {} + json-stringify-safe@5.0.1: {} json-to-ast@2.1.0: @@ -24923,6 +25582,11 @@ snapshots: locate-character@3.0.0: {} + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -25026,6 +25690,8 @@ snapshots: dependencies: es5-ext: 0.10.62 + lru_map@0.3.3: {} + lz-string@1.5.0: {} magic-string@0.30.10: @@ -25819,6 +26485,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@7.4.6: dependencies: brace-expansion: 2.0.1 @@ -25899,6 +26569,33 @@ snapshots: pkg-types: 1.0.3 ufo: 1.4.0 + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.4 + + mocha@10.7.3: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + mock-fs@4.14.0: {} moralis@2.26.2(debug@4.3.4): @@ -26138,6 +26835,8 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.3 + obliterator@2.0.4: {} + oboe@2.1.5: dependencies: http-https: 1.0.0 @@ -26276,6 +26975,10 @@ snapshots: dependencies: p-map: 2.1.0 + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -26296,6 +26999,10 @@ snapshots: dependencies: yocto-queue: 1.1.1 + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -26314,6 +27021,10 @@ snapshots: p-map@2.1.0: {} + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@7.0.2: {} p-queue@8.0.1: @@ -26323,6 +27034,8 @@ snapshots: p-timeout@6.1.2: {} + p-try@1.0.0: {} + p-try@2.2.0: {} p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da: {} @@ -27257,6 +27970,10 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + resolve@1.22.8: dependencies: is-core-module: 2.13.1 @@ -27535,6 +28252,10 @@ snapshots: serialize-error@2.1.0: {} + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -27760,6 +28481,18 @@ snapshots: transitivePeerDependencies: - debug + solc@0.8.26(debug@4.3.7): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.3.7) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + solhint@4.5.4(typescript@5.4.3): dependencies: '@solidity-parser/parser': 0.18.0 @@ -27835,6 +28568,14 @@ snapshots: transitivePeerDependencies: - typescript + solidity-ast@0.4.59: {} + + solidity-docgen@0.6.0-beta.36(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)): + dependencies: + handlebars: 4.7.8 + hardhat: 2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10) + solidity-ast: 0.4.59 + solidity-stringutils@https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: {} sonic-boom@2.8.0: @@ -28661,6 +29402,8 @@ snapshots: tslib@2.6.2: {} + tsort@0.0.1: {} + tsutils@3.21.0(typescript@5.4.3): dependencies: tslib: 1.14.1 @@ -28679,8 +29422,12 @@ snapshots: tween-functions@1.2.0: {} + tweetnacl-util@0.15.1: {} + tweetnacl@0.14.5: {} + tweetnacl@1.0.3: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -28689,6 +29436,8 @@ snapshots: type-fest@0.20.2: {} + type-fest@0.21.3: {} + type-fest@0.7.1: {} type-fest@2.19.0: {} @@ -28745,6 +29494,9 @@ snapshots: ufo@1.4.0: {} + uglify-js@3.19.3: + optional: true + uint8-varint@2.0.4: dependencies: uint8arraylist: 2.4.8 @@ -29858,6 +30610,10 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + widest-line@4.0.1: dependencies: string-width: 5.1.2 @@ -29871,6 +30627,10 @@ snapshots: isstream: 0.1.2 stack-trace: 0.0.10 + wordwrap@1.0.0: {} + + workerpool@6.5.1: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -30036,8 +30796,17 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -30052,6 +30821,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 From 035acb2b1498b56f9b249897e0664d759b9b1892 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 17 Oct 2024 10:57:26 +0800 Subject: [PATCH 08/38] docs(protocol): update Hekla deployments (#18257) --- packages/protocol/deployments/hekla-contract-logs.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/protocol/deployments/hekla-contract-logs.md b/packages/protocol/deployments/hekla-contract-logs.md index 18a3f4e41e8..181f4d6560f 100644 --- a/packages/protocol/deployments/hekla-contract-logs.md +++ b/packages/protocol/deployments/hekla-contract-logs.md @@ -111,7 +111,7 @@ ### taikoL1 - proxy: `0x79C9109b764609df928d16fC4a91e9081F7e87DB` -- impl: `0xb179D4038DD6084c548EEf674DAC262F51264e5e.` +- impl: `0xDC76feE152224F280E5c181835AE9cf6Ad208901.` - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` @@ -126,6 +126,7 @@ - upgraded on Jul 15, 2024 at commit `45281b8` - upgraded on Aug 15, 2024 at `protocol-v1.8.0` with [#17919](https://github.com/taikoxyz/taiko-mono/pull/17919) - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 16, 2024 at commit `233806e` ### assignmentHook From e8b14544718f423039b35354f2a610179215895e Mon Sep 17 00:00:00 2001 From: Gavin Yu Date: Thu, 17 Oct 2024 10:57:42 +0800 Subject: [PATCH 09/38] docs(taiko-client): update readme how to do integration test (#18256) --- packages/taiko-client/integration_test/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/taiko-client/integration_test/README.md b/packages/taiko-client/integration_test/README.md index 056dbacf88d..2e3d99cb137 100644 --- a/packages/taiko-client/integration_test/README.md +++ b/packages/taiko-client/integration_test/README.md @@ -1,4 +1,8 @@ # How to debug test cases? +- set up config +``` +export L2_NODE=l2_geth +``` - start docker compose From 6f668e5d2c04058b7039a444f77286af0586c3d0 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 17 Oct 2024 12:55:02 +0800 Subject: [PATCH 10/38] docs(protocol): update mainnet deployment (#18258) --- packages/protocol/deployments/mainnet-contract-logs-L1.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/protocol/deployments/mainnet-contract-logs-L1.md b/packages/protocol/deployments/mainnet-contract-logs-L1.md index 68f25ddce32..e7564a63ac7 100644 --- a/packages/protocol/deployments/mainnet-contract-logs-L1.md +++ b/packages/protocol/deployments/mainnet-contract-logs-L1.md @@ -209,7 +209,7 @@ - ens: `based.taiko.eth` - proxy: `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` -- impl: `0xBA1d90BCfA74163bFE09e8eF609b346507D83231` +- impl: `0xf0E6d34937701622cA887a75c150cC23d4FFDf2F` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -226,6 +226,7 @@ - Upgrade to `0x5fc54737ECC1de49D58AE1195d4A296257F1E31b` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` - Upgrade to `0xcEe590fACd976B9BDE87BC1B7620B284c5edD2C3` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` - Upgrade to `0xBA1d90BCfA74163bFE09e8eF609b346507D83231` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgrade to `0xf0E6d34937701622cA887a75c150cC23d4FFDf2F` @commit`b4f8547` @tx`0x8778064404816273804d74c97b051f3865bc03062cfa4b0e9567f4556ad31981` #### tier_provider From f91c2b597f671f5179921a268472b5648b102e7e Mon Sep 17 00:00:00 2001 From: Roger <50648015+RogerLamTd@users.noreply.github.com> Date: Sat, 19 Oct 2024 17:25:52 -0700 Subject: [PATCH 11/38] chore(docs-site): remove banner (#18267) --- packages/docs-site/src/content/config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/docs-site/src/content/config.ts b/packages/docs-site/src/content/config.ts index 9129eb8d987..96cdce61ff5 100644 --- a/packages/docs-site/src/content/config.ts +++ b/packages/docs-site/src/content/config.ts @@ -8,9 +8,9 @@ export const collections = { description: z .string() .max(160, { message: "Must be 160 characters or less." }).optional(), - banner: z.object({ content: z.string() }).default({ - content: 'All Hekla Node Runners: Imminent Ontake fork Sep 30th, upgrade needed. Please update your provers to raiko 1.2.0! Click here for more info', - }), + // banner: z.object({ content: z.string() }).default({ + // content: '', + // }), }), }), }), From 129960ac4d374d13424da7c7143e25cffc1a3594 Mon Sep 17 00:00:00 2001 From: taiko-bot <160625009+taiko-kitty@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:26:35 -0700 Subject: [PATCH 12/38] chore(main): release docs-site 1.12.3 (#18268) --- .release-please-manifest.json | 2 +- packages/docs-site/CHANGELOG.md | 7 +++++++ packages/docs-site/package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index f51a5f0d587..d6cbd6c9d3f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,6 +1,6 @@ { "packages/bridge-ui": "2.12.0", - "packages/docs-site": "1.12.2", + "packages/docs-site": "1.12.3", "packages/eventindexer": "0.13.0", "packages/fork-diff": "0.6.1", "packages/guardian-prover-health-check": "0.1.0", diff --git a/packages/docs-site/CHANGELOG.md b/packages/docs-site/CHANGELOG.md index 56c0c1af552..630b150b21e 100644 --- a/packages/docs-site/CHANGELOG.md +++ b/packages/docs-site/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.12.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.2...docs-site-v1.12.3) (2024-10-20) + + +### Chores + +* **docs-site:** remove banner ([#18267](https://github.com/taikoxyz/taiko-mono/issues/18267)) ([1a46093](https://github.com/taikoxyz/taiko-mono/commit/1a460932a704d3660269336540812f33d7e8cbc4)) + ## [1.12.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.1...docs-site-v1.12.2) (2024-10-14) diff --git a/packages/docs-site/package.json b/packages/docs-site/package.json index a38ee2c64e8..d30eb437e56 100644 --- a/packages/docs-site/package.json +++ b/packages/docs-site/package.json @@ -1,7 +1,7 @@ { "name": "docs-site", "type": "module", - "version": "1.12.2", + "version": "1.12.3", "scripts": { "dev": "astro dev", "start": "astro dev", From 438d13907f9dd6054722d098faa2386f4a9320d4 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Mon, 21 Oct 2024 13:42:39 +0800 Subject: [PATCH 13/38] chore(protocol): rename B_PRECONF_REGISTRY to B_PRECONF_TASK_MANAGER (#18271) --- packages/protocol/contracts/layer1/based/LibProposing.sol | 6 +++--- .../layer1/mainnet/addrcache/RollupAddressCache.sol | 2 +- packages/protocol/contracts/shared/common/LibStrings.sol | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index e5a2e089af9..4011b840e49 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -124,9 +124,9 @@ library LibProposing { revert L1_TOO_MANY_BLOCKS(); } - address preconfRegistry = _resolver.resolve(LibStrings.B_PRECONF_REGISTRY, true); - if (preconfRegistry != address(0)) { - if (preconfRegistry != msg.sender) revert L1_INVALID_PROPOSER(); + address preconfTaskManager = _resolver.resolve(LibStrings.B_PRECONF_TASK_MANAGER, true); + if (preconfTaskManager != address(0)) { + if (preconfTaskManager != msg.sender) revert L1_INVALID_PROPOSER(); local.allowCustomProposer = true; } diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol index 22a3542a2f0..3de57d1f465 100644 --- a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol @@ -48,7 +48,7 @@ contract RollupAddressCache is AddressCache { if (_name == LibStrings.B_AUTOMATA_DCAP_ATTESTATION) { return (true, 0x8d7C954960a36a7596d7eA4945dDf891967ca8A3); } - if (_name == LibStrings.B_PRECONF_REGISTRY) { + if (_name == LibStrings.B_PRECONF_TASK_MANAGER) { return (true, address(0)); } if (_name == LibStrings.B_CHAIN_WATCHDOG) { diff --git a/packages/protocol/contracts/shared/common/LibStrings.sol b/packages/protocol/contracts/shared/common/LibStrings.sol index db4c00a20ae..b4e6093bfbe 100644 --- a/packages/protocol/contracts/shared/common/LibStrings.sol +++ b/packages/protocol/contracts/shared/common/LibStrings.sol @@ -14,7 +14,7 @@ library LibStrings { bytes32 internal constant B_ERC1155_VAULT = bytes32("erc1155_vault"); bytes32 internal constant B_ERC20_VAULT = bytes32("erc20_vault"); bytes32 internal constant B_ERC721_VAULT = bytes32("erc721_vault"); - bytes32 internal constant B_PRECONF_REGISTRY = bytes32("preconf_registry"); + bytes32 internal constant B_PRECONF_TASK_MANAGER = bytes32("preconf_task_manager"); bytes32 internal constant B_PROVER_ASSIGNMENT = bytes32("PROVER_ASSIGNMENT"); bytes32 internal constant B_PROVER_SET = bytes32("prover_set"); bytes32 internal constant B_QUOTA_MANAGER = bytes32("quota_manager"); From 90f014b4453d5bfcfa59f0cf18c3b872c54029dd Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:26:44 +0800 Subject: [PATCH 14/38] fix(protocol): update `slotB.lastUnpausedAt` by both general unpause and proving unpause (#18276) Co-authored-by: dantaik --- packages/protocol/contract_layout_layer1.md | 882 +++++++++--------- packages/protocol/contract_layout_layer2.md | 374 ++++---- .../contracts/layer1/based/TaikoL1.sol | 18 +- .../shared/common/EssentialContract.sol | 16 +- 4 files changed, 652 insertions(+), 638 deletions(-) diff --git a/packages/protocol/contract_layout_layer1.md b/packages/protocol/contract_layout_layer1.md index f1ff0bd4fbf..9e8ce13b626 100644 --- a/packages/protocol/contract_layout_layer1.md +++ b/packages/protocol/contract_layout_layer1.md @@ -12,7 +12,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | ERC1155Vault | | __reentry | uint8 | 201 | 0 | 1 | ERC1155Vault | | __paused | uint8 | 201 | 1 | 1 | ERC1155Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC1155Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC1155Vault | | __gap | uint256[49] | 202 | 0 | 1568 | ERC1155Vault | | __gap | uint256[50] | 251 | 0 | 1600 | ERC1155Vault | | bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | ERC1155Vault | @@ -36,7 +36,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | ERC20Vault | | __reentry | uint8 | 201 | 0 | 1 | ERC20Vault | | __paused | uint8 | 201 | 1 | 1 | ERC20Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC20Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC20Vault | | __gap | uint256[49] | 202 | 0 | 1568 | ERC20Vault | | __gap | uint256[50] | 251 | 0 | 1600 | ERC20Vault | | bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | ERC20Vault | @@ -59,7 +59,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | ERC721Vault | | __reentry | uint8 | 201 | 0 | 1 | ERC721Vault | | __paused | uint8 | 201 | 1 | 1 | ERC721Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC721Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC721Vault | | __gap | uint256[49] | 202 | 0 | 1568 | ERC721Vault | | __gap | uint256[50] | 251 | 0 | 1600 | ERC721Vault | | bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | ERC721Vault | @@ -81,7 +81,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC20 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC20 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC20 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC20 | | _balances | mapping(address => uint256) | 251 | 0 | 32 | BridgedERC20 | | _allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | BridgedERC20 | @@ -110,7 +110,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC20V2 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC20V2 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC20V2 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20V2 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20V2 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC20V2 | | _balances | mapping(address => uint256) | 251 | 0 | 32 | BridgedERC20V2 | | _allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | BridgedERC20V2 | @@ -146,7 +146,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC721 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC721 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC721 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC721 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC721 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC721 | | __gap | uint256[50] | 251 | 0 | 1600 | BridgedERC721 | | _name | string | 301 | 0 | 32 | BridgedERC721 | @@ -174,7 +174,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC1155 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC1155 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC1155 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC1155 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC1155 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC1155 | | __gap | uint256[50] | 251 | 0 | 1600 | BridgedERC1155 | | _balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | BridgedERC1155 | @@ -188,67 +188,67 @@ | __gap | uint256[46] | 355 | 0 | 1472 | BridgedERC1155 | ## Bridge -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------|------|--------|-------|-------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | Bridge | -| _initializing | bool | 0 | 1 | 1 | Bridge | -| __gap | uint256[50] | 1 | 0 | 1600 | Bridge | -| _owner | address | 51 | 0 | 20 | Bridge | -| __gap | uint256[49] | 52 | 0 | 1568 | Bridge | -| _pendingOwner | address | 101 | 0 | 20 | Bridge | -| __gap | uint256[49] | 102 | 0 | 1568 | Bridge | -| addressManager | address | 151 | 0 | 20 | Bridge | -| __gap | uint256[49] | 152 | 0 | 1568 | Bridge | -| __reentry | uint8 | 201 | 0 | 1 | Bridge | -| __paused | uint8 | 201 | 1 | 1 | Bridge | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | Bridge | -| __gap | uint256[49] | 202 | 0 | 1568 | Bridge | -| __reserved1 | uint64 | 251 | 0 | 8 | Bridge | -| nextMessageId | uint64 | 251 | 8 | 8 | Bridge | -| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | Bridge | -| __ctx | struct IBridge.Context | 253 | 0 | 64 | Bridge | -| __reserved2 | uint256 | 255 | 0 | 32 | Bridge | -| __reserved3 | uint256 | 256 | 0 | 32 | Bridge | -| __gap | uint256[44] | 257 | 0 | 1408 | Bridge | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------|------|--------|-------|-------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | Bridge | +| _initializing | bool | 0 | 1 | 1 | Bridge | +| __gap | uint256[50] | 1 | 0 | 1600 | Bridge | +| _owner | address | 51 | 0 | 20 | Bridge | +| __gap | uint256[49] | 52 | 0 | 1568 | Bridge | +| _pendingOwner | address | 101 | 0 | 20 | Bridge | +| __gap | uint256[49] | 102 | 0 | 1568 | Bridge | +| addressManager | address | 151 | 0 | 20 | Bridge | +| __gap | uint256[49] | 152 | 0 | 1568 | Bridge | +| __reentry | uint8 | 201 | 0 | 1 | Bridge | +| __paused | uint8 | 201 | 1 | 1 | Bridge | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | Bridge | +| __gap | uint256[49] | 202 | 0 | 1568 | Bridge | +| __reserved1 | uint64 | 251 | 0 | 8 | Bridge | +| nextMessageId | uint64 | 251 | 8 | 8 | Bridge | +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | Bridge | +| __ctx | struct IBridge.Context | 253 | 0 | 64 | Bridge | +| __reserved2 | uint256 | 255 | 0 | 32 | Bridge | +| __reserved3 | uint256 | 256 | 0 | 32 | Bridge | +| __gap | uint256[44] | 257 | 0 | 1408 | Bridge | ## QuotaManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|-------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | QuotaManager | -| _initializing | bool | 0 | 1 | 1 | QuotaManager | -| __gap | uint256[50] | 1 | 0 | 1600 | QuotaManager | -| _owner | address | 51 | 0 | 20 | QuotaManager | -| __gap | uint256[49] | 52 | 0 | 1568 | QuotaManager | -| _pendingOwner | address | 101 | 0 | 20 | QuotaManager | -| __gap | uint256[49] | 102 | 0 | 1568 | QuotaManager | -| addressManager | address | 151 | 0 | 20 | QuotaManager | -| __gap | uint256[49] | 152 | 0 | 1568 | QuotaManager | -| __reentry | uint8 | 201 | 0 | 1 | QuotaManager | -| __paused | uint8 | 201 | 1 | 1 | QuotaManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | QuotaManager | -| __gap | uint256[49] | 202 | 0 | 1568 | QuotaManager | -| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | QuotaManager | -| quotaPeriod | uint24 | 252 | 0 | 3 | QuotaManager | -| __gap | uint256[48] | 253 | 0 | 1536 | QuotaManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------------|------|--------|-------|-------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | QuotaManager | +| _initializing | bool | 0 | 1 | 1 | QuotaManager | +| __gap | uint256[50] | 1 | 0 | 1600 | QuotaManager | +| _owner | address | 51 | 0 | 20 | QuotaManager | +| __gap | uint256[49] | 52 | 0 | 1568 | QuotaManager | +| _pendingOwner | address | 101 | 0 | 20 | QuotaManager | +| __gap | uint256[49] | 102 | 0 | 1568 | QuotaManager | +| addressManager | address | 151 | 0 | 20 | QuotaManager | +| __gap | uint256[49] | 152 | 0 | 1568 | QuotaManager | +| __reentry | uint8 | 201 | 0 | 1 | QuotaManager | +| __paused | uint8 | 201 | 1 | 1 | QuotaManager | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | QuotaManager | +| __gap | uint256[49] | 202 | 0 | 1568 | QuotaManager | +| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | QuotaManager | +| quotaPeriod | uint24 | 252 | 0 | 3 | QuotaManager | +| __gap | uint256[48] | 253 | 0 | 1536 | QuotaManager | ## AddressManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------------------------------------------|------|--------|-------|-----------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | AddressManager | -| _initializing | bool | 0 | 1 | 1 | AddressManager | -| __gap | uint256[50] | 1 | 0 | 1600 | AddressManager | -| _owner | address | 51 | 0 | 20 | AddressManager | -| __gap | uint256[49] | 52 | 0 | 1568 | AddressManager | -| _pendingOwner | address | 101 | 0 | 20 | AddressManager | -| __gap | uint256[49] | 102 | 0 | 1568 | AddressManager | -| addressManager | address | 151 | 0 | 20 | AddressManager | -| __gap | uint256[49] | 152 | 0 | 1568 | AddressManager | -| __reentry | uint8 | 201 | 0 | 1 | AddressManager | -| __paused | uint8 | 201 | 1 | 1 | AddressManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | AddressManager | -| __gap | uint256[49] | 202 | 0 | 1568 | AddressManager | -| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | AddressManager | -| __gap | uint256[49] | 252 | 0 | 1568 | AddressManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------------------------------------------|------|--------|-------|-----------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | AddressManager | +| _initializing | bool | 0 | 1 | 1 | AddressManager | +| __gap | uint256[50] | 1 | 0 | 1600 | AddressManager | +| _owner | address | 51 | 0 | 20 | AddressManager | +| __gap | uint256[49] | 52 | 0 | 1568 | AddressManager | +| _pendingOwner | address | 101 | 0 | 20 | AddressManager | +| __gap | uint256[49] | 102 | 0 | 1568 | AddressManager | +| addressManager | address | 151 | 0 | 20 | AddressManager | +| __gap | uint256[49] | 152 | 0 | 1568 | AddressManager | +| __reentry | uint8 | 201 | 0 | 1 | AddressManager | +| __paused | uint8 | 201 | 1 | 1 | AddressManager | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | AddressManager | +| __gap | uint256[49] | 202 | 0 | 1568 | AddressManager | +| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | AddressManager | +| __gap | uint256[49] | 252 | 0 | 1568 | AddressManager | ## AddressResolver | Name | Type | Slot | Offset | Bytes | Contract | @@ -259,41 +259,41 @@ | __gap | uint256[49] | 1 | 0 | 1568 | AddressResolver | ## EssentialContract -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|-----------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | EssentialContract | -| _initializing | bool | 0 | 1 | 1 | EssentialContract | -| __gap | uint256[50] | 1 | 0 | 1600 | EssentialContract | -| _owner | address | 51 | 0 | 20 | EssentialContract | -| __gap | uint256[49] | 52 | 0 | 1568 | EssentialContract | -| _pendingOwner | address | 101 | 0 | 20 | EssentialContract | -| __gap | uint256[49] | 102 | 0 | 1568 | EssentialContract | -| addressManager | address | 151 | 0 | 20 | EssentialContract | -| __gap | uint256[49] | 152 | 0 | 1568 | EssentialContract | -| __reentry | uint8 | 201 | 0 | 1 | EssentialContract | -| __paused | uint8 | 201 | 1 | 1 | EssentialContract | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | EssentialContract | -| __gap | uint256[49] | 202 | 0 | 1568 | EssentialContract | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|-----------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | EssentialContract | +| _initializing | bool | 0 | 1 | 1 | EssentialContract | +| __gap | uint256[50] | 1 | 0 | 1600 | EssentialContract | +| _owner | address | 51 | 0 | 20 | EssentialContract | +| __gap | uint256[49] | 52 | 0 | 1568 | EssentialContract | +| _pendingOwner | address | 101 | 0 | 20 | EssentialContract | +| __gap | uint256[49] | 102 | 0 | 1568 | EssentialContract | +| addressManager | address | 151 | 0 | 20 | EssentialContract | +| __gap | uint256[49] | 152 | 0 | 1568 | EssentialContract | +| __reentry | uint8 | 201 | 0 | 1 | EssentialContract | +| __paused | uint8 | 201 | 1 | 1 | EssentialContract | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | EssentialContract | +| __gap | uint256[49] | 202 | 0 | 1568 | EssentialContract | ## SignalService -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|---------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | SignalService | -| _initializing | bool | 0 | 1 | 1 | SignalService | -| __gap | uint256[50] | 1 | 0 | 1600 | SignalService | -| _owner | address | 51 | 0 | 20 | SignalService | -| __gap | uint256[49] | 52 | 0 | 1568 | SignalService | -| _pendingOwner | address | 101 | 0 | 20 | SignalService | -| __gap | uint256[49] | 102 | 0 | 1568 | SignalService | -| addressManager | address | 151 | 0 | 20 | SignalService | -| __gap | uint256[49] | 152 | 0 | 1568 | SignalService | -| __reentry | uint8 | 201 | 0 | 1 | SignalService | -| __paused | uint8 | 201 | 1 | 1 | SignalService | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | SignalService | -| __gap | uint256[49] | 202 | 0 | 1568 | SignalService | -| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | SignalService | -| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | SignalService | -| __gap | uint256[48] | 253 | 0 | 1536 | SignalService | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------------|------|--------|-------|---------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | SignalService | +| _initializing | bool | 0 | 1 | 1 | SignalService | +| __gap | uint256[50] | 1 | 0 | 1600 | SignalService | +| _owner | address | 51 | 0 | 20 | SignalService | +| __gap | uint256[49] | 52 | 0 | 1568 | SignalService | +| _pendingOwner | address | 101 | 0 | 20 | SignalService | +| __gap | uint256[49] | 102 | 0 | 1568 | SignalService | +| addressManager | address | 151 | 0 | 20 | SignalService | +| __gap | uint256[49] | 152 | 0 | 1568 | SignalService | +| __reentry | uint8 | 201 | 0 | 1 | SignalService | +| __paused | uint8 | 201 | 1 | 1 | SignalService | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | SignalService | +| __gap | uint256[49] | 202 | 0 | 1568 | SignalService | +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | SignalService | +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | SignalService | +| __gap | uint256[48] | 253 | 0 | 1536 | SignalService | ## TaikoToken | Name | Type | Slot | Offset | Bytes | Contract | @@ -309,7 +309,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | TaikoToken | | __reentry | uint8 | 201 | 0 | 1 | TaikoToken | | __paused | uint8 | 201 | 1 | 1 | TaikoToken | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | TaikoToken | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | TaikoToken | | __gap | uint256[49] | 202 | 0 | 1568 | TaikoToken | | __slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | TaikoToken | | _balances | mapping(address => uint256) | 301 | 0 | 32 | TaikoToken | @@ -333,98 +333,98 @@ | __gap | uint256[50] | 504 | 0 | 1600 | TaikoToken | ## ComposeVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | ComposeVerifier | -| _initializing | bool | 0 | 1 | 1 | ComposeVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | ComposeVerifier | -| _owner | address | 51 | 0 | 20 | ComposeVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | ComposeVerifier | -| _pendingOwner | address | 101 | 0 | 20 | ComposeVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | ComposeVerifier | -| addressManager | address | 151 | 0 | 20 | ComposeVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | ComposeVerifier | -| __reentry | uint8 | 201 | 0 | 1 | ComposeVerifier | -| __paused | uint8 | 201 | 1 | 1 | ComposeVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ComposeVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | ComposeVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | ComposeVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | ComposeVerifier | +| _initializing | bool | 0 | 1 | 1 | ComposeVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | ComposeVerifier | +| _owner | address | 51 | 0 | 20 | ComposeVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | ComposeVerifier | +| _pendingOwner | address | 101 | 0 | 20 | ComposeVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | ComposeVerifier | +| addressManager | address | 151 | 0 | 20 | ComposeVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | ComposeVerifier | +| __reentry | uint8 | 201 | 0 | 1 | ComposeVerifier | +| __paused | uint8 | 201 | 1 | 1 | ComposeVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ComposeVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | ComposeVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | ComposeVerifier | ## TeeAnyVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|----------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | TeeAnyVerifier | -| _initializing | bool | 0 | 1 | 1 | TeeAnyVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | TeeAnyVerifier | -| _owner | address | 51 | 0 | 20 | TeeAnyVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | TeeAnyVerifier | -| _pendingOwner | address | 101 | 0 | 20 | TeeAnyVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | TeeAnyVerifier | -| addressManager | address | 151 | 0 | 20 | TeeAnyVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | TeeAnyVerifier | -| __reentry | uint8 | 201 | 0 | 1 | TeeAnyVerifier | -| __paused | uint8 | 201 | 1 | 1 | TeeAnyVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | TeeAnyVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | TeeAnyVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | TeeAnyVerifier | -| __gap | uint256[50] | 301 | 0 | 1600 | TeeAnyVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|----------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | TeeAnyVerifier | +| _initializing | bool | 0 | 1 | 1 | TeeAnyVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | TeeAnyVerifier | +| _owner | address | 51 | 0 | 20 | TeeAnyVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | TeeAnyVerifier | +| _pendingOwner | address | 101 | 0 | 20 | TeeAnyVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | TeeAnyVerifier | +| addressManager | address | 151 | 0 | 20 | TeeAnyVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | TeeAnyVerifier | +| __reentry | uint8 | 201 | 0 | 1 | TeeAnyVerifier | +| __paused | uint8 | 201 | 1 | 1 | TeeAnyVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | TeeAnyVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | TeeAnyVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | TeeAnyVerifier | +| __gap | uint256[50] | 301 | 0 | 1600 | TeeAnyVerifier | ## ZkAndTeeVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|--------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | ZkAndTeeVerifier | -| _initializing | bool | 0 | 1 | 1 | ZkAndTeeVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | ZkAndTeeVerifier | -| _owner | address | 51 | 0 | 20 | ZkAndTeeVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | ZkAndTeeVerifier | -| _pendingOwner | address | 101 | 0 | 20 | ZkAndTeeVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | ZkAndTeeVerifier | -| addressManager | address | 151 | 0 | 20 | ZkAndTeeVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | ZkAndTeeVerifier | -| __reentry | uint8 | 201 | 0 | 1 | ZkAndTeeVerifier | -| __paused | uint8 | 201 | 1 | 1 | ZkAndTeeVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ZkAndTeeVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | ZkAndTeeVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | ZkAndTeeVerifier | -| __gap | uint256[50] | 301 | 0 | 1600 | ZkAndTeeVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|--------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | ZkAndTeeVerifier | +| _initializing | bool | 0 | 1 | 1 | ZkAndTeeVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | ZkAndTeeVerifier | +| _owner | address | 51 | 0 | 20 | ZkAndTeeVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | ZkAndTeeVerifier | +| _pendingOwner | address | 101 | 0 | 20 | ZkAndTeeVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | ZkAndTeeVerifier | +| addressManager | address | 151 | 0 | 20 | ZkAndTeeVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | ZkAndTeeVerifier | +| __reentry | uint8 | 201 | 0 | 1 | ZkAndTeeVerifier | +| __paused | uint8 | 201 | 1 | 1 | ZkAndTeeVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ZkAndTeeVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | ZkAndTeeVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | ZkAndTeeVerifier | +| __gap | uint256[50] | 301 | 0 | 1600 | ZkAndTeeVerifier | ## ZkAnyVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|--------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | ZkAnyVerifier | -| _initializing | bool | 0 | 1 | 1 | ZkAnyVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | ZkAnyVerifier | -| _owner | address | 51 | 0 | 20 | ZkAnyVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | ZkAnyVerifier | -| _pendingOwner | address | 101 | 0 | 20 | ZkAnyVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | ZkAnyVerifier | -| addressManager | address | 151 | 0 | 20 | ZkAnyVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | ZkAnyVerifier | -| __reentry | uint8 | 201 | 0 | 1 | ZkAnyVerifier | -| __paused | uint8 | 201 | 1 | 1 | ZkAnyVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ZkAnyVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | ZkAnyVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | ZkAnyVerifier | -| __gap | uint256[50] | 301 | 0 | 1600 | ZkAnyVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|--------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | ZkAnyVerifier | +| _initializing | bool | 0 | 1 | 1 | ZkAnyVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | ZkAnyVerifier | +| _owner | address | 51 | 0 | 20 | ZkAnyVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | ZkAnyVerifier | +| _pendingOwner | address | 101 | 0 | 20 | ZkAnyVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | ZkAnyVerifier | +| addressManager | address | 151 | 0 | 20 | ZkAnyVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | ZkAnyVerifier | +| __reentry | uint8 | 201 | 0 | 1 | ZkAnyVerifier | +| __paused | uint8 | 201 | 1 | 1 | ZkAnyVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ZkAnyVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | ZkAnyVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | ZkAnyVerifier | +| __gap | uint256[50] | 301 | 0 | 1600 | ZkAnyVerifier | ## Risc0Verifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | Risc0Verifier | -| _initializing | bool | 0 | 1 | 1 | Risc0Verifier | -| __gap | uint256[50] | 1 | 0 | 1600 | Risc0Verifier | -| _owner | address | 51 | 0 | 20 | Risc0Verifier | -| __gap | uint256[49] | 52 | 0 | 1568 | Risc0Verifier | -| _pendingOwner | address | 101 | 0 | 20 | Risc0Verifier | -| __gap | uint256[49] | 102 | 0 | 1568 | Risc0Verifier | -| addressManager | address | 151 | 0 | 20 | Risc0Verifier | -| __gap | uint256[49] | 152 | 0 | 1568 | Risc0Verifier | -| __reentry | uint8 | 201 | 0 | 1 | Risc0Verifier | -| __paused | uint8 | 201 | 1 | 1 | Risc0Verifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | Risc0Verifier | -| __gap | uint256[49] | 202 | 0 | 1568 | Risc0Verifier | -| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | Risc0Verifier | -| __gap | uint256[49] | 252 | 0 | 1568 | Risc0Verifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | Risc0Verifier | +| _initializing | bool | 0 | 1 | 1 | Risc0Verifier | +| __gap | uint256[50] | 1 | 0 | 1600 | Risc0Verifier | +| _owner | address | 51 | 0 | 20 | Risc0Verifier | +| __gap | uint256[49] | 52 | 0 | 1568 | Risc0Verifier | +| _pendingOwner | address | 101 | 0 | 20 | Risc0Verifier | +| __gap | uint256[49] | 102 | 0 | 1568 | Risc0Verifier | +| addressManager | address | 151 | 0 | 20 | Risc0Verifier | +| __gap | uint256[49] | 152 | 0 | 1568 | Risc0Verifier | +| __reentry | uint8 | 201 | 0 | 1 | Risc0Verifier | +| __paused | uint8 | 201 | 1 | 1 | Risc0Verifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | Risc0Verifier | +| __gap | uint256[49] | 202 | 0 | 1568 | Risc0Verifier | +| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | Risc0Verifier | +| __gap | uint256[49] | 252 | 0 | 1568 | Risc0Verifier | ## SP1Verifier | Name | Type | Slot | Offset | Bytes | Contract | @@ -440,7 +440,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | SP1Verifier | | __reentry | uint8 | 201 | 0 | 1 | SP1Verifier | | __paused | uint8 | 201 | 1 | 1 | SP1Verifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | SP1Verifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | SP1Verifier | | __gap | uint256[49] | 202 | 0 | 1568 | SP1Verifier | | isProgramTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | SP1Verifier | | __gap | uint256[49] | 252 | 0 | 1568 | SP1Verifier | @@ -459,7 +459,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | SgxVerifier | | __reentry | uint8 | 201 | 0 | 1 | SgxVerifier | | __paused | uint8 | 201 | 1 | 1 | SgxVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | SgxVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | SgxVerifier | | __gap | uint256[49] | 202 | 0 | 1568 | SgxVerifier | | nextInstanceId | uint256 | 251 | 0 | 32 | SgxVerifier | | instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | SgxVerifier | @@ -480,7 +480,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | AutomataDcapV3Attestation | | __reentry | uint8 | 201 | 0 | 1 | AutomataDcapV3Attestation | | __paused | uint8 | 201 | 1 | 1 | AutomataDcapV3Attestation | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | AutomataDcapV3Attestation | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | AutomataDcapV3Attestation | | __gap | uint256[49] | 202 | 0 | 1568 | AutomataDcapV3Attestation | | sigVerifyLib | contract ISigVerifyLib | 251 | 0 | 20 | AutomataDcapV3Attestation | | pemCertLib | contract IPEMCertChainLib | 252 | 0 | 20 | AutomataDcapV3Attestation | @@ -493,94 +493,94 @@ | __gap | uint256[39] | 261 | 0 | 1248 | AutomataDcapV3Attestation | ## TaikoL1 -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|------------------------|------|--------|-------|--------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | TaikoL1 | -| _initializing | bool | 0 | 1 | 1 | TaikoL1 | -| __gap | uint256[50] | 1 | 0 | 1600 | TaikoL1 | -| _owner | address | 51 | 0 | 20 | TaikoL1 | -| __gap | uint256[49] | 52 | 0 | 1568 | TaikoL1 | -| _pendingOwner | address | 101 | 0 | 20 | TaikoL1 | -| __gap | uint256[49] | 102 | 0 | 1568 | TaikoL1 | -| addressManager | address | 151 | 0 | 20 | TaikoL1 | -| __gap | uint256[49] | 152 | 0 | 1568 | TaikoL1 | -| __reentry | uint8 | 201 | 0 | 1 | TaikoL1 | -| __paused | uint8 | 201 | 1 | 1 | TaikoL1 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | TaikoL1 | -| __gap | uint256[49] | 202 | 0 | 1568 | TaikoL1 | -| state | struct TaikoData.State | 251 | 0 | 1600 | TaikoL1 | -| __gap | uint256[50] | 301 | 0 | 1600 | TaikoL1 | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|------------------------|------|--------|-------|--------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | TaikoL1 | +| _initializing | bool | 0 | 1 | 1 | TaikoL1 | +| __gap | uint256[50] | 1 | 0 | 1600 | TaikoL1 | +| _owner | address | 51 | 0 | 20 | TaikoL1 | +| __gap | uint256[49] | 52 | 0 | 1568 | TaikoL1 | +| _pendingOwner | address | 101 | 0 | 20 | TaikoL1 | +| __gap | uint256[49] | 102 | 0 | 1568 | TaikoL1 | +| addressManager | address | 151 | 0 | 20 | TaikoL1 | +| __gap | uint256[49] | 152 | 0 | 1568 | TaikoL1 | +| __reentry | uint8 | 201 | 0 | 1 | TaikoL1 | +| __paused | uint8 | 201 | 1 | 1 | TaikoL1 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | TaikoL1 | +| __gap | uint256[49] | 202 | 0 | 1568 | TaikoL1 | +| state | struct TaikoData.State | 251 | 0 | 1600 | TaikoL1 | +| __gap | uint256[50] | 301 | 0 | 1600 | TaikoL1 | ## TierProviderV2 | Name | Type | Slot | Offset | Bytes | Contract | |------|------|------|--------|-------|----------| ## HeklaTaikoL1 -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|------------------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | HeklaTaikoL1 | -| _initializing | bool | 0 | 1 | 1 | HeklaTaikoL1 | -| __gap | uint256[50] | 1 | 0 | 1600 | HeklaTaikoL1 | -| _owner | address | 51 | 0 | 20 | HeklaTaikoL1 | -| __gap | uint256[49] | 52 | 0 | 1568 | HeklaTaikoL1 | -| _pendingOwner | address | 101 | 0 | 20 | HeklaTaikoL1 | -| __gap | uint256[49] | 102 | 0 | 1568 | HeklaTaikoL1 | -| addressManager | address | 151 | 0 | 20 | HeklaTaikoL1 | -| __gap | uint256[49] | 152 | 0 | 1568 | HeklaTaikoL1 | -| __reentry | uint8 | 201 | 0 | 1 | HeklaTaikoL1 | -| __paused | uint8 | 201 | 1 | 1 | HeklaTaikoL1 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | HeklaTaikoL1 | -| __gap | uint256[49] | 202 | 0 | 1568 | HeklaTaikoL1 | -| state | struct TaikoData.State | 251 | 0 | 1600 | HeklaTaikoL1 | -| __gap | uint256[50] | 301 | 0 | 1600 | HeklaTaikoL1 | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|------------------------|------|--------|-------|------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | HeklaTaikoL1 | +| _initializing | bool | 0 | 1 | 1 | HeklaTaikoL1 | +| __gap | uint256[50] | 1 | 0 | 1600 | HeklaTaikoL1 | +| _owner | address | 51 | 0 | 20 | HeklaTaikoL1 | +| __gap | uint256[49] | 52 | 0 | 1568 | HeklaTaikoL1 | +| _pendingOwner | address | 101 | 0 | 20 | HeklaTaikoL1 | +| __gap | uint256[49] | 102 | 0 | 1568 | HeklaTaikoL1 | +| addressManager | address | 151 | 0 | 20 | HeklaTaikoL1 | +| __gap | uint256[49] | 152 | 0 | 1568 | HeklaTaikoL1 | +| __reentry | uint8 | 201 | 0 | 1 | HeklaTaikoL1 | +| __paused | uint8 | 201 | 1 | 1 | HeklaTaikoL1 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | HeklaTaikoL1 | +| __gap | uint256[49] | 202 | 0 | 1568 | HeklaTaikoL1 | +| state | struct TaikoData.State | 251 | 0 | 1600 | HeklaTaikoL1 | +| __gap | uint256[50] | 301 | 0 | 1600 | HeklaTaikoL1 | ## HeklaTierProvider | Name | Type | Slot | Offset | Bytes | Contract | |------|------|------|--------|-------|----------| ## MainnetBridge -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------|------|--------|-------|----------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetBridge | -| _initializing | bool | 0 | 1 | 1 | MainnetBridge | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetBridge | -| _owner | address | 51 | 0 | 20 | MainnetBridge | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetBridge | -| _pendingOwner | address | 101 | 0 | 20 | MainnetBridge | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetBridge | -| addressManager | address | 151 | 0 | 20 | MainnetBridge | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetBridge | -| __reentry | uint8 | 201 | 0 | 1 | MainnetBridge | -| __paused | uint8 | 201 | 1 | 1 | MainnetBridge | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetBridge | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetBridge | -| __reserved1 | uint64 | 251 | 0 | 8 | MainnetBridge | -| nextMessageId | uint64 | 251 | 8 | 8 | MainnetBridge | -| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | MainnetBridge | -| __ctx | struct IBridge.Context | 253 | 0 | 64 | MainnetBridge | -| __reserved2 | uint256 | 255 | 0 | 32 | MainnetBridge | -| __reserved3 | uint256 | 256 | 0 | 32 | MainnetBridge | -| __gap | uint256[44] | 257 | 0 | 1408 | MainnetBridge | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------|------|--------|-------|----------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetBridge | +| _initializing | bool | 0 | 1 | 1 | MainnetBridge | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetBridge | +| _owner | address | 51 | 0 | 20 | MainnetBridge | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetBridge | +| _pendingOwner | address | 101 | 0 | 20 | MainnetBridge | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetBridge | +| addressManager | address | 151 | 0 | 20 | MainnetBridge | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetBridge | +| __reentry | uint8 | 201 | 0 | 1 | MainnetBridge | +| __paused | uint8 | 201 | 1 | 1 | MainnetBridge | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetBridge | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetBridge | +| __reserved1 | uint64 | 251 | 0 | 8 | MainnetBridge | +| nextMessageId | uint64 | 251 | 8 | 8 | MainnetBridge | +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | MainnetBridge | +| __ctx | struct IBridge.Context | 253 | 0 | 64 | MainnetBridge | +| __reserved2 | uint256 | 255 | 0 | 32 | MainnetBridge | +| __reserved3 | uint256 | 256 | 0 | 32 | MainnetBridge | +| __gap | uint256[44] | 257 | 0 | 1408 | MainnetBridge | ## MainnetSignalService -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetSignalService | -| _initializing | bool | 0 | 1 | 1 | MainnetSignalService | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetSignalService | -| _owner | address | 51 | 0 | 20 | MainnetSignalService | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetSignalService | -| _pendingOwner | address | 101 | 0 | 20 | MainnetSignalService | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetSignalService | -| addressManager | address | 151 | 0 | 20 | MainnetSignalService | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetSignalService | -| __reentry | uint8 | 201 | 0 | 1 | MainnetSignalService | -| __paused | uint8 | 201 | 1 | 1 | MainnetSignalService | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSignalService | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetSignalService | -| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | MainnetSignalService | -| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | MainnetSignalService | -| __gap | uint256[48] | 253 | 0 | 1536 | MainnetSignalService | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------------|------|--------|-------|------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetSignalService | +| _initializing | bool | 0 | 1 | 1 | MainnetSignalService | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetSignalService | +| _owner | address | 51 | 0 | 20 | MainnetSignalService | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetSignalService | +| _pendingOwner | address | 101 | 0 | 20 | MainnetSignalService | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetSignalService | +| addressManager | address | 151 | 0 | 20 | MainnetSignalService | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetSignalService | +| __reentry | uint8 | 201 | 0 | 1 | MainnetSignalService | +| __paused | uint8 | 201 | 1 | 1 | MainnetSignalService | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSignalService | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetSignalService | +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | MainnetSignalService | +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | MainnetSignalService | +| __gap | uint256[48] | 253 | 0 | 1536 | MainnetSignalService | ## MainnetERC20Vault | Name | Type | Slot | Offset | Bytes | Contract | @@ -596,7 +596,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | MainnetERC20Vault | | __reentry | uint8 | 201 | 0 | 1 | MainnetERC20Vault | | __paused | uint8 | 201 | 1 | 1 | MainnetERC20Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetERC20Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetERC20Vault | | __gap | uint256[49] | 202 | 0 | 1568 | MainnetERC20Vault | | __gap | uint256[50] | 251 | 0 | 1600 | MainnetERC20Vault | | bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | MainnetERC20Vault | @@ -619,7 +619,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | MainnetERC1155Vault | | __reentry | uint8 | 201 | 0 | 1 | MainnetERC1155Vault | | __paused | uint8 | 201 | 1 | 1 | MainnetERC1155Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetERC1155Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetERC1155Vault | | __gap | uint256[49] | 202 | 0 | 1568 | MainnetERC1155Vault | | __gap | uint256[50] | 251 | 0 | 1600 | MainnetERC1155Vault | | bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | MainnetERC1155Vault | @@ -643,7 +643,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | MainnetERC721Vault | | __reentry | uint8 | 201 | 0 | 1 | MainnetERC721Vault | | __paused | uint8 | 201 | 1 | 1 | MainnetERC721Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetERC721Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetERC721Vault | | __gap | uint256[49] | 202 | 0 | 1568 | MainnetERC721Vault | | __gap | uint256[50] | 251 | 0 | 1600 | MainnetERC721Vault | | bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | MainnetERC721Vault | @@ -652,23 +652,23 @@ | __gap | uint256[50] | 351 | 0 | 1600 | MainnetERC721Vault | ## MainnetSharedAddressManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetSharedAddressManager | -| _initializing | bool | 0 | 1 | 1 | MainnetSharedAddressManager | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetSharedAddressManager | -| _owner | address | 51 | 0 | 20 | MainnetSharedAddressManager | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetSharedAddressManager | -| _pendingOwner | address | 101 | 0 | 20 | MainnetSharedAddressManager | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetSharedAddressManager | -| addressManager | address | 151 | 0 | 20 | MainnetSharedAddressManager | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetSharedAddressManager | -| __reentry | uint8 | 201 | 0 | 1 | MainnetSharedAddressManager | -| __paused | uint8 | 201 | 1 | 1 | MainnetSharedAddressManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSharedAddressManager | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetSharedAddressManager | -| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | MainnetSharedAddressManager | -| __gap | uint256[49] | 252 | 0 | 1568 | MainnetSharedAddressManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetSharedAddressManager | +| _initializing | bool | 0 | 1 | 1 | MainnetSharedAddressManager | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetSharedAddressManager | +| _owner | address | 51 | 0 | 20 | MainnetSharedAddressManager | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetSharedAddressManager | +| _pendingOwner | address | 101 | 0 | 20 | MainnetSharedAddressManager | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetSharedAddressManager | +| addressManager | address | 151 | 0 | 20 | MainnetSharedAddressManager | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetSharedAddressManager | +| __reentry | uint8 | 201 | 0 | 1 | MainnetSharedAddressManager | +| __paused | uint8 | 201 | 1 | 1 | MainnetSharedAddressManager | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSharedAddressManager | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetSharedAddressManager | +| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | MainnetSharedAddressManager | +| __gap | uint256[49] | 252 | 0 | 1568 | MainnetSharedAddressManager | ## RollupAddressCache | Name | Type | Slot | Offset | Bytes | Contract | @@ -696,7 +696,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | MainnetSgxVerifier | | __reentry | uint8 | 201 | 0 | 1 | MainnetSgxVerifier | | __paused | uint8 | 201 | 1 | 1 | MainnetSgxVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSgxVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSgxVerifier | | __gap | uint256[49] | 202 | 0 | 1568 | MainnetSgxVerifier | | nextInstanceId | uint256 | 251 | 0 | 32 | MainnetSgxVerifier | | instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | MainnetSgxVerifier | @@ -717,86 +717,86 @@ | __gap | uint256[49] | 152 | 0 | 1568 | MainnetSP1Verifier | | __reentry | uint8 | 201 | 0 | 1 | MainnetSP1Verifier | | __paused | uint8 | 201 | 1 | 1 | MainnetSP1Verifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSP1Verifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetSP1Verifier | | __gap | uint256[49] | 202 | 0 | 1568 | MainnetSP1Verifier | | isProgramTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | MainnetSP1Verifier | | __gap | uint256[49] | 252 | 0 | 1568 | MainnetSP1Verifier | ## MainnetZkAnyVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|-----------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetZkAnyVerifier | -| _initializing | bool | 0 | 1 | 1 | MainnetZkAnyVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetZkAnyVerifier | -| _owner | address | 51 | 0 | 20 | MainnetZkAnyVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetZkAnyVerifier | -| _pendingOwner | address | 101 | 0 | 20 | MainnetZkAnyVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetZkAnyVerifier | -| addressManager | address | 151 | 0 | 20 | MainnetZkAnyVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetZkAnyVerifier | -| __reentry | uint8 | 201 | 0 | 1 | MainnetZkAnyVerifier | -| __paused | uint8 | 201 | 1 | 1 | MainnetZkAnyVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetZkAnyVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetZkAnyVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | MainnetZkAnyVerifier | -| __gap | uint256[50] | 301 | 0 | 1600 | MainnetZkAnyVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|-----------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetZkAnyVerifier | +| _initializing | bool | 0 | 1 | 1 | MainnetZkAnyVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetZkAnyVerifier | +| _owner | address | 51 | 0 | 20 | MainnetZkAnyVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetZkAnyVerifier | +| _pendingOwner | address | 101 | 0 | 20 | MainnetZkAnyVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetZkAnyVerifier | +| addressManager | address | 151 | 0 | 20 | MainnetZkAnyVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetZkAnyVerifier | +| __reentry | uint8 | 201 | 0 | 1 | MainnetZkAnyVerifier | +| __paused | uint8 | 201 | 1 | 1 | MainnetZkAnyVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetZkAnyVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetZkAnyVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | MainnetZkAnyVerifier | +| __gap | uint256[50] | 301 | 0 | 1600 | MainnetZkAnyVerifier | ## MainnetRisc0Verifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|-----------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetRisc0Verifier | -| _initializing | bool | 0 | 1 | 1 | MainnetRisc0Verifier | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetRisc0Verifier | -| _owner | address | 51 | 0 | 20 | MainnetRisc0Verifier | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetRisc0Verifier | -| _pendingOwner | address | 101 | 0 | 20 | MainnetRisc0Verifier | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetRisc0Verifier | -| addressManager | address | 151 | 0 | 20 | MainnetRisc0Verifier | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetRisc0Verifier | -| __reentry | uint8 | 201 | 0 | 1 | MainnetRisc0Verifier | -| __paused | uint8 | 201 | 1 | 1 | MainnetRisc0Verifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetRisc0Verifier | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetRisc0Verifier | -| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | MainnetRisc0Verifier | -| __gap | uint256[49] | 252 | 0 | 1568 | MainnetRisc0Verifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|-----------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetRisc0Verifier | +| _initializing | bool | 0 | 1 | 1 | MainnetRisc0Verifier | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetRisc0Verifier | +| _owner | address | 51 | 0 | 20 | MainnetRisc0Verifier | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetRisc0Verifier | +| _pendingOwner | address | 101 | 0 | 20 | MainnetRisc0Verifier | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetRisc0Verifier | +| addressManager | address | 151 | 0 | 20 | MainnetRisc0Verifier | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetRisc0Verifier | +| __reentry | uint8 | 201 | 0 | 1 | MainnetRisc0Verifier | +| __paused | uint8 | 201 | 1 | 1 | MainnetRisc0Verifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetRisc0Verifier | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetRisc0Verifier | +| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | MainnetRisc0Verifier | +| __gap | uint256[49] | 252 | 0 | 1568 | MainnetRisc0Verifier | ## MainnetZkAndTeeVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|-----------------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetZkAndTeeVerifier | -| _initializing | bool | 0 | 1 | 1 | MainnetZkAndTeeVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetZkAndTeeVerifier | -| _owner | address | 51 | 0 | 20 | MainnetZkAndTeeVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetZkAndTeeVerifier | -| _pendingOwner | address | 101 | 0 | 20 | MainnetZkAndTeeVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetZkAndTeeVerifier | -| addressManager | address | 151 | 0 | 20 | MainnetZkAndTeeVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetZkAndTeeVerifier | -| __reentry | uint8 | 201 | 0 | 1 | MainnetZkAndTeeVerifier | -| __paused | uint8 | 201 | 1 | 1 | MainnetZkAndTeeVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetZkAndTeeVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetZkAndTeeVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | MainnetZkAndTeeVerifier | -| __gap | uint256[50] | 301 | 0 | 1600 | MainnetZkAndTeeVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|-----------------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetZkAndTeeVerifier | +| _initializing | bool | 0 | 1 | 1 | MainnetZkAndTeeVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetZkAndTeeVerifier | +| _owner | address | 51 | 0 | 20 | MainnetZkAndTeeVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetZkAndTeeVerifier | +| _pendingOwner | address | 101 | 0 | 20 | MainnetZkAndTeeVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetZkAndTeeVerifier | +| addressManager | address | 151 | 0 | 20 | MainnetZkAndTeeVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetZkAndTeeVerifier | +| __reentry | uint8 | 201 | 0 | 1 | MainnetZkAndTeeVerifier | +| __paused | uint8 | 201 | 1 | 1 | MainnetZkAndTeeVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetZkAndTeeVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetZkAndTeeVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | MainnetZkAndTeeVerifier | +| __gap | uint256[50] | 301 | 0 | 1600 | MainnetZkAndTeeVerifier | ## MainnetTeeAnyVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|-------------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetTeeAnyVerifier | -| _initializing | bool | 0 | 1 | 1 | MainnetTeeAnyVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetTeeAnyVerifier | -| _owner | address | 51 | 0 | 20 | MainnetTeeAnyVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetTeeAnyVerifier | -| _pendingOwner | address | 101 | 0 | 20 | MainnetTeeAnyVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetTeeAnyVerifier | -| addressManager | address | 151 | 0 | 20 | MainnetTeeAnyVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetTeeAnyVerifier | -| __reentry | uint8 | 201 | 0 | 1 | MainnetTeeAnyVerifier | -| __paused | uint8 | 201 | 1 | 1 | MainnetTeeAnyVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetTeeAnyVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetTeeAnyVerifier | -| __gap | uint256[50] | 251 | 0 | 1600 | MainnetTeeAnyVerifier | -| __gap | uint256[50] | 301 | 0 | 1600 | MainnetTeeAnyVerifier | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|-------------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetTeeAnyVerifier | +| _initializing | bool | 0 | 1 | 1 | MainnetTeeAnyVerifier | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetTeeAnyVerifier | +| _owner | address | 51 | 0 | 20 | MainnetTeeAnyVerifier | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetTeeAnyVerifier | +| _pendingOwner | address | 101 | 0 | 20 | MainnetTeeAnyVerifier | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetTeeAnyVerifier | +| addressManager | address | 151 | 0 | 20 | MainnetTeeAnyVerifier | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetTeeAnyVerifier | +| __reentry | uint8 | 201 | 0 | 1 | MainnetTeeAnyVerifier | +| __paused | uint8 | 201 | 1 | 1 | MainnetTeeAnyVerifier | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetTeeAnyVerifier | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetTeeAnyVerifier | +| __gap | uint256[50] | 251 | 0 | 1600 | MainnetTeeAnyVerifier | +| __gap | uint256[50] | 301 | 0 | 1600 | MainnetTeeAnyVerifier | ## MainnetGuardianProver | Name | Type | Slot | Offset | Bytes | Contract | @@ -812,7 +812,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | MainnetGuardianProver | | __reentry | uint8 | 201 | 0 | 1 | MainnetGuardianProver | | __paused | uint8 | 201 | 1 | 1 | MainnetGuardianProver | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetGuardianProver | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetGuardianProver | | __gap | uint256[49] | 202 | 0 | 1568 | MainnetGuardianProver | | guardianIds | mapping(address => uint256) | 251 | 0 | 32 | MainnetGuardianProver | | approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | MainnetGuardianProver | @@ -824,108 +824,108 @@ | __gap | uint256[45] | 256 | 0 | 1440 | MainnetGuardianProver | ## MainnetTaikoL1 -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|------------------------|------|--------|-------|-------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetTaikoL1 | -| _initializing | bool | 0 | 1 | 1 | MainnetTaikoL1 | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetTaikoL1 | -| _owner | address | 51 | 0 | 20 | MainnetTaikoL1 | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetTaikoL1 | -| _pendingOwner | address | 101 | 0 | 20 | MainnetTaikoL1 | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetTaikoL1 | -| addressManager | address | 151 | 0 | 20 | MainnetTaikoL1 | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetTaikoL1 | -| __reentry | uint8 | 201 | 0 | 1 | MainnetTaikoL1 | -| __paused | uint8 | 201 | 1 | 1 | MainnetTaikoL1 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetTaikoL1 | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetTaikoL1 | -| state | struct TaikoData.State | 251 | 0 | 1600 | MainnetTaikoL1 | -| __gap | uint256[50] | 301 | 0 | 1600 | MainnetTaikoL1 | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|------------------------|------|--------|-------|-------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetTaikoL1 | +| _initializing | bool | 0 | 1 | 1 | MainnetTaikoL1 | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetTaikoL1 | +| _owner | address | 51 | 0 | 20 | MainnetTaikoL1 | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetTaikoL1 | +| _pendingOwner | address | 101 | 0 | 20 | MainnetTaikoL1 | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetTaikoL1 | +| addressManager | address | 151 | 0 | 20 | MainnetTaikoL1 | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetTaikoL1 | +| __reentry | uint8 | 201 | 0 | 1 | MainnetTaikoL1 | +| __paused | uint8 | 201 | 1 | 1 | MainnetTaikoL1 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetTaikoL1 | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetTaikoL1 | +| state | struct TaikoData.State | 251 | 0 | 1600 | MainnetTaikoL1 | +| __gap | uint256[50] | 301 | 0 | 1600 | MainnetTaikoL1 | ## MainnetRollupAddressManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------------------------------------------|------|--------|-------|---------------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetRollupAddressManager | -| _initializing | bool | 0 | 1 | 1 | MainnetRollupAddressManager | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetRollupAddressManager | -| _owner | address | 51 | 0 | 20 | MainnetRollupAddressManager | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetRollupAddressManager | -| _pendingOwner | address | 101 | 0 | 20 | MainnetRollupAddressManager | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetRollupAddressManager | -| addressManager | address | 151 | 0 | 20 | MainnetRollupAddressManager | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetRollupAddressManager | -| __reentry | uint8 | 201 | 0 | 1 | MainnetRollupAddressManager | -| __paused | uint8 | 201 | 1 | 1 | MainnetRollupAddressManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetRollupAddressManager | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetRollupAddressManager | -| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | MainnetRollupAddressManager | -| __gap | uint256[49] | 252 | 0 | 1568 | MainnetRollupAddressManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------------------------------------------|------|--------|-------|---------------------------------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetRollupAddressManager | +| _initializing | bool | 0 | 1 | 1 | MainnetRollupAddressManager | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetRollupAddressManager | +| _owner | address | 51 | 0 | 20 | MainnetRollupAddressManager | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetRollupAddressManager | +| _pendingOwner | address | 101 | 0 | 20 | MainnetRollupAddressManager | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetRollupAddressManager | +| addressManager | address | 151 | 0 | 20 | MainnetRollupAddressManager | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetRollupAddressManager | +| __reentry | uint8 | 201 | 0 | 1 | MainnetRollupAddressManager | +| __paused | uint8 | 201 | 1 | 1 | MainnetRollupAddressManager | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetRollupAddressManager | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetRollupAddressManager | +| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | MainnetRollupAddressManager | +| __gap | uint256[49] | 252 | 0 | 1568 | MainnetRollupAddressManager | ## MainnetTierRouter | Name | Type | Slot | Offset | Bytes | Contract | |------|------|------|--------|-------|----------| ## MainnetProverSet -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|-----------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetProverSet | -| _initializing | bool | 0 | 1 | 1 | MainnetProverSet | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetProverSet | -| _owner | address | 51 | 0 | 20 | MainnetProverSet | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetProverSet | -| _pendingOwner | address | 101 | 0 | 20 | MainnetProverSet | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetProverSet | -| addressManager | address | 151 | 0 | 20 | MainnetProverSet | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetProverSet | -| __reentry | uint8 | 201 | 0 | 1 | MainnetProverSet | -| __paused | uint8 | 201 | 1 | 1 | MainnetProverSet | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetProverSet | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetProverSet | -| isProver | mapping(address => bool) | 251 | 0 | 32 | MainnetProverSet | -| admin | address | 252 | 0 | 20 | MainnetProverSet | -| __gap | uint256[48] | 253 | 0 | 1536 | MainnetProverSet | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|-----------------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetProverSet | +| _initializing | bool | 0 | 1 | 1 | MainnetProverSet | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetProverSet | +| _owner | address | 51 | 0 | 20 | MainnetProverSet | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetProverSet | +| _pendingOwner | address | 101 | 0 | 20 | MainnetProverSet | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetProverSet | +| addressManager | address | 151 | 0 | 20 | MainnetProverSet | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetProverSet | +| __reentry | uint8 | 201 | 0 | 1 | MainnetProverSet | +| __paused | uint8 | 201 | 1 | 1 | MainnetProverSet | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetProverSet | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetProverSet | +| isProver | mapping(address => bool) | 251 | 0 | 32 | MainnetProverSet | +| admin | address | 252 | 0 | 20 | MainnetProverSet | +| __gap | uint256[48] | 253 | 0 | 1536 | MainnetProverSet | ## TokenUnlock -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|---------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | TokenUnlock | -| _initializing | bool | 0 | 1 | 1 | TokenUnlock | -| __gap | uint256[50] | 1 | 0 | 1600 | TokenUnlock | -| _owner | address | 51 | 0 | 20 | TokenUnlock | -| __gap | uint256[49] | 52 | 0 | 1568 | TokenUnlock | -| _pendingOwner | address | 101 | 0 | 20 | TokenUnlock | -| __gap | uint256[49] | 102 | 0 | 1568 | TokenUnlock | -| addressManager | address | 151 | 0 | 20 | TokenUnlock | -| __gap | uint256[49] | 152 | 0 | 1568 | TokenUnlock | -| __reentry | uint8 | 201 | 0 | 1 | TokenUnlock | -| __paused | uint8 | 201 | 1 | 1 | TokenUnlock | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | TokenUnlock | -| __gap | uint256[49] | 202 | 0 | 1568 | TokenUnlock | -| amountVested | uint256 | 251 | 0 | 32 | TokenUnlock | -| recipient | address | 252 | 0 | 20 | TokenUnlock | -| tgeTimestamp | uint64 | 252 | 20 | 8 | TokenUnlock | -| isProverSet | mapping(address => bool) | 253 | 0 | 32 | TokenUnlock | -| __gap | uint256[47] | 254 | 0 | 1504 | TokenUnlock | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|---------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | TokenUnlock | +| _initializing | bool | 0 | 1 | 1 | TokenUnlock | +| __gap | uint256[50] | 1 | 0 | 1600 | TokenUnlock | +| _owner | address | 51 | 0 | 20 | TokenUnlock | +| __gap | uint256[49] | 52 | 0 | 1568 | TokenUnlock | +| _pendingOwner | address | 101 | 0 | 20 | TokenUnlock | +| __gap | uint256[49] | 102 | 0 | 1568 | TokenUnlock | +| addressManager | address | 151 | 0 | 20 | TokenUnlock | +| __gap | uint256[49] | 152 | 0 | 1568 | TokenUnlock | +| __reentry | uint8 | 201 | 0 | 1 | TokenUnlock | +| __paused | uint8 | 201 | 1 | 1 | TokenUnlock | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | TokenUnlock | +| __gap | uint256[49] | 202 | 0 | 1568 | TokenUnlock | +| amountVested | uint256 | 251 | 0 | 32 | TokenUnlock | +| recipient | address | 252 | 0 | 20 | TokenUnlock | +| tgeTimestamp | uint64 | 252 | 20 | 8 | TokenUnlock | +| isProverSet | mapping(address => bool) | 253 | 0 | 32 | TokenUnlock | +| __gap | uint256[47] | 254 | 0 | 1504 | TokenUnlock | ## ProverSet -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | ProverSet | -| _initializing | bool | 0 | 1 | 1 | ProverSet | -| __gap | uint256[50] | 1 | 0 | 1600 | ProverSet | -| _owner | address | 51 | 0 | 20 | ProverSet | -| __gap | uint256[49] | 52 | 0 | 1568 | ProverSet | -| _pendingOwner | address | 101 | 0 | 20 | ProverSet | -| __gap | uint256[49] | 102 | 0 | 1568 | ProverSet | -| addressManager | address | 151 | 0 | 20 | ProverSet | -| __gap | uint256[49] | 152 | 0 | 1568 | ProverSet | -| __reentry | uint8 | 201 | 0 | 1 | ProverSet | -| __paused | uint8 | 201 | 1 | 1 | ProverSet | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ProverSet | -| __gap | uint256[49] | 202 | 0 | 1568 | ProverSet | -| isProver | mapping(address => bool) | 251 | 0 | 32 | ProverSet | -| admin | address | 252 | 0 | 20 | ProverSet | -| __gap | uint256[48] | 253 | 0 | 1536 | ProverSet | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|--------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | ProverSet | +| _initializing | bool | 0 | 1 | 1 | ProverSet | +| __gap | uint256[50] | 1 | 0 | 1600 | ProverSet | +| _owner | address | 51 | 0 | 20 | ProverSet | +| __gap | uint256[49] | 52 | 0 | 1568 | ProverSet | +| _pendingOwner | address | 101 | 0 | 20 | ProverSet | +| __gap | uint256[49] | 102 | 0 | 1568 | ProverSet | +| addressManager | address | 151 | 0 | 20 | ProverSet | +| __gap | uint256[49] | 152 | 0 | 1568 | ProverSet | +| __reentry | uint8 | 201 | 0 | 1 | ProverSet | +| __paused | uint8 | 201 | 1 | 1 | ProverSet | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ProverSet | +| __gap | uint256[49] | 202 | 0 | 1568 | ProverSet | +| isProver | mapping(address => bool) | 251 | 0 | 32 | ProverSet | +| admin | address | 252 | 0 | 20 | ProverSet | +| __gap | uint256[48] | 253 | 0 | 1536 | ProverSet | ## GuardianProver | Name | Type | Slot | Offset | Bytes | Contract | @@ -941,7 +941,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | GuardianProver | | __reentry | uint8 | 201 | 0 | 1 | GuardianProver | | __paused | uint8 | 201 | 1 | 1 | GuardianProver | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | GuardianProver | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | GuardianProver | | __gap | uint256[49] | 202 | 0 | 1568 | GuardianProver | | guardianIds | mapping(address => uint256) | 251 | 0 | 32 | GuardianProver | | approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | GuardianProver | diff --git a/packages/protocol/contract_layout_layer2.md b/packages/protocol/contract_layout_layer2.md index 4c9776da7d2..e0f97f06590 100644 --- a/packages/protocol/contract_layout_layer2.md +++ b/packages/protocol/contract_layout_layer2.md @@ -12,7 +12,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | ERC1155Vault | | __reentry | uint8 | 201 | 0 | 1 | ERC1155Vault | | __paused | uint8 | 201 | 1 | 1 | ERC1155Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC1155Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC1155Vault | | __gap | uint256[49] | 202 | 0 | 1568 | ERC1155Vault | | __gap | uint256[50] | 251 | 0 | 1600 | ERC1155Vault | | bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | ERC1155Vault | @@ -36,7 +36,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | ERC20Vault | | __reentry | uint8 | 201 | 0 | 1 | ERC20Vault | | __paused | uint8 | 201 | 1 | 1 | ERC20Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC20Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC20Vault | | __gap | uint256[49] | 202 | 0 | 1568 | ERC20Vault | | __gap | uint256[50] | 251 | 0 | 1600 | ERC20Vault | | bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | ERC20Vault | @@ -59,7 +59,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | ERC721Vault | | __reentry | uint8 | 201 | 0 | 1 | ERC721Vault | | __paused | uint8 | 201 | 1 | 1 | ERC721Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC721Vault | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | ERC721Vault | | __gap | uint256[49] | 202 | 0 | 1568 | ERC721Vault | | __gap | uint256[50] | 251 | 0 | 1600 | ERC721Vault | | bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | ERC721Vault | @@ -81,7 +81,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC20 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC20 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC20 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC20 | | _balances | mapping(address => uint256) | 251 | 0 | 32 | BridgedERC20 | | _allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | BridgedERC20 | @@ -110,7 +110,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC20V2 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC20V2 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC20V2 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20V2 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC20V2 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC20V2 | | _balances | mapping(address => uint256) | 251 | 0 | 32 | BridgedERC20V2 | | _allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | BridgedERC20V2 | @@ -146,7 +146,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC721 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC721 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC721 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC721 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC721 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC721 | | __gap | uint256[50] | 251 | 0 | 1600 | BridgedERC721 | | _name | string | 301 | 0 | 32 | BridgedERC721 | @@ -174,7 +174,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedERC1155 | | __reentry | uint8 | 201 | 0 | 1 | BridgedERC1155 | | __paused | uint8 | 201 | 1 | 1 | BridgedERC1155 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC1155 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedERC1155 | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedERC1155 | | __gap | uint256[50] | 251 | 0 | 1600 | BridgedERC1155 | | _balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | BridgedERC1155 | @@ -188,67 +188,67 @@ | __gap | uint256[46] | 355 | 0 | 1472 | BridgedERC1155 | ## Bridge -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------|------|--------|-------|-------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | Bridge | -| _initializing | bool | 0 | 1 | 1 | Bridge | -| __gap | uint256[50] | 1 | 0 | 1600 | Bridge | -| _owner | address | 51 | 0 | 20 | Bridge | -| __gap | uint256[49] | 52 | 0 | 1568 | Bridge | -| _pendingOwner | address | 101 | 0 | 20 | Bridge | -| __gap | uint256[49] | 102 | 0 | 1568 | Bridge | -| addressManager | address | 151 | 0 | 20 | Bridge | -| __gap | uint256[49] | 152 | 0 | 1568 | Bridge | -| __reentry | uint8 | 201 | 0 | 1 | Bridge | -| __paused | uint8 | 201 | 1 | 1 | Bridge | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | Bridge | -| __gap | uint256[49] | 202 | 0 | 1568 | Bridge | -| __reserved1 | uint64 | 251 | 0 | 8 | Bridge | -| nextMessageId | uint64 | 251 | 8 | 8 | Bridge | -| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | Bridge | -| __ctx | struct IBridge.Context | 253 | 0 | 64 | Bridge | -| __reserved2 | uint256 | 255 | 0 | 32 | Bridge | -| __reserved3 | uint256 | 256 | 0 | 32 | Bridge | -| __gap | uint256[44] | 257 | 0 | 1408 | Bridge | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------|------|--------|-------|-------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | Bridge | +| _initializing | bool | 0 | 1 | 1 | Bridge | +| __gap | uint256[50] | 1 | 0 | 1600 | Bridge | +| _owner | address | 51 | 0 | 20 | Bridge | +| __gap | uint256[49] | 52 | 0 | 1568 | Bridge | +| _pendingOwner | address | 101 | 0 | 20 | Bridge | +| __gap | uint256[49] | 102 | 0 | 1568 | Bridge | +| addressManager | address | 151 | 0 | 20 | Bridge | +| __gap | uint256[49] | 152 | 0 | 1568 | Bridge | +| __reentry | uint8 | 201 | 0 | 1 | Bridge | +| __paused | uint8 | 201 | 1 | 1 | Bridge | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | Bridge | +| __gap | uint256[49] | 202 | 0 | 1568 | Bridge | +| __reserved1 | uint64 | 251 | 0 | 8 | Bridge | +| nextMessageId | uint64 | 251 | 8 | 8 | Bridge | +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | Bridge | +| __ctx | struct IBridge.Context | 253 | 0 | 64 | Bridge | +| __reserved2 | uint256 | 255 | 0 | 32 | Bridge | +| __reserved3 | uint256 | 256 | 0 | 32 | Bridge | +| __gap | uint256[44] | 257 | 0 | 1408 | Bridge | ## QuotaManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|-------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | QuotaManager | -| _initializing | bool | 0 | 1 | 1 | QuotaManager | -| __gap | uint256[50] | 1 | 0 | 1600 | QuotaManager | -| _owner | address | 51 | 0 | 20 | QuotaManager | -| __gap | uint256[49] | 52 | 0 | 1568 | QuotaManager | -| _pendingOwner | address | 101 | 0 | 20 | QuotaManager | -| __gap | uint256[49] | 102 | 0 | 1568 | QuotaManager | -| addressManager | address | 151 | 0 | 20 | QuotaManager | -| __gap | uint256[49] | 152 | 0 | 1568 | QuotaManager | -| __reentry | uint8 | 201 | 0 | 1 | QuotaManager | -| __paused | uint8 | 201 | 1 | 1 | QuotaManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | QuotaManager | -| __gap | uint256[49] | 202 | 0 | 1568 | QuotaManager | -| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | QuotaManager | -| quotaPeriod | uint24 | 252 | 0 | 3 | QuotaManager | -| __gap | uint256[48] | 253 | 0 | 1536 | QuotaManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------------|------|--------|-------|-------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | QuotaManager | +| _initializing | bool | 0 | 1 | 1 | QuotaManager | +| __gap | uint256[50] | 1 | 0 | 1600 | QuotaManager | +| _owner | address | 51 | 0 | 20 | QuotaManager | +| __gap | uint256[49] | 52 | 0 | 1568 | QuotaManager | +| _pendingOwner | address | 101 | 0 | 20 | QuotaManager | +| __gap | uint256[49] | 102 | 0 | 1568 | QuotaManager | +| addressManager | address | 151 | 0 | 20 | QuotaManager | +| __gap | uint256[49] | 152 | 0 | 1568 | QuotaManager | +| __reentry | uint8 | 201 | 0 | 1 | QuotaManager | +| __paused | uint8 | 201 | 1 | 1 | QuotaManager | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | QuotaManager | +| __gap | uint256[49] | 202 | 0 | 1568 | QuotaManager | +| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | QuotaManager | +| quotaPeriod | uint24 | 252 | 0 | 3 | QuotaManager | +| __gap | uint256[48] | 253 | 0 | 1536 | QuotaManager | ## AddressManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------------------------------------------|------|--------|-------|-----------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | AddressManager | -| _initializing | bool | 0 | 1 | 1 | AddressManager | -| __gap | uint256[50] | 1 | 0 | 1600 | AddressManager | -| _owner | address | 51 | 0 | 20 | AddressManager | -| __gap | uint256[49] | 52 | 0 | 1568 | AddressManager | -| _pendingOwner | address | 101 | 0 | 20 | AddressManager | -| __gap | uint256[49] | 102 | 0 | 1568 | AddressManager | -| addressManager | address | 151 | 0 | 20 | AddressManager | -| __gap | uint256[49] | 152 | 0 | 1568 | AddressManager | -| __reentry | uint8 | 201 | 0 | 1 | AddressManager | -| __paused | uint8 | 201 | 1 | 1 | AddressManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | AddressManager | -| __gap | uint256[49] | 202 | 0 | 1568 | AddressManager | -| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | AddressManager | -| __gap | uint256[49] | 252 | 0 | 1568 | AddressManager | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------------------------------------------|------|--------|-------|-----------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | AddressManager | +| _initializing | bool | 0 | 1 | 1 | AddressManager | +| __gap | uint256[50] | 1 | 0 | 1600 | AddressManager | +| _owner | address | 51 | 0 | 20 | AddressManager | +| __gap | uint256[49] | 52 | 0 | 1568 | AddressManager | +| _pendingOwner | address | 101 | 0 | 20 | AddressManager | +| __gap | uint256[49] | 102 | 0 | 1568 | AddressManager | +| addressManager | address | 151 | 0 | 20 | AddressManager | +| __gap | uint256[49] | 152 | 0 | 1568 | AddressManager | +| __reentry | uint8 | 201 | 0 | 1 | AddressManager | +| __paused | uint8 | 201 | 1 | 1 | AddressManager | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | AddressManager | +| __gap | uint256[49] | 202 | 0 | 1568 | AddressManager | +| __addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | AddressManager | +| __gap | uint256[49] | 252 | 0 | 1568 | AddressManager | ## AddressResolver | Name | Type | Slot | Offset | Bytes | Contract | @@ -259,41 +259,41 @@ | __gap | uint256[49] | 1 | 0 | 1568 | AddressResolver | ## EssentialContract -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|-----------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | EssentialContract | -| _initializing | bool | 0 | 1 | 1 | EssentialContract | -| __gap | uint256[50] | 1 | 0 | 1600 | EssentialContract | -| _owner | address | 51 | 0 | 20 | EssentialContract | -| __gap | uint256[49] | 52 | 0 | 1568 | EssentialContract | -| _pendingOwner | address | 101 | 0 | 20 | EssentialContract | -| __gap | uint256[49] | 102 | 0 | 1568 | EssentialContract | -| addressManager | address | 151 | 0 | 20 | EssentialContract | -| __gap | uint256[49] | 152 | 0 | 1568 | EssentialContract | -| __reentry | uint8 | 201 | 0 | 1 | EssentialContract | -| __paused | uint8 | 201 | 1 | 1 | EssentialContract | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | EssentialContract | -| __gap | uint256[49] | 202 | 0 | 1568 | EssentialContract | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|-----------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | EssentialContract | +| _initializing | bool | 0 | 1 | 1 | EssentialContract | +| __gap | uint256[50] | 1 | 0 | 1600 | EssentialContract | +| _owner | address | 51 | 0 | 20 | EssentialContract | +| __gap | uint256[49] | 52 | 0 | 1568 | EssentialContract | +| _pendingOwner | address | 101 | 0 | 20 | EssentialContract | +| __gap | uint256[49] | 102 | 0 | 1568 | EssentialContract | +| addressManager | address | 151 | 0 | 20 | EssentialContract | +| __gap | uint256[49] | 152 | 0 | 1568 | EssentialContract | +| __reentry | uint8 | 201 | 0 | 1 | EssentialContract | +| __paused | uint8 | 201 | 1 | 1 | EssentialContract | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | EssentialContract | +| __gap | uint256[49] | 202 | 0 | 1568 | EssentialContract | ## SignalService -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|---------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | SignalService | -| _initializing | bool | 0 | 1 | 1 | SignalService | -| __gap | uint256[50] | 1 | 0 | 1600 | SignalService | -| _owner | address | 51 | 0 | 20 | SignalService | -| __gap | uint256[49] | 52 | 0 | 1568 | SignalService | -| _pendingOwner | address | 101 | 0 | 20 | SignalService | -| __gap | uint256[49] | 102 | 0 | 1568 | SignalService | -| addressManager | address | 151 | 0 | 20 | SignalService | -| __gap | uint256[49] | 152 | 0 | 1568 | SignalService | -| __reentry | uint8 | 201 | 0 | 1 | SignalService | -| __paused | uint8 | 201 | 1 | 1 | SignalService | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | SignalService | -| __gap | uint256[49] | 202 | 0 | 1568 | SignalService | -| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | SignalService | -| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | SignalService | -| __gap | uint256[48] | 253 | 0 | 1536 | SignalService | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------------------------|------|--------|-------|---------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | SignalService | +| _initializing | bool | 0 | 1 | 1 | SignalService | +| __gap | uint256[50] | 1 | 0 | 1600 | SignalService | +| _owner | address | 51 | 0 | 20 | SignalService | +| __gap | uint256[49] | 52 | 0 | 1568 | SignalService | +| _pendingOwner | address | 101 | 0 | 20 | SignalService | +| __gap | uint256[49] | 102 | 0 | 1568 | SignalService | +| addressManager | address | 151 | 0 | 20 | SignalService | +| __gap | uint256[49] | 152 | 0 | 1568 | SignalService | +| __reentry | uint8 | 201 | 0 | 1 | SignalService | +| __paused | uint8 | 201 | 1 | 1 | SignalService | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | SignalService | +| __gap | uint256[49] | 202 | 0 | 1568 | SignalService | +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | SignalService | +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | SignalService | +| __gap | uint256[48] | 253 | 0 | 1536 | SignalService | ## BridgedTaikoToken | Name | Type | Slot | Offset | Bytes | Contract | @@ -309,7 +309,7 @@ | __gap | uint256[49] | 152 | 0 | 1568 | BridgedTaikoToken | | __reentry | uint8 | 201 | 0 | 1 | BridgedTaikoToken | | __paused | uint8 | 201 | 1 | 1 | BridgedTaikoToken | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedTaikoToken | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | BridgedTaikoToken | | __gap | uint256[49] | 202 | 0 | 1568 | BridgedTaikoToken | | __slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | BridgedTaikoToken | | _balances | mapping(address => uint256) | 301 | 0 | 32 | BridgedTaikoToken | @@ -333,99 +333,99 @@ | __gap | uint256[50] | 504 | 0 | 1600 | BridgedTaikoToken | ## DelegateOwner -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | DelegateOwner | -| _initializing | bool | 0 | 1 | 1 | DelegateOwner | -| __gap | uint256[50] | 1 | 0 | 1600 | DelegateOwner | -| _owner | address | 51 | 0 | 20 | DelegateOwner | -| __gap | uint256[49] | 52 | 0 | 1568 | DelegateOwner | -| _pendingOwner | address | 101 | 0 | 20 | DelegateOwner | -| __gap | uint256[49] | 102 | 0 | 1568 | DelegateOwner | -| addressManager | address | 151 | 0 | 20 | DelegateOwner | -| __gap | uint256[49] | 152 | 0 | 1568 | DelegateOwner | -| __reentry | uint8 | 201 | 0 | 1 | DelegateOwner | -| __paused | uint8 | 201 | 1 | 1 | DelegateOwner | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | DelegateOwner | -| __gap | uint256[49] | 202 | 0 | 1568 | DelegateOwner | -| remoteChainId | uint64 | 251 | 0 | 8 | DelegateOwner | -| admin | address | 251 | 8 | 20 | DelegateOwner | -| nextTxId | uint64 | 252 | 0 | 8 | DelegateOwner | -| remoteOwner | address | 252 | 8 | 20 | DelegateOwner | -| __gap | uint256[48] | 253 | 0 | 1536 | DelegateOwner | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-------------|------|--------|-------|--------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | DelegateOwner | +| _initializing | bool | 0 | 1 | 1 | DelegateOwner | +| __gap | uint256[50] | 1 | 0 | 1600 | DelegateOwner | +| _owner | address | 51 | 0 | 20 | DelegateOwner | +| __gap | uint256[49] | 52 | 0 | 1568 | DelegateOwner | +| _pendingOwner | address | 101 | 0 | 20 | DelegateOwner | +| __gap | uint256[49] | 102 | 0 | 1568 | DelegateOwner | +| addressManager | address | 151 | 0 | 20 | DelegateOwner | +| __gap | uint256[49] | 152 | 0 | 1568 | DelegateOwner | +| __reentry | uint8 | 201 | 0 | 1 | DelegateOwner | +| __paused | uint8 | 201 | 1 | 1 | DelegateOwner | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | DelegateOwner | +| __gap | uint256[49] | 202 | 0 | 1568 | DelegateOwner | +| remoteChainId | uint64 | 251 | 0 | 8 | DelegateOwner | +| admin | address | 251 | 8 | 20 | DelegateOwner | +| nextTxId | uint64 | 252 | 0 | 8 | DelegateOwner | +| remoteOwner | address | 252 | 8 | 20 | DelegateOwner | +| __gap | uint256[48] | 253 | 0 | 1536 | DelegateOwner | ## TaikoL2 -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------|-----------------------------|------|--------|-------|--------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | TaikoL2 | -| _initializing | bool | 0 | 1 | 1 | TaikoL2 | -| __gap | uint256[50] | 1 | 0 | 1600 | TaikoL2 | -| _owner | address | 51 | 0 | 20 | TaikoL2 | -| __gap | uint256[49] | 52 | 0 | 1568 | TaikoL2 | -| _pendingOwner | address | 101 | 0 | 20 | TaikoL2 | -| __gap | uint256[49] | 102 | 0 | 1568 | TaikoL2 | -| addressManager | address | 151 | 0 | 20 | TaikoL2 | -| __gap | uint256[49] | 152 | 0 | 1568 | TaikoL2 | -| __reentry | uint8 | 201 | 0 | 1 | TaikoL2 | -| __paused | uint8 | 201 | 1 | 1 | TaikoL2 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | TaikoL2 | -| __gap | uint256[49] | 202 | 0 | 1568 | TaikoL2 | -| _blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | TaikoL2 | -| publicInputHash | bytes32 | 252 | 0 | 32 | TaikoL2 | -| parentGasExcess | uint64 | 253 | 0 | 8 | TaikoL2 | -| lastSyncedBlock | uint64 | 253 | 8 | 8 | TaikoL2 | -| parentTimestamp | uint64 | 253 | 16 | 8 | TaikoL2 | -| parentGasTarget | uint64 | 253 | 24 | 8 | TaikoL2 | -| l1ChainId | uint64 | 254 | 0 | 8 | TaikoL2 | -| __gap | uint256[46] | 255 | 0 | 1472 | TaikoL2 | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------|------|--------|-------|--------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | TaikoL2 | +| _initializing | bool | 0 | 1 | 1 | TaikoL2 | +| __gap | uint256[50] | 1 | 0 | 1600 | TaikoL2 | +| _owner | address | 51 | 0 | 20 | TaikoL2 | +| __gap | uint256[49] | 52 | 0 | 1568 | TaikoL2 | +| _pendingOwner | address | 101 | 0 | 20 | TaikoL2 | +| __gap | uint256[49] | 102 | 0 | 1568 | TaikoL2 | +| addressManager | address | 151 | 0 | 20 | TaikoL2 | +| __gap | uint256[49] | 152 | 0 | 1568 | TaikoL2 | +| __reentry | uint8 | 201 | 0 | 1 | TaikoL2 | +| __paused | uint8 | 201 | 1 | 1 | TaikoL2 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | TaikoL2 | +| __gap | uint256[49] | 202 | 0 | 1568 | TaikoL2 | +| _blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | TaikoL2 | +| publicInputHash | bytes32 | 252 | 0 | 32 | TaikoL2 | +| parentGasExcess | uint64 | 253 | 0 | 8 | TaikoL2 | +| lastSyncedBlock | uint64 | 253 | 8 | 8 | TaikoL2 | +| parentTimestamp | uint64 | 253 | 16 | 8 | TaikoL2 | +| parentGasTarget | uint64 | 253 | 24 | 8 | TaikoL2 | +| l1ChainId | uint64 | 254 | 0 | 8 | TaikoL2 | +| __gap | uint256[46] | 255 | 0 | 1472 | TaikoL2 | ## HeklaTaikoL2 -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------|-----------------------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | HeklaTaikoL2 | -| _initializing | bool | 0 | 1 | 1 | HeklaTaikoL2 | -| __gap | uint256[50] | 1 | 0 | 1600 | HeklaTaikoL2 | -| _owner | address | 51 | 0 | 20 | HeklaTaikoL2 | -| __gap | uint256[49] | 52 | 0 | 1568 | HeklaTaikoL2 | -| _pendingOwner | address | 101 | 0 | 20 | HeklaTaikoL2 | -| __gap | uint256[49] | 102 | 0 | 1568 | HeklaTaikoL2 | -| addressManager | address | 151 | 0 | 20 | HeklaTaikoL2 | -| __gap | uint256[49] | 152 | 0 | 1568 | HeklaTaikoL2 | -| __reentry | uint8 | 201 | 0 | 1 | HeklaTaikoL2 | -| __paused | uint8 | 201 | 1 | 1 | HeklaTaikoL2 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | HeklaTaikoL2 | -| __gap | uint256[49] | 202 | 0 | 1568 | HeklaTaikoL2 | -| _blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | HeklaTaikoL2 | -| publicInputHash | bytes32 | 252 | 0 | 32 | HeklaTaikoL2 | -| parentGasExcess | uint64 | 253 | 0 | 8 | HeklaTaikoL2 | -| lastSyncedBlock | uint64 | 253 | 8 | 8 | HeklaTaikoL2 | -| parentTimestamp | uint64 | 253 | 16 | 8 | HeklaTaikoL2 | -| parentGasTarget | uint64 | 253 | 24 | 8 | HeklaTaikoL2 | -| l1ChainId | uint64 | 254 | 0 | 8 | HeklaTaikoL2 | -| __gap | uint256[46] | 255 | 0 | 1472 | HeklaTaikoL2 | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------|------|--------|-------|------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | HeklaTaikoL2 | +| _initializing | bool | 0 | 1 | 1 | HeklaTaikoL2 | +| __gap | uint256[50] | 1 | 0 | 1600 | HeklaTaikoL2 | +| _owner | address | 51 | 0 | 20 | HeklaTaikoL2 | +| __gap | uint256[49] | 52 | 0 | 1568 | HeklaTaikoL2 | +| _pendingOwner | address | 101 | 0 | 20 | HeklaTaikoL2 | +| __gap | uint256[49] | 102 | 0 | 1568 | HeklaTaikoL2 | +| addressManager | address | 151 | 0 | 20 | HeklaTaikoL2 | +| __gap | uint256[49] | 152 | 0 | 1568 | HeklaTaikoL2 | +| __reentry | uint8 | 201 | 0 | 1 | HeklaTaikoL2 | +| __paused | uint8 | 201 | 1 | 1 | HeklaTaikoL2 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | HeklaTaikoL2 | +| __gap | uint256[49] | 202 | 0 | 1568 | HeklaTaikoL2 | +| _blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | HeklaTaikoL2 | +| publicInputHash | bytes32 | 252 | 0 | 32 | HeklaTaikoL2 | +| parentGasExcess | uint64 | 253 | 0 | 8 | HeklaTaikoL2 | +| lastSyncedBlock | uint64 | 253 | 8 | 8 | HeklaTaikoL2 | +| parentTimestamp | uint64 | 253 | 16 | 8 | HeklaTaikoL2 | +| parentGasTarget | uint64 | 253 | 24 | 8 | HeklaTaikoL2 | +| l1ChainId | uint64 | 254 | 0 | 8 | HeklaTaikoL2 | +| __gap | uint256[46] | 255 | 0 | 1472 | HeklaTaikoL2 | ## MainnetTaikoL2 -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------|-----------------------------|------|--------|-------|------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | MainnetTaikoL2 | -| _initializing | bool | 0 | 1 | 1 | MainnetTaikoL2 | -| __gap | uint256[50] | 1 | 0 | 1600 | MainnetTaikoL2 | -| _owner | address | 51 | 0 | 20 | MainnetTaikoL2 | -| __gap | uint256[49] | 52 | 0 | 1568 | MainnetTaikoL2 | -| _pendingOwner | address | 101 | 0 | 20 | MainnetTaikoL2 | -| __gap | uint256[49] | 102 | 0 | 1568 | MainnetTaikoL2 | -| addressManager | address | 151 | 0 | 20 | MainnetTaikoL2 | -| __gap | uint256[49] | 152 | 0 | 1568 | MainnetTaikoL2 | -| __reentry | uint8 | 201 | 0 | 1 | MainnetTaikoL2 | -| __paused | uint8 | 201 | 1 | 1 | MainnetTaikoL2 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetTaikoL2 | -| __gap | uint256[49] | 202 | 0 | 1568 | MainnetTaikoL2 | -| _blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | MainnetTaikoL2 | -| publicInputHash | bytes32 | 252 | 0 | 32 | MainnetTaikoL2 | -| parentGasExcess | uint64 | 253 | 0 | 8 | MainnetTaikoL2 | -| lastSyncedBlock | uint64 | 253 | 8 | 8 | MainnetTaikoL2 | -| parentTimestamp | uint64 | 253 | 16 | 8 | MainnetTaikoL2 | -| parentGasTarget | uint64 | 253 | 24 | 8 | MainnetTaikoL2 | -| l1ChainId | uint64 | 254 | 0 | 8 | MainnetTaikoL2 | -| __gap | uint256[46] | 255 | 0 | 1472 | MainnetTaikoL2 | +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|-----------------------------|------|--------|-------|------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | MainnetTaikoL2 | +| _initializing | bool | 0 | 1 | 1 | MainnetTaikoL2 | +| __gap | uint256[50] | 1 | 0 | 1600 | MainnetTaikoL2 | +| _owner | address | 51 | 0 | 20 | MainnetTaikoL2 | +| __gap | uint256[49] | 52 | 0 | 1568 | MainnetTaikoL2 | +| _pendingOwner | address | 101 | 0 | 20 | MainnetTaikoL2 | +| __gap | uint256[49] | 102 | 0 | 1568 | MainnetTaikoL2 | +| addressManager | address | 151 | 0 | 20 | MainnetTaikoL2 | +| __gap | uint256[49] | 152 | 0 | 1568 | MainnetTaikoL2 | +| __reentry | uint8 | 201 | 0 | 1 | MainnetTaikoL2 | +| __paused | uint8 | 201 | 1 | 1 | MainnetTaikoL2 | +| __lastUnpausedAt | uint64 | 201 | 2 | 8 | MainnetTaikoL2 | +| __gap | uint256[49] | 202 | 0 | 1568 | MainnetTaikoL2 | +| _blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | MainnetTaikoL2 | +| publicInputHash | bytes32 | 252 | 0 | 32 | MainnetTaikoL2 | +| parentGasExcess | uint64 | 253 | 0 | 8 | MainnetTaikoL2 | +| lastSyncedBlock | uint64 | 253 | 8 | 8 | MainnetTaikoL2 | +| parentTimestamp | uint64 | 253 | 16 | 8 | MainnetTaikoL2 | +| parentGasTarget | uint64 | 253 | 24 | 8 | MainnetTaikoL2 | +| l1ChainId | uint64 | 254 | 0 | 8 | MainnetTaikoL2 | +| __gap | uint256[46] | 255 | 0 | 1472 | MainnetTaikoL2 | diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 655d022de5d..c6439f0e576 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -63,6 +63,11 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { state.__reserve1 = 0; } + function init3() external onlyOwner reinitializer(3) { + // this value from EssentialContract is no longer used. + __lastUnpausedAt = 0; + } + /// @inheritdoc ITaikoL1 function proposeBlockV2( bytes calldata _params, @@ -149,6 +154,13 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { LibBonds.withdrawBond(state, this, _amount); } + function unpause() public override whenPaused { + _authorizePause(msg.sender, false); + __paused = _FALSE; + state.slotB.lastUnpausedAt = uint64(block.timestamp); + emit Unpaused(msg.sender); + } + /// @notice Gets the current bond balance of a given address. /// @return The current bond balance. function bondBalanceOf(address _user) external view returns (uint256) { @@ -257,10 +269,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { return (state.slotA, state.slotB); } - /// @inheritdoc EssentialContract - function unpause() public override { - super.unpause(); // permission checked inside - state.slotB.lastUnpausedAt = uint64(block.timestamp); + function lastUnpausedAt() public view override returns (uint64) { + return state.slotB.lastUnpausedAt; } /// @inheritdoc ITaikoL1 diff --git a/packages/protocol/contracts/shared/common/EssentialContract.sol b/packages/protocol/contracts/shared/common/EssentialContract.sol index 777ce8809ff..5c271ad2623 100644 --- a/packages/protocol/contracts/shared/common/EssentialContract.sol +++ b/packages/protocol/contracts/shared/common/EssentialContract.sol @@ -8,13 +8,13 @@ import "./AddressResolver.sol"; /// @title EssentialContract /// @custom:security-contact security@taiko.xyz abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, AddressResolver { - uint8 private constant _FALSE = 1; - uint8 private constant _TRUE = 2; + uint8 internal constant _FALSE = 1; + uint8 internal constant _TRUE = 2; /// @dev Slot 1. - uint8 private __reentry; - uint8 private __paused; - uint64 public lastUnpausedAt; + uint8 internal __reentry; + uint8 internal __paused; + uint64 internal __lastUnpausedAt; uint256[49] private __gap; @@ -102,6 +102,10 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, return __paused == _TRUE; } + function lastUnpausedAt() public view virtual returns (uint64) { + return __lastUnpausedAt; + } + function inNonReentrant() public view returns (bool) { return _loadReentryLock() == _TRUE; } @@ -133,7 +137,7 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, function _unpause() internal whenPaused { __paused = _FALSE; - lastUnpausedAt = uint64(block.timestamp); + __lastUnpausedAt = uint64(block.timestamp); emit Unpaused(msg.sender); } From 3f0d15a9106e753501364cec2a859b2f82838a74 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Fri, 25 Oct 2024 17:39:24 +0800 Subject: [PATCH 15/38] code simplification --- .../contracts/layer1/based/LibProposing.sol | 58 +++++++++---------- .../contracts/layer1/based/LibProving.sol | 2 +- .../contracts/layer1/based/LibVerifying.sol | 25 ++++---- 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index 4011b840e49..794502705fd 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -155,8 +155,10 @@ library LibProposing { } // Verify params against the parent block. - TaikoData.BlockV2 storage parentBlk = - _state.blocks[(local.b.numBlocks - 1) % _config.blockRingBufferSize]; + TaikoData.BlockV2 storage parentBlk; + unchecked { + parentBlk = _state.blocks[(local.b.numBlocks - 1) % _config.blockRingBufferSize]; + } // Verify the passed in L1 state block number. // We only allow the L1 block to be 2 epochs old. @@ -194,33 +196,31 @@ library LibProposing { // the block data to be stored on-chain for future integrity checks. // If we choose to persist all data fields in the metadata, it will // require additional storage slots. - unchecked { - meta_ = TaikoData.BlockMetadataV2({ - anchorBlockHash: blockhash(local.params.anchorBlockId), - difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), - blobHash: 0, // to be initialized below - // To make sure each L2 block can be exexucated deterministiclly by the client - // without referering to its metadata on Ethereum, we need to encode - // config.sharingPctg into the extraData. - extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), - coinbase: local.params.coinbase, - id: local.b.numBlocks, - gasLimit: _config.blockMaxGasLimit, - timestamp: local.params.timestamp, - anchorBlockId: local.params.anchorBlockId, - minTier: 0, // to be initialized below - blobUsed: _txList.length == 0, - parentMetaHash: local.params.parentMetaHash, - proposer: local.params.proposer, - livenessBond: _config.livenessBond, - proposedAt: uint64(block.timestamp), - proposedIn: uint64(block.number), - blobTxListOffset: local.params.blobTxListOffset, - blobTxListLength: local.params.blobTxListLength, - blobIndex: local.params.blobIndex, - baseFeeConfig: _config.baseFeeConfig - }); - } + meta_ = TaikoData.BlockMetadataV2({ + anchorBlockHash: blockhash(local.params.anchorBlockId), + difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), + blobHash: 0, // to be initialized below + // To make sure each L2 block can be exexucated deterministiclly by the client + // without referering to its metadata on Ethereum, we need to encode + // config.sharingPctg into the extraData. + extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), + coinbase: local.params.coinbase, + id: local.b.numBlocks, + gasLimit: _config.blockMaxGasLimit, + timestamp: local.params.timestamp, + anchorBlockId: local.params.anchorBlockId, + minTier: 0, // to be initialized below + blobUsed: _txList.length == 0, + parentMetaHash: local.params.parentMetaHash, + proposer: local.params.proposer, + livenessBond: _config.livenessBond, + proposedAt: uint64(block.timestamp), + proposedIn: uint64(block.number), + blobTxListOffset: local.params.blobTxListOffset, + blobTxListLength: local.params.blobTxListLength, + blobIndex: local.params.blobIndex, + baseFeeConfig: _config.baseFeeConfig + }); // Update certain meta fields if (meta_.blobUsed) { diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index 021bede5297..9ac1df7a0dc 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -569,7 +569,7 @@ library LibProving { /// @dev Returns the reward after applying 12.5% friction. function _rewardAfterFriction(uint256 _amount) private pure returns (uint256) { - return _amount == 0 ? 0 : (_amount * 7) >> 3; + return (_amount * 7) >> 3; } /// @dev Returns if the liveness bond shall be returned. diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 9b318c06cc2..558be1c62ca 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -98,20 +98,21 @@ library LibVerifying { if (ts.contester != address(0)) { break; - } else { - if (local.tierRouter == ITierRouter(address(0))) { - local.tierRouter = - ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - } + } + + if (local.tierRouter == ITierRouter(address(0))) { + local.tierRouter = + ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); + } - uint24 cooldown = ITierProvider(local.tierRouter.getProvider(local.blockId)) - .getTier(local.tier).cooldownWindow; + uint24 cooldown = ITierProvider(local.tierRouter.getProvider(local.blockId)).getTier( + local.tier + ).cooldownWindow; - if (!LibUtils.isPostDeadline(ts.timestamp, local.b.lastUnpausedAt, cooldown)) { - // If cooldownWindow is 0, the block can theoretically - // be proved and verified within the same L1 block. - break; - } + if (!LibUtils.isPostDeadline(ts.timestamp, local.b.lastUnpausedAt, cooldown)) { + // If cooldownWindow is 0, the block can theoretically + // be proved and verified within the same L1 block. + break; } // Update variables From 31dc47b85e24c8db6641c08f7ebe99ed3d5ad06b Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:33:48 +0800 Subject: [PATCH 16/38] refactor(protocol): apply multiple improvements based on feedback from Open Zeppelin (#18305) --- .../contracts/layer1/based/LibBonds.sol | 13 ++++++++++++ .../contracts/layer1/based/LibData.sol | 4 ++-- .../contracts/layer1/based/LibProposing.sol | 10 ++++++---- .../contracts/layer1/based/LibProving.sol | 5 ++--- .../contracts/layer1/based/LibUtils.sol | 10 +++++++--- .../contracts/layer1/based/TaikoData.sol | 2 +- .../contracts/layer1/based/TaikoEvents.sol | 20 +++++++++++++++++-- .../contracts/layer1/based/TaikoL1.sol | 8 ++++---- .../verifiers/compose/ComposeVerifier.sol | 3 +-- .../contracts/layer2/based/TaikoL2.sol | 4 +++- .../based/TaikoL1LibProvingWithTiers.t.sol | 2 +- 11 files changed, 58 insertions(+), 23 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol index 6916e169344..a793b93dac9 100644 --- a/packages/protocol/contracts/layer1/based/LibBonds.sol +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -11,6 +11,16 @@ import "./TaikoData.sol"; /// @notice A library that offers helper functions to handle bonds. /// @custom:security-contact security@taiko.xyz library LibBonds { + /// @dev Emitted when tokens are deposited into a user's bond balance. + /// @param user The address of the user who deposited the tokens. + /// @param amount The amount of tokens deposited. + event BondDeposited(address indexed user, uint256 amount); + + /// @dev Emitted when tokens are withdrawn from a user's bond balance. + /// @param user The address of the user who withdrew the tokens. + /// @param amount The amount of tokens withdrawn. + event BondWithdrawn(address indexed user, uint256 amount); + /// @dev Emitted when a token is credited back to a user's bond balance. /// @param user The address of the user whose bond balance is credited. /// @param blockId The ID of the block to credit for. @@ -34,6 +44,7 @@ library LibBonds { ) internal { + emit BondDeposited(msg.sender, _amount); _state.bondBalance[msg.sender] += _amount; _tko(_resolver).transferFrom(msg.sender, address(this), _amount); } @@ -49,6 +60,7 @@ library LibBonds { ) internal { + emit BondWithdrawn(msg.sender, _amount); _state.bondBalance[msg.sender] -= _amount; _tko(_resolver).transfer(msg.sender, _amount); } @@ -76,6 +88,7 @@ library LibBonds { _state.bondBalance[_user] = balance - _amount; } } else { + emit BondDeposited(msg.sender, _amount); _tko(_resolver).transferFrom(_user, address(this), _amount); } emit BondDebited(_user, _blockId, _amount); diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol index 3a7d80be281..7fd6c80d5c6 100644 --- a/packages/protocol/contracts/layer1/based/LibData.sol +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -8,7 +8,7 @@ import "./TaikoData.sol"; /// @notice A library that offers helper functions. /// @custom:security-contact security@taiko.xyz library LibData { - function blockV2toV1(TaikoData.BlockV2 memory _v2) + function blockV2ToV1(TaikoData.BlockV2 memory _v2) internal pure returns (TaikoData.Block memory) @@ -25,7 +25,7 @@ library LibData { }); } - function verifierContextV2toV1(IVerifier.ContextV2 memory _v2) + function verifierContextV2ToV1(IVerifier.ContextV2 memory _v2) internal pure returns (IVerifier.Context memory) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index 794502705fd..eaaaf453256 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -14,6 +14,8 @@ import "./LibVerifying.sol"; library LibProposing { using LibAddress for address; + uint256 internal constant SECONDS_PER_BLOCK = 12; + struct Local { TaikoData.SlotB b; TaikoData.BlockParamsV2 params; @@ -177,8 +179,8 @@ library LibProposing { // The other constraint is that the timestamp needs to be larger than or equal the // one in the previous L2 block. if ( - local.params.timestamp + _config.maxAnchorHeightOffset * 12 < block.timestamp - || local.params.timestamp > block.timestamp + local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK + < block.timestamp || local.params.timestamp > block.timestamp || local.params.timestamp < parentBlk.proposedAt ) { revert L1_INVALID_TIMESTAMP(); @@ -200,8 +202,8 @@ library LibProposing { anchorBlockHash: blockhash(local.params.anchorBlockId), difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), blobHash: 0, // to be initialized below - // To make sure each L2 block can be exexucated deterministiclly by the client - // without referering to its metadata on Ethereum, we need to encode + // To make sure each L2 block can be executed deterministically by the client + // without referring to its metadata on Ethereum, we need to encode // config.sharingPctg into the extraData. extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), coinbase: local.params.coinbase, diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index 9ac1df7a0dc..cf7513cdd78 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -307,7 +307,7 @@ library LibProving { if (_batchProof.tier == 0) { // In the case of per-transition proof, we verify the proof. IVerifier(_resolver.resolve(local.tier.verifierName, false)).verifyProof( - LibData.verifierContextV2toV1(ctx_), ctx_.tran, local.proof + LibData.verifierContextV2ToV1(ctx_), ctx_.tran, local.proof ); } } @@ -368,7 +368,6 @@ library LibProving { revert L1_CANNOT_CONTEST(); } - // _checkIfContestable(/*_state,*/ tier.cooldownWindow, ts.timestamp); // Burn the contest bond from the prover. LibBonds.debitBond( _state, _resolver, msg.sender, local.blockId, local.tier.contestBond @@ -518,7 +517,7 @@ library LibProving { if (_local.sameTransition) revert L1_ALREADY_PROVED(); // The code below will be executed if - // - 1) the transition is proved for the fist time, or + // - 1) the transition is proved for the first time, or // - 2) the transition is contested. reward = _rewardAfterFriction(_ts.validityBond); diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 47211e45d61..1043ea3ea75 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -16,6 +16,8 @@ import "./TaikoData.sol"; library LibUtils { using LibMath for uint256; + uint256 internal constant SECONDS_IN_MINUTE = 60; + /// @dev Emitted when a block is verified. /// @param blockId The ID of the verified block. /// @param prover The prover whose transition is used for verifying the @@ -26,7 +28,6 @@ library LibUtils { uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier ); - error L1_BLOCK_MISMATCH(); error L1_INVALID_BLOCK_ID(); error L1_INVALID_PARAMS(); error L1_INVALID_GENESIS_HASH(); @@ -47,6 +48,8 @@ library LibUtils { TaikoData.BlockV2 storage blk = _state.blocks[0]; blk.nextTransitionId = 2; blk.proposedAt = uint64(block.timestamp); + // TODO: + // blk.proposedIn = uint64(block.number); blk.verifiedTransitionId = 1; blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. @@ -122,7 +125,7 @@ library LibUtils { TaikoData.State storage _state, TaikoData.Config memory _config, uint64 _blockId, - uint32 _tid + uint24 _tid ) internal view @@ -231,7 +234,8 @@ library LibUtils { returns (bool) { unchecked { - uint256 deadline = _tsTimestamp.max(_lastUnpausedAt) + _windowMinutes * 60; + uint256 deadline = + _tsTimestamp.max(_lastUnpausedAt) + _windowMinutes * SECONDS_IN_MINUTE; return block.timestamp >= deadline; } } diff --git a/packages/protocol/contracts/layer1/based/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol index bd6748ca07f..cbda24eb9ac 100644 --- a/packages/protocol/contracts/layer1/based/TaikoData.sol +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -225,7 +225,7 @@ library TaikoData { // Ring buffer for transitions mapping( uint64 blockId_mod_blockRingBufferSize - => mapping(uint32 transitionId => TransitionState ts) + => mapping(uint24 transitionId => TransitionState ts) ) transitions; bytes32 __reserve1; // Used as a ring buffer for Ether deposits SlotA slotA; // slot 5 diff --git a/packages/protocol/contracts/layer1/based/TaikoEvents.sol b/packages/protocol/contracts/layer1/based/TaikoEvents.sol index 72a7ed589bf..f7cde269bb3 100644 --- a/packages/protocol/contracts/layer1/based/TaikoEvents.sol +++ b/packages/protocol/contracts/layer1/based/TaikoEvents.sol @@ -11,10 +11,26 @@ import "./TaikoData.sol"; /// L1 libraries. /// @custom:security-contact security@taiko.xyz abstract contract TaikoEvents { - /// @dev Emitted when token is credited back to a user's bond balance. + /// @dev Emitted when tokens are deposited into a user's bond balance. + /// @param user The address of the user who deposited the tokens. + /// @param amount The amount of tokens deposited. + event BondDeposited(address indexed user, uint256 amount); + + /// @dev Emitted when tokens are withdrawn from a user's bond balance. + /// @param user The address of the user who withdrew the tokens. + /// @param amount The amount of tokens withdrawn. + event BondWithdrawn(address indexed user, uint256 amount); + + /// @dev Emitted when a token is credited back to a user's bond balance. + /// @param user The address of the user whose bond balance is credited. + /// @param blockId The ID of the block to credit for. + /// @param amount The amount of tokens credited. event BondCredited(address indexed user, uint256 blockId, uint256 amount); - /// @dev Emitted when token is debited from a user's bond balance. + /// @dev Emitted when a token is debited from a user's bond balance. + /// @param user The address of the user whose bond balance is debited. + /// @param blockId The ID of the block to debit for. + /// @param amount The amount of tokens debited. event BondDebited(address indexed user, uint256 blockId, uint256 amount); /// @dev DEPRECATED but used by node/client for syncing old blocks diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 62040a923bb..053f848b91e 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; import "src/shared/common/EssentialContract.sol"; import "./LibData.sol"; import "./LibProposing.sol"; @@ -24,8 +25,6 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { uint256[50] private __gap; - error L1_INVALID_PARAMS(); - modifier whenProvingNotPaused() { if (state.slotB.provingPaused) revert LibProving.L1_PROVING_PAUSED(); _; @@ -177,7 +176,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { /// @return blk_ The block. function getBlock(uint64 _blockId) external view returns (TaikoData.Block memory blk_) { (TaikoData.BlockV2 memory blk,) = LibUtils.getBlock(state, getConfig(), _blockId); - blk_ = LibData.blockV2toV1(blk); + blk_ = LibData.blockV2ToV1(blk); } /// @inheritdoc ITaikoL1 @@ -226,7 +225,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { view returns (TaikoData.TransitionState memory) { - return LibUtils.getTransition(state, getConfig(), _blockId, _tid); + return + LibUtils.getTransition(state, getConfig(), _blockId, SafeCastUpgradeable.toUint24(_tid)); } /// @notice Returns information about the last verified block. diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol index 345d354cbd2..50345be7a4c 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -19,7 +19,6 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { bytes proof; } - error CV_DUPLICATE_SUBPROOF(); error CV_INVALID_CALLER(); error CV_INVALID_SUB_VERIFIER(); error CV_INVALID_SUBPROOF_LENGTH(); @@ -87,7 +86,7 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { if (subProofs.length != numSubProofs_) revert CV_INVALID_SUBPROOF_LENGTH(); for (uint256 i; i < subProofs.length; ++i) { - if (subProofs[i].verifier == address(0)) revert CV_DUPLICATE_SUBPROOF(); + if (subProofs[i].verifier == address(0)) revert CV_INVALID_SUB_VERIFIER(); // find the verifier bool verifierFound; diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol index 2d64a3f9229..3242c551264 100644 --- a/packages/protocol/contracts/layer2/based/TaikoL2.sol +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -231,7 +231,9 @@ contract TaikoL2 is EssentialContract, IBlockHash { emit Anchored(parentHash, parentGasExcess); } - /// @notice Withdraw token or Ether from this address + /// @notice Withdraw token or Ether from this address. + /// Note: This contract receives a portion of L2 base fees, while the remainder is directed to + /// L2 block's coinbase address. /// @param _token Token address or address(0) if Ether. /// @param _to Withdraw to address. function withdraw( diff --git a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index a984997b3a9..9bdfc3dc9db 100644 --- a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -542,7 +542,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - LibUtils.L1_BLOCK_MISMATCH.selector + LibProving.L1_BLOCK_MISMATCH.selector ); parentHash = blockHash; From e2b7ce73562052d37addf01c079a297e5fad95c9 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 26 Oct 2024 04:06:06 +0800 Subject: [PATCH 17/38] chore(protocol): delete `approve` function from GuardianProver (#18310) --- .../layer1/provers/GuardianProver.sol | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/packages/protocol/contracts/layer1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol index 753a1f47648..da526d16770 100644 --- a/packages/protocol/contracts/layer1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/layer1/provers/GuardianProver.sol @@ -172,30 +172,6 @@ contract GuardianProver is IVerifier, EssentialContract { tko.transfer(_to, amount); } - /// @dev Called by guardians to approve a guardian proof - /// @param _meta The block's metadata. - /// @param _tran The valid transition. - /// @param _proof The tier proof. - /// @return approved_ True if the minimum number of approval is acquired, false otherwise. - function approve( - TaikoData.BlockMetadata calldata _meta, - TaikoData.Transition calldata _tran, - TaikoData.TierProof calldata _proof - ) - external - whenNotPaused - nonReentrant - returns (bool) - { - return _approve({ - _blockId: _meta.id, - _proofHash: keccak256(abi.encode(_meta, _tran, _proof.data)), - _blockHash: _tran.blockHash, - _data: abi.encode(_meta, _tran, _proof), - _proofData: _proof.data - }); - } - /// @notice Called by guardians to approve a guardian proof (version 2). /// @param _metaV2 The block's metadata (version 2). /// @param _tran The valid transition. From 0c88472a7ce508ed1cd540a14f8dcd57d6f0db9c Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:09:17 +0800 Subject: [PATCH 18/38] refactor(protocol): set `blk.proposedIn` in genesis block (#18312) --- packages/protocol/contracts/layer1/based/LibUtils.sol | 3 +-- packages/protocol/test/layer1/based/TaikoL1TestBase.sol | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 1043ea3ea75..d2b4a3d0ad2 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -48,8 +48,7 @@ library LibUtils { TaikoData.BlockV2 storage blk = _state.blocks[0]; blk.nextTransitionId = 2; blk.proposedAt = uint64(block.timestamp); - // TODO: - // blk.proposedIn = uint64(block.number); + blk.proposedIn = uint64(block.number); blk.verifiedTransitionId = 1; blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. diff --git a/packages/protocol/test/layer1/based/TaikoL1TestBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol index 5393d4b16f7..b199dc59c7a 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol @@ -107,6 +107,7 @@ abstract contract TaikoL1TestBase is TaikoTest { ); L1.init(address(0), address(addressManager), GENESIS_BLOCK_HASH, false); + mine(1); gp.enableTaikoTokenAllowance(true); printVariables("init "); From 6196eaa2c5d40ce5fde1ebd99514a71de35f8b8b Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 26 Oct 2024 12:59:58 +0800 Subject: [PATCH 19/38] refactor(protocol): simplify some protocol code based on OpenZeppelin's recommendation (#18308) --- packages/protocol/contracts/layer1/based/LibProposing.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index eaaaf453256..e94830398b8 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -149,7 +149,9 @@ library LibProposing { } if (local.params.anchorBlockId == 0) { + unchecked { local.params.anchorBlockId = uint64(block.number - 1); + } } if (local.params.timestamp == 0) { @@ -184,6 +186,7 @@ library LibProposing { || local.params.timestamp < parentBlk.proposedAt ) { revert L1_INVALID_TIMESTAMP(); + } // Check if parent block has the right meta hash. This is to allow the proposer to make From b5daab851951d202be64bf0cf5c3cdaeaf31594a Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 27 Oct 2024 11:18:17 +0800 Subject: [PATCH 20/38] merge --- packages/protocol/contracts/layer1/based/LibProposing.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index e94830398b8..da630621fb8 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -150,7 +150,7 @@ library LibProposing { if (local.params.anchorBlockId == 0) { unchecked { - local.params.anchorBlockId = uint64(block.number - 1); + local.params.anchorBlockId = uint64(block.number - 1); } } From 63ac08b83032e6dcac49d6bb77868c9c4c3c3fc4 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 27 Oct 2024 11:20:21 +0800 Subject: [PATCH 21/38] Update LibProposing.sol --- packages/protocol/contracts/layer1/based/LibProposing.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index da630621fb8..8e2caa4b507 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -150,7 +150,7 @@ library LibProposing { if (local.params.anchorBlockId == 0) { unchecked { - local.params.anchorBlockId = uint64(block.number - 1); + local.params.anchorBlockId = uint64(block.number - 1); } } @@ -186,7 +186,6 @@ library LibProposing { || local.params.timestamp < parentBlk.proposedAt ) { revert L1_INVALID_TIMESTAMP(); - } // Check if parent block has the right meta hash. This is to allow the proposer to make From 61aaa4c1536771d88ea40d756672517d40254ea9 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 27 Oct 2024 16:23:57 +0800 Subject: [PATCH 22/38] fix initializers This reverts commit 1565b0c2044295fd670462d8daaf57fbb3d000a2. --- .../contracts/layer1/based/TaikoL1.sol | 3 +- .../contracts/shared/bridge/Bridge.sol | 3 +- .../shared/common/AddressManager.sol | 3 +- .../shared/tokenvault/BridgedERC20V2.sol | 32 +++++++------------ 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 9864fd037fc..a7a33982dc6 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -49,13 +49,14 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { bool _toPause ) external - reinitializer(2) + initializer { __Essential_init(_owner, _rollupAddressManager); LibUtils.init(state, getConfig(), _genesisBlockHash); if (_toPause) _pause(); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { // reset some previously used slots for future reuse state.slotB.__reservedB1 = 0; diff --git a/packages/protocol/contracts/shared/bridge/Bridge.sol b/packages/protocol/contracts/shared/bridge/Bridge.sol index 813445ef678..9805db23013 100644 --- a/packages/protocol/contracts/shared/bridge/Bridge.sol +++ b/packages/protocol/contracts/shared/bridge/Bridge.sol @@ -104,10 +104,11 @@ contract Bridge is EssentialContract, IBridge { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. /// @param _sharedAddressManager The address of the {AddressManager} contract. - function init(address _owner, address _sharedAddressManager) external reinitializer(2) { + function init(address _owner, address _sharedAddressManager) external initializer { __Essential_init(_owner, _sharedAddressManager); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { // reset some previously used slots for future reuse __reserved1 = 0; diff --git a/packages/protocol/contracts/shared/common/AddressManager.sol b/packages/protocol/contracts/shared/common/AddressManager.sol index d16e9f97c55..0fe5dddc5c7 100644 --- a/packages/protocol/contracts/shared/common/AddressManager.sol +++ b/packages/protocol/contracts/shared/common/AddressManager.sol @@ -25,10 +25,11 @@ contract AddressManager is EssentialContract, IAddressManager { /// @notice Initializes the contract. /// @param _owner The owner of this contract. - function init(address _owner) external reinitializer(2) { + function init(address _owner) external initializer { __Essential_init(_owner, address(this)); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { addressManager = address(this); } diff --git a/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol index cc2b58ffa76..85cdfafefc6 100644 --- a/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol @@ -29,7 +29,9 @@ contract BridgedERC20V2 is BridgedERC20, IERC20PermitUpgradeable, EIP712Upgradea error BTOKEN_INVALID_SIG(); /// @inheritdoc IBridgedERC20Initializable - /// @dev Calling this function will change the initialized version to 2. + /// @dev This function is called when the bridge deploys a new bridged ERC20 token, so this + /// function must also cover the logic in init2(), we use + /// `reinitializer(2)` instead of `initializer`. function init( address _owner, address _sharedAddressManager, @@ -48,31 +50,27 @@ contract BridgedERC20V2 is BridgedERC20, IERC20PermitUpgradeable, EIP712Upgradea LibBridgedToken.validateInputs(_srcToken, _srcChainId); __Essential_init(_owner, _sharedAddressManager); __ERC20_init(_name, _symbol); - __EIP712_init_unchained(_name, "1"); - // Set contract properties srcToken = _srcToken; srcChainId = _srcChainId; __srcDecimals = _decimals; + + // Cover logics from `init2()` + __EIP712_init_unchained(_name, "1"); } - /// @dev This function shall be called when upgrading a deployed contract from {BridgedERC20} to - /// {BridgedERC20V2}. + /// @notice This function shall be called by previously deployed contracts. function init2() external reinitializer(2) { __EIP712_init_unchained(name(), "1"); } - /** - * @inheritdoc IERC20PermitUpgradeable - */ - // solhint-disable-next-line func-name-mixedcase + /// @inheritdoc IERC20PermitUpgradeable + // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } - /** - * @inheritdoc IERC20PermitUpgradeable - */ + /// @inheritdoc IERC20PermitUpgradeable function permit( address owner, address spender, @@ -100,9 +98,7 @@ contract BridgedERC20V2 is BridgedERC20, IERC20PermitUpgradeable, EIP712Upgradea _approve(owner, spender, value); } - /** - * @inheritdoc IERC20PermitUpgradeable - */ + /// @inheritdoc IERC20PermitUpgradeable function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } @@ -113,11 +109,7 @@ contract BridgedERC20V2 is BridgedERC20, IERC20PermitUpgradeable, EIP712Upgradea || super.supportsInterface(_interfaceId); } - /** - * @dev "Consume a nonce": return the current value and increment. - * - * _Available since v4.1._ - */ + /// @dev "Consume a nonce": return the current value and increment. function _useNonce(address owner) internal virtual returns (uint256 current) { CountersUpgradeable.Counter storage nonce = _nonces[owner]; current = nonce.current(); From 39dcdff1dc7c20fbfa1f4515fff9a8f30f454b62 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 27 Oct 2024 16:26:40 +0800 Subject: [PATCH 23/38] Update Multicall3.sol --- packages/protocol/test/shared/thirdparty/Multicall3.sol | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/protocol/test/shared/thirdparty/Multicall3.sol b/packages/protocol/test/shared/thirdparty/Multicall3.sol index 2b15bc3d116..38b96a3e872 100644 --- a/packages/protocol/test/shared/thirdparty/Multicall3.sol +++ b/packages/protocol/test/shared/thirdparty/Multicall3.sol @@ -1,7 +1,3 @@ -/** - * Submitted for verification at taikoscan.io on 2024-05-30 - */ - // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; From 3588f3d4d76261ab01e724e9ab37fbecf24dd9f5 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:53:23 +0800 Subject: [PATCH 24/38] chore(protocol): emit state root as 0 in events for non-sync blocks (#18303) --- .../contracts/layer1/based/ITaikoL1.sol | 3 ++- .../contracts/layer1/based/LibProving.sol | 23 ++++++++----------- .../contracts/layer1/based/LibUtils.sol | 2 +- .../contracts/layer1/based/LibVerifying.sol | 2 +- .../contracts/layer1/based/TaikoL1.sol | 3 ++- .../based/TaikoL1LibProvingWithTiers.t.sol | 6 ++--- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol index 5ea7923c370..d7f86d2663a 100644 --- a/packages/protocol/contracts/layer1/based/ITaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -77,7 +77,8 @@ interface ITaikoL1 { /// @notice Gets the state transition for a specific block. /// @param _blockId Index of the block. /// @param _tid The transition id. - /// @return The state transition data of the block. + /// @return The state transition data of the block. The transition's state root will be zero if + /// the block is not a sync-block. function getTransition( uint64 _blockId, uint32 _tid diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index cf7513cdd78..256e512be4b 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -21,7 +21,6 @@ library LibProving { TaikoData.BlockMetadataV2 meta; TaikoData.TierProof proof; bytes32 metaHash; - bytes32 stateRoot; uint64 slot; uint64 blockId; uint24 tid; @@ -29,7 +28,6 @@ library LibProving { bool isTopTier; bool inProvingWindow; bool sameTransition; - bool isSyncBlock; } /// @notice Emitted when a transition is proved. @@ -218,12 +216,6 @@ library LibProving { local.slot = local.meta.id % _config.blockRingBufferSize; TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; - local.isSyncBlock = - LibUtils.shouldSyncStateRoot(_config.stateRootSyncInternal, local.blockId); - if (local.isSyncBlock) { - local.stateRoot = ctx_.tran.stateRoot; - } - local.metaHash = blk.metaHash; // Check the integrity of the block data. It's worth noting that in @@ -314,9 +306,14 @@ library LibProving { local.isTopTier = local.tier.contestBond == 0; - local.sameTransition = local.isSyncBlock - ? ctx_.tran.blockHash == ts.blockHash && local.stateRoot == ts.stateRoot - : ctx_.tran.blockHash == ts.blockHash; + if (LibUtils.isSyncBlock(_config.stateRootSyncInternal, local.blockId)) { + local.sameTransition = + ctx_.tran.blockHash == ts.blockHash && ctx_.tran.stateRoot == ts.stateRoot; + } else { + local.sameTransition = ctx_.tran.blockHash == ts.blockHash; + // For non sync-block, we set the stateRoot to 0 before emitting it in events + ctx_.tran.stateRoot = 0; + } if (local.proof.tier > ts.tier) { // Handles the case when an incoming tier is higher than the current transition's tier. @@ -344,7 +341,7 @@ library LibProving { ts.prover = msg.sender; ts.blockHash = ctx_.tran.blockHash; - ts.stateRoot = local.stateRoot; + ts.stateRoot = ctx_.tran.stateRoot; emit TransitionProvedV2({ blockId: local.blockId, @@ -562,7 +559,7 @@ library LibProving { if (!_local.sameTransition) { _ts.blockHash = _tran.blockHash; - _ts.stateRoot = _local.stateRoot; + _ts.stateRoot = _tran.stateRoot; } } diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index d2b4a3d0ad2..61879f128fb 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -278,7 +278,7 @@ library LibUtils { /// @param _stateRootSyncInternal The state root sync interval. /// @param _blockId The ID of the block. /// @return True if the state root should be synchronized, false otherwise. - function shouldSyncStateRoot( + function isSyncBlock( uint256 _stateRootSyncInternal, uint256 _blockId ) diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 558be1c62ca..f6ca00b3134 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -136,7 +136,7 @@ library LibVerifying { tier: local.tier }); - if (LibUtils.shouldSyncStateRoot(_config.stateRootSyncInternal, local.blockId)) { + if (LibUtils.isSyncBlock(_config.stateRootSyncInternal, local.blockId)) { bytes32 stateRoot = ts.stateRoot; if (stateRoot != 0) { local.syncStateRoot = stateRoot; diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index df08d7cfa33..5a60a60f60a 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -205,7 +205,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { /// the corresponding transition state will be empty. /// @param _blockIds Index of the blocks. /// @param _parentHashes Parent hashes of the blocks. - /// @return The state transition array of the blocks. + /// @return The state transition array of the blocks. Note that a transition's state root will + /// be zero if the block is not a sync-block. function getTransitions( uint64[] calldata _blockIds, bytes32[] calldata _parentHashes diff --git a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index 9bdfc3dc9db..04d8f2da1eb 100644 --- a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -430,9 +430,9 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { - bool storeStateRoot = LibUtils.shouldSyncStateRoot(syncInternal, blockId); + bool isSyncBlock = LibUtils.isSyncBlock(syncInternal, blockId); console2.log("blockId:", blockId); - console2.log("storeStateRoot:", storeStateRoot); + console2.log("isSyncBlock:", isSyncBlock); printVariables("before propose"); TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); @@ -451,7 +451,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // Re-prove as guardian stateRoot = bytes32(2_000_000 + blockId + 200); - if (!storeStateRoot) { + if (!isSyncBlock) { // Changing stateRoot doesn't help proveBlock( Carol, From e6ea55be6c954b13483d41116eb4103ebeefe7b2 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:57:58 +0800 Subject: [PATCH 25/38] docs(protocol): improve Natspec comments (#18320) (#18321) Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> --- .../contracts/layer1/based/ITaikoL1.sol | 4 +- .../contracts/layer1/based/LibData.sol | 8 +- .../contracts/layer1/based/LibProposing.sol | 58 +++--- .../contracts/layer1/based/LibProving.sol | 196 +++++++++--------- .../contracts/layer1/based/LibUtils.sol | 38 ++-- .../contracts/layer1/based/LibVerifying.sol | 47 ++--- .../contracts/layer1/based/TaikoData.sol | 101 ++++----- .../contracts/layer1/based/TaikoEvents.sol | 40 ++-- .../contracts/layer1/based/TaikoL1.sol | 11 +- .../preconf/avs-mvp/PreconfServiceManager.sol | 5 +- .../preconf/avs-mvp/iface/IAVSDirectory.sol | 2 + .../avs-mvp/iface/IDelegationManager.sol | 2 + .../layer1/preconf/avs-mvp/iface/ISlasher.sol | 2 + .../avs-mvp/iface/IStrategyManager.sol | 2 + .../eigenlayer/PreconfServiceManager.sol | 2 + .../layer1/preconf/iface/IPreconfRegistry.sol | 2 + .../preconf/iface/IPreconfServiceManager.sol | 2 + .../preconf/iface/IPreconfTaskManager.sol | 2 + .../preconf/impl/LibPreconfConstants.sol | 2 + .../layer1/preconf/impl/PreconfRegistry.sol | 2 + .../preconf/impl/PreconfTaskManager.sol | 2 + .../layer1/preconf/libs/LibBLS12381.sol | 2 + .../layer1/preconf/libs/LibBLSSignature.sol | 2 + .../layer1/preconf/libs/LibEIP4788.sol | 2 + .../layer1/preconf/libs/LibMerkleUtils.sol | 2 + .../contracts/layer2/based/LibEIP1559.sol | 1 + .../contracts/layer2/based/TaikoL2.sol | 21 ++ 27 files changed, 293 insertions(+), 267 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol index d7f86d2663a..9ea3977ecdd 100644 --- a/packages/protocol/contracts/layer1/based/ITaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -29,8 +29,8 @@ interface ITaikoL1 { returns (TaikoData.BlockMetadataV2[] memory metaArr_); /// @notice Proves or contests a block transition. - /// @param _blockId Index of the block to prove. This is also used to - /// select the right implementation version. + /// @param _blockId Index of the block to prove. This is also used to select the right + /// implementation version. /// @param _input ABI-encoded (TaikoData.BlockMetadata, TaikoData.Transition, /// TaikoData.TierProof) tuple. function proveBlock(uint64 _blockId, bytes calldata _input) external; diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol index 7fd6c80d5c6..f4f46b09b98 100644 --- a/packages/protocol/contracts/layer1/based/LibData.sol +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -5,9 +5,12 @@ import "../verifiers/IVerifier.sol"; import "./TaikoData.sol"; /// @title LibData -/// @notice A library that offers helper functions. +/// @notice A library that offers helper functions for data conversion. /// @custom:security-contact security@taiko.xyz library LibData { + /// @dev Converts a BlockV2 struct to a Block struct. + /// @param _v2 The BlockV2 struct to convert. + /// @return The converted Block struct. function blockV2ToV1(TaikoData.BlockV2 memory _v2) internal pure @@ -25,6 +28,9 @@ library LibData { }); } + /// @dev Converts a ContextV2 struct to a Context struct. + /// @param _v2 The ContextV2 struct to convert. + /// @return The converted Context struct. function verifierContextV2ToV1(IVerifier.ContextV2 memory _v2) internal pure diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index bc06ae1db95..b82c25bf6d4 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -9,7 +9,7 @@ import "./LibUtils.sol"; import "./LibVerifying.sol"; /// @title LibProposing -/// @notice A library for handling block proposals in the Taiko protocol. +/// @notice A library that offers helper functions for block proposals. /// @custom:security-contact security@taiko.xyz library LibProposing { using LibAddress for address; @@ -24,12 +24,12 @@ library LibProposing { bool allowCustomProposer; } - /// @notice Emitted when a block is proposed. + /// @dev Emitted when a block is proposed. /// @param blockId The ID of the proposed block. /// @param meta The metadata of the proposed block. event BlockProposedV2(uint256 indexed blockId, TaikoData.BlockMetadataV2 meta); - /// @notice Emitted when a block's txList is in the calldata. + /// @dev Emitted when a block's txList is in the calldata. /// @param blockId The ID of the proposed block. /// @param txList The txList. event CalldataTxList(uint256 indexed blockId, bytes txList); @@ -44,7 +44,7 @@ library LibProposing { error L1_TOO_MANY_BLOCKS(); error L1_UNEXPECTED_PARENT(); - /// @notice Proposes multiple Taiko L2 blocks. + /// @dev Proposes multiple Taiko L2 blocks. /// @param _state The current state of the Taiko protocol. /// @param _config The configuration parameters for the Taiko protocol. /// @param _resolver The address resolver interface. @@ -80,7 +80,7 @@ library LibProposing { } } - /// @notice Proposes a single Taiko L2 block. + /// @dev Proposes a single Taiko L2 block. /// @param _state The current state of the Taiko protocol. /// @param _config The configuration parameters for the Taiko protocol. /// @param _resolver The address resolver interface. @@ -106,6 +106,13 @@ library LibProposing { } } + /// @dev Proposes a single Taiko L2 block. + /// @param _state The current state of the Taiko protocol. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver interface. + /// @param _params Encoded data bytes containing the block parameters. + /// @param _txList Transaction list bytes (if not blob). + /// @return meta_ The metadata of the proposed block (version 2). function _proposeBlock( TaikoData.State storage _state, TaikoData.Config memory _config, @@ -120,8 +127,8 @@ library LibProposing { Local memory local; local.b = _state.slotB; - // It's essential to ensure that the ring buffer for proposed blocks - // still has space for at least one more block. + // It's essential to ensure that the ring buffer for proposed blocks still has space for at + // least one more block. unchecked { if (local.b.numBlocks >= local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1) { revert L1_TOO_MANY_BLOCKS(); @@ -166,10 +173,7 @@ library LibProposing { parentBlk = _state.blocks[(local.b.numBlocks - 1) % _config.blockRingBufferSize]; } - // Verify the passed in L1 state block number. - // We only allow the L1 block to be 2 epochs old. - // The other constraint is that the L1 block number needs to be larger than or equal - // the one in the previous L2 block. + // Verify the passed in L1 state block number to anchor. if ( local.params.anchorBlockId + _config.maxAnchorHeightOffset < block.number // || local.params.anchorBlockId >= block.number @@ -178,10 +182,8 @@ library LibProposing { revert L1_INVALID_ANCHOR_BLOCK(); } - // Verify the passed in timestamp. - // We only allow the timestamp to be 2 epochs old. - // The other constraint is that the timestamp needs to be larger than or equal the - // one in the previous L2 block. + // Verify the provided timestamp to anchor. Note that local.params.anchorBlockId and + // local.params.timestamp may not correspond to the same L1 block. if ( local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK < block.timestamp || local.params.timestamp > block.timestamp @@ -190,25 +192,25 @@ library LibProposing { revert L1_INVALID_TIMESTAMP(); } - // Check if parent block has the right meta hash. This is to allow the proposer to make - // sure the block builds on the expected latest chain state. + // Check if parent block has the right meta hash. This is to allow the proposer to make sure + // the block builds on the expected latest chain state. if (local.params.parentMetaHash == 0) { local.params.parentMetaHash = parentBlk.metaHash; } else if (local.params.parentMetaHash != parentBlk.metaHash) { revert L1_UNEXPECTED_PARENT(); } - // Initialize metadata to compute a metaHash, which forms a part of - // the block data to be stored on-chain for future integrity checks. - // If we choose to persist all data fields in the metadata, it will - // require additional storage slots. + // Initialize metadata to compute a metaHash, which forms a part of the block data to be + // stored on-chain for future integrity checks. If we choose to persist all data fields in + // the metadata, it will require additional storage slots. meta_ = TaikoData.BlockMetadataV2({ anchorBlockHash: blockhash(local.params.anchorBlockId), difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), blobHash: 0, // to be initialized below - // To make sure each L2 block can be executed deterministically by the client - // without referring to its metadata on Ethereum, we need to encode - // config.sharingPctg into the extraData. + // Encode _config.baseFeeConfig into extraData to allow L2 block execution without + // metadata. Metadata might be unavailable until the block is proposed on-chain. In + // preconfirmation scenarios, multiple blocks may be built but not yet proposed, making + // metadata unavailable. extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), coinbase: local.params.coinbase, id: local.b.numBlocks, @@ -231,11 +233,6 @@ library LibProposing { // Update certain meta fields if (meta_.blobUsed) { if (!LibNetwork.isDencunSupported(block.chainid)) revert L1_BLOB_NOT_AVAILABLE(); - - // Always use the first blob in this transaction. If the - // proposeBlock functions are called more than once in the same - // L1 transaction, these multiple L2 blocks will share the same - // blob. meta_.blobHash = blobhash(local.params.blobIndex); if (meta_.blobHash == 0) revert L1_BLOB_NOT_FOUND(); } else { @@ -279,6 +276,9 @@ library LibProposing { emit BlockProposedV2(meta_.id, meta_); } + /// @dev Encodes the base fee configuration into a bytes32. + /// @param _baseFeeConfig The base fee configuration. + /// @return The encoded base fee configuration. function _encodeBaseFeeConfig(LibSharedData.BaseFeeConfig memory _baseFeeConfig) private pure diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index 256e512be4b..f6354b39813 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -8,7 +8,7 @@ import "./LibUtils.sol"; import "./LibVerifying.sol"; /// @title LibProving -/// @notice A library that offers helper functions for the Taiko protocol. +/// @notice A library that offers helper functions for proving and contesting block transitions. /// @custom:security-contact security@taiko.xyz library LibProving { using LibMath for uint256; @@ -30,7 +30,7 @@ library LibProving { bool sameTransition; } - /// @notice Emitted when a transition is proved. + /// @dev Emitted when a transition is proved. /// @param blockId The block ID. /// @param tran The transition data. /// @param prover The prover's address. @@ -46,7 +46,7 @@ library LibProving { uint64 proposedIn ); - /// @notice Emitted when a transition is contested. + /// @dev Emitted when a transition is contested. /// @param blockId The block ID. /// @param tran The transition data. /// @param contester The contester's address. @@ -62,7 +62,7 @@ library LibProving { uint64 proposedIn ); - /// @notice Emitted when proving is paused or unpaused. + /// @dev Emitted when proving is paused or unpaused. /// @param paused The pause status. event ProvingPaused(bool paused); @@ -78,7 +78,7 @@ library LibProving { error L1_NOT_ASSIGNED_PROVER(); error L1_PROVING_PAUSED(); - /// @notice Pauses or unpauses the proving process. + /// @dev Pauses or unpauses the proving process. /// @param _state Current TaikoData.State. /// @param _pause The pause status. function pauseProving(TaikoData.State storage _state, bool _pause) internal { @@ -95,12 +95,12 @@ library LibProving { /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. /// @param _resolver Address resolver interface. - /// @param _blockIds The index of the block to prove. This is also used to - /// select the right implementation version. - /// @param _inputs An abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// @param _blockIds The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _inputs A list of abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, /// TaikoData.TierProof) tuple. - /// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated - /// proof for the given blocks. + /// @param _batchProof A list of abi-encoded TaikoData.TierProof that contains the + /// batch/aggregated proof for the given blocks. function proveBlocks( TaikoData.State storage _state, TaikoData.Config memory _config, @@ -125,8 +125,8 @@ library LibProving { bytes32 batchVerifierName; bool batchVerifierNameSet; - // This loop iterates over each block ID in the _blockIds array. - // For each block ID, it calls the _proveBlock function to get the context and verifier. + // This loop iterates over each block ID in the _blockIds array. For each block ID, it calls + // the _proveBlock function to get the context and verifier. for (uint256 i; i < _blockIds.length; ++i) { bytes32 _verifierName; (ctxs[i], _verifierName) = @@ -155,9 +155,9 @@ library LibProving { /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. /// @param _resolver Address resolver interface. - /// @param _blockId The index of the block to prove. This is also used to - /// select the right implementation version. - /// @param _input An abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// @param _blockId The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input An abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, /// TaikoData.TierProof) tuple. function proveBlock( TaikoData.State storage _state, @@ -172,6 +172,18 @@ library LibProving { _proveBlock(_state, _config, _resolver, _blockId, _input, noBatchProof); } + /// @dev Proves or contests a single Taiko L2 block. + /// @param _state Current TaikoData.State. + /// @param _config Actual TaikoData.Config. + /// @param _resolver Address resolver interface. + /// @param _blockId The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input An abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + /// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated + /// proof for the given blocks. + /// @return ctx_ The context of the verifier. + /// @return verifierName_ The name of the verifier. function _proveBlock( TaikoData.State storage _state, TaikoData.Config memory _config, @@ -201,9 +213,6 @@ library LibProving { if (_blockId != local.meta.id) revert LibUtils.L1_INVALID_BLOCK_ID(); - // Make sure parentHash is not zero - // To contest an existing transition, simply use any non-zero value as - // the blockHash and stateRoot. if (ctx_.tran.parentHash == 0 || ctx_.tran.blockHash == 0 || ctx_.tran.stateRoot == 0) { revert L1_INVALID_TRANSITION(); } @@ -218,23 +227,25 @@ library LibProving { local.metaHash = blk.metaHash; - // Check the integrity of the block data. It's worth noting that in - // theory, this check may be skipped, but it's included for added - // caution. + // Check the integrity of the block data. It's worth noting that in theory, this check may + // be skipped, but it's included for added caution. { bytes32 metaHash = keccak256(abi.encode(local.meta)); if (local.metaHash != metaHash) revert L1_BLOCK_MISMATCH(); } - // Each transition is uniquely identified by the parentHash, with the - // blockHash and stateRoot open for later updates as higher-tier proofs - // become available. In cases where a transition with the specified - // parentHash does not exist, the transition ID (tid) will be set to 0. + // Each transition is uniquely identified by the parentHash, with the blockHash and + // stateRoot open for later updates as higher-tier proofs become available. In cases where a + // transition with the specified parentHash does not exist, a new transition will be + // created. TaikoData.TransitionState memory ts; (local.tid, ts) = _fetchOrCreateTransition(_state, blk, ctx_.tran, local); - // The new proof must meet or exceed the minimum tier required by the - // block or the previous proof; it cannot be on a lower tier. + // Reset a deprecated field. + ts.__reserved1 = 0; + + // The new proof must meet or exceed the minimum tier required by the block or the previous + // proof; it cannot be on a lower tier. if ( local.proof.tier == 0 || local.proof.tier < local.meta.minTier || local.proof.tier < ts.tier @@ -242,8 +253,8 @@ library LibProving { revert L1_INVALID_TIER(); } - // Retrieve the tier configurations. If the tier is not supported, the - // subsequent action will result in a revert. + // Retrieve the tier configurations. If the tier is not supported, the subsequent action + // will result in a revert. { ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(local.blockId)); @@ -258,29 +269,22 @@ library LibProving { _windowMinutes: local.minTier.provingWindow }); - // Checks if only the assigned prover is permissioned to prove the block. - // The assigned prover is granted exclusive permission to prove only the first - // transition. + // Checks if only the assigned prover is permissioned to prove the block. The assigned + // prover is granted exclusive permission to prove only the first transition. if ( local.tier.contestBond != 0 && ts.contester == address(0) && local.tid == 1 && ts.tier == 0 && local.inProvingWindow ) { if (msg.sender != local.meta.proposer) revert L1_NOT_ASSIGNED_PROVER(); } - // We must verify the proof, and any failure in proof verification will - // result in a revert. - // - // It's crucial to emphasize that the proof can be assessed in two - // potential modes: "proving mode" and "contesting mode." However, the - // precise verification logic is defined within each tier's IVerifier - // contract implementation. We simply specify to the verifier contract - // which mode it should utilize - if the new tier is higher than the - // previous tier, we employ the proving mode; otherwise, we employ the - // contesting mode (the new tier cannot be lower than the previous tier, - // this has been checked above). - // - // It's obvious that proof verification is entirely decoupled from - // Taiko's core protocol. + // We must verify the proof, and any failure in proof verification will result in a revert. + // It's crucial to emphasize that the proof can be assessed in two potential modes: "proving + // mode" and "contesting mode." However, the precise verification logic is defined within + // each tier's IVerifier contract implementation. We simply specify to the verifier contract + // which mode it should utilize - if the new tier is higher than the previous tier, we + // employ the proving mode; otherwise, we employ the contesting mode (the new tier cannot be + // lower than the previous tier, this has been checked above). It's obvious that proof + // verification is entirely decoupled from Taiko's core protocol. if (local.tier.verifierName != "") { ctx_ = IVerifier.ContextV2({ metaHash: local.metaHash, @@ -370,12 +374,9 @@ library LibProving { _state, _resolver, msg.sender, local.blockId, local.tier.contestBond ); - // We retain the contest bond within the transition, just in - // case this configuration is altered to a different value - // before the contest is resolved. - // - // It's worth noting that the previous value of ts.contestBond - // doesn't have any significance. + // We retain the contest bond within the transition, just in case this configuration + // is altered to a different value before the contest is resolved. It's worth noting + // that the previous value of ts.contestBond doesn't have any significance. ts.contestBond = local.tier.contestBond; ts.contester = msg.sender; @@ -400,7 +401,13 @@ library LibProving { } } - /// @dev Handle the transition initialization logic + /// @dev Handle the transition initialization logic. + /// @param _state Current TaikoData.State. + /// @param _blk Current TaikoData.BlockV2. + /// @param _tran Current TaikoData.Transition. + /// @param _local Current Local struct. + /// @return tid_ The transition ID. + /// @return ts_ The transition state. function _fetchOrCreateTransition( TaikoData.State storage _state, TaikoData.BlockV2 storage _blk, @@ -413,50 +420,41 @@ library LibProving { tid_ = LibUtils.getTransitionId(_state, _blk, _local.slot, _tran.parentHash); if (tid_ == 0) { - // In cases where a transition with the provided parentHash is not - // found, we must essentially "create" one and set it to its initial - // state. This initial state can be viewed as a special transition - // on tier-0. - // - // Subsequently, we transform this tier-0 transition into a - // non-zero-tier transition with a proof. This approach ensures that - // the same logic is applicable for both 0-to-non-zero transition - // updates and non-zero-to-non-zero transition updates. + // In cases where a transition with the provided parentHash is not found, we must + // essentially "create" one and set it to its initial state. This initial state can be + // viewed as a special transition on tier-0. Subsequently, we transform this tier-0 + // transition into a non-zero-tier transition with a proof. This approach ensures that + // the same logic is applicable for both 0-to-non-zero transition updates and + // non-zero-to-non-zero transition updates. unchecked { - // Unchecked is safe: Not realistic 2**32 different fork choice - // per block will be proven and none of them is valid + // Unchecked is safe: Not realistic 2**32 different fork choice per block will be + // proven and none of them is valid tid_ = _blk.nextTransitionId++; } - // Keep in mind that state.transitions are also reusable storage - // slots, so it's necessary to reinitialize all transition fields - // below. + // Keep in mind that state.transitions are also reusable storage slots, so it's + // necessary to reinitialize all transition fields below. ts_.timestamp = _local.meta.proposedAt; if (tid_ == 1) { - // This approach serves as a cost-saving technique for the - // majority of blocks, where the first transition is expected to - // be the correct one. Writing to `transitions` is more economical - // since it resides in the ring buffer, whereas writing to + // This approach serves as a cost-saving technique for the majority of blocks, where + // the first transition is expected to be the correct one. Writing to `transitions` + // is more economical since it resides in the ring buffer, whereas writing to // `transitionIds` is not as cost-effective. ts_.key = _tran.parentHash; - // In the case of this first transition, the block's assigned - // prover has the privilege to re-prove it, but only when the - // assigned prover matches the previous prover. To ensure this, - // we establish the transition's prover as the block's assigned - // prover. Consequently, when we carry out a 0-to-non-zero - // transition update, the previous prover will consistently be - // the block's assigned prover. - // - // While alternative implementations are possible, introducing - // such changes would require additional if-else logic. + // In the case of this first transition, the block's assigned prover has the + // privilege to re-prove it, but only when the assigned prover matches the previous + // prover. To ensure this, we establish the transition's prover as the block's + // assigned prover. Consequently, when we carry out a 0-to-non-zero transition + // update, the previous prover will consistently be the block's assigned prover. + // While alternative implementations are possible, introducing such changes would + // require additional if-else logic. ts_.prover = _local.meta.proposer; } else { - // Furthermore, we index the transition for future retrieval. - // It's worth emphasizing that this mapping for indexing is not - // reusable. However, given that the majority of blocks will - // only possess one transition — the correct one — we don't need + // Furthermore, we index the transition for future retrieval. It's worth emphasizing + // that this mapping for indexing is not reusable. However, given that the majority + // of blocks will only possess one transition — the correct one — we don't need // to be concerned about the cost in this case. // There is no need to initialize ts.key here because it's only used when tid == 1 @@ -469,16 +467,14 @@ library LibProving { } /// @dev Handles what happens when either the first transition is being proven or there is a - /// higher tier proof incoming - /// - /// Assume Alice is the initial prover, Bob is the contester, and Cindy is the subsequent - /// prover. The validity bond `V` is set at 100, and the contestation bond `C` at 500. If Bob - /// successfully contests, he receives a reward of 65.625, calculated as 3/4 of 7/8 of 100. Cindy - /// receives 21.875, which is 1/4 of 7/8 of 100, while the protocol retains 12.5 as friction. - /// Bob's Return on Investment (ROI) is 13.125%, calculated from 65.625 divided by 500. - // To establish the expected ROI `r` for valid contestations, where the contestation bond `C` to - // validity bond `V` ratio is `C/V = 21/(32*r)`, and if `r` set at 10%, the C/V ratio will be - // 6.5625. + /// higher tier proof incoming. + /// @param _state Current TaikoData.State. + /// @param _resolver Address resolver interface. + /// @param _blk Current TaikoData.BlockV2. + /// @param _ts Current TaikoData.TransitionState. + /// @param _tran Current TaikoData.Transition. + /// @param _proof Current TaikoData.TierProof. + /// @param _local Current Local struct. function _overrideWithHigherProof( TaikoData.State storage _state, IAddressResolver _resolver, @@ -513,9 +509,8 @@ library LibProving { } else { if (_local.sameTransition) revert L1_ALREADY_PROVED(); - // The code below will be executed if - // - 1) the transition is proved for the first time, or - // - 2) the transition is contested. + // The code below will be executed if 1) the transition is proved for the first time + // or 2) the transition is contested. reward = _rewardAfterFriction(_ts.validityBond); if (!_blk.livenessBondReturned) { @@ -564,11 +559,16 @@ library LibProving { } /// @dev Returns the reward after applying 12.5% friction. + /// @param _amount The amount to apply friction to. + /// @return The reward after applying friction. function _rewardAfterFriction(uint256 _amount) private pure returns (uint256) { return (_amount * 7) >> 3; } /// @dev Returns if the liveness bond shall be returned. + /// @param _local Current Local struct. + /// @param _proofData The proof data. + /// @return True if the liveness bond shall be returned, false otherwise. function _returnLivenessBond( Local memory _local, bytes memory _proofData diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 61879f128fb..62321d9132c 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -11,7 +11,7 @@ import "../tiers/ITierRouter.sol"; import "./TaikoData.sol"; /// @title LibUtils -/// @notice A library that offers helper functions. +/// @notice A library that offers utility helper functions. /// @custom:security-contact security@taiko.xyz library LibUtils { using LibMath for uint256; @@ -20,8 +20,7 @@ library LibUtils { /// @dev Emitted when a block is verified. /// @param blockId The ID of the verified block. - /// @param prover The prover whose transition is used for verifying the - /// block. + /// @param prover The prover whose transition is used for verifying the block. /// @param blockHash The hash of the verified block. /// @param tier The tier ID of the proof. event BlockVerifiedV2( @@ -34,7 +33,7 @@ library LibUtils { error L1_TRANSITION_NOT_FOUND(); error L1_UNEXPECTED_TRANSITION_ID(); - /// @notice Initializes the Taiko protocol state. + /// @dev Initializes the Taiko protocol state. /// @param _state The state to initialize. /// @param _genesisBlockHash The block hash of the genesis block. function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) internal { @@ -92,6 +91,7 @@ library LibUtils { /// @param _blockId Id of the block. /// @return blockHash_ The block's block hash. /// @return stateRoot_ The block's storage root. + /// @return verifiedAt_ The timestamp when the block was verified. function getBlockInfo( TaikoData.State storage _state, TaikoData.Config memory _config, @@ -113,8 +113,8 @@ library LibUtils { } } - /// @notice This function will revert if the transition is not found. - /// @dev Retrieves the transition with a given parentHash. + /// @dev Retrieves the transition with a transition ID. + /// @dev This function will revert if the transition is not found. /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. /// @param _blockId Id of the block. @@ -136,9 +136,8 @@ library LibUtils { return _state.transitions[slot][_tid]; } - /// @notice This function will revert if the transition is not found. This function will revert - /// if the transition is not found. /// @dev Retrieves the transition with a given parentHash. + /// @dev This function will revert if the transition is not found. /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. /// @param _blockId Id of the block. @@ -162,8 +161,8 @@ library LibUtils { return _state.transitions[slot][tid]; } - /// @notice Gets the state transitions for a batch of block. For transition that doesn't exist, - /// the corresponding transition state will be empty. + /// @dev Gets the state transitions for a batch of block. For transition that doesn't exist, the + /// corresponding transition state will be empty. /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. /// @param _blockIds Id array of the blocks. @@ -192,8 +191,8 @@ library LibUtils { } } - /// @dev Retrieves the ID of the transition with a given parentHash. - /// This function will return 0 if the transition is not found. + /// @dev Retrieves the ID of the transition with a given parentHash. This function will return 0 + /// if the transition is not found. /// @param _state Current TaikoData.State. /// @param _blk The block storage pointer. /// @param _slot The slot value. @@ -254,18 +253,9 @@ library LibUtils { returns (bool) { if (_config.maxBlocksToVerify == 0) return false; - - // Consider each segment of 8 blocks, verification is attempted either on block 3 if it has - // been - // proved, or on block 7 if it has been proposed. Over time, the ratio of blocks to - // verification attempts averages 4:1, meaning each verification attempt typically covers 4 - // blocks. However, considering worst cases caused by blocks being proved out of order, some - // verification attempts may verify few or no blocks. In such cases, additional - // verifications are needed to catch up. Consequently, the `maxBlocksToVerify` parameter - // should be set high enough, for example 16, to allow for efficient catch-up. - - // Now lets use `maxBlocksToVerify` as an input to calculate the size of each block - // segment, instead of using 8 as a constant. + // If maxBlocksToVerify = 16, segmentSize = 8, verification will be triggered by + // proposeBlock(s) for blocks 0, 8, 16, 24, ..., and by proveBlock(s) for blocks 4, 12, 20, + // 28, ... uint256 segmentSize = _config.maxBlocksToVerify >> 1; if (segmentSize <= 1) return true; diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index f6ca00b3134..407072c2f15 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -6,7 +6,7 @@ import "./LibBonds.sol"; import "./LibUtils.sol"; /// @title LibVerifying -/// @notice A library for handling block verification in the Taiko protocol. +/// @notice A library that offers helper functions for verifying blocks. /// @custom:security-contact security@taiko.xyz library LibVerifying { using LibMath for uint256; @@ -30,7 +30,7 @@ library LibVerifying { error L1_BLOCK_MISMATCH(); error L1_TRANSITION_ID_ZERO(); - /// @notice Verifies up to N blocks. + /// @dev Verifies up to N blocks. /// @param _state The current state of TaikoData. /// @param _config The configuration of TaikoData. /// @param _resolver The address resolver interface. @@ -58,19 +58,15 @@ library LibVerifying { local.lastVerifiedTransitionId = blk.verifiedTransitionId; local.tid = local.lastVerifiedTransitionId; - // The following scenario should never occur but is included as a - // precaution. + // The following scenario should never occur but is included as a precaution. if (local.tid == 0) revert L1_TRANSITION_ID_ZERO(); - // The `blockHash` variable represents the most recently trusted - // blockHash on L2. + // The `blockHash` variable represents the most recently trusted blockHash on L2. local.blockHash = _state.transitions[local.slot][local.tid].blockHash; - // Unchecked is safe: - // - assignment is within ranges - // - blockId and numBlocksVerified values incremented will still be OK in the - // next 584K years if we verify one block per every second - + // Unchecked is safe: - assignment is within ranges - blockId and numBlocksVerified values + // incremented will still be OK in the next 584K years if we verify one block per every + // second unchecked { ++local.blockId; @@ -83,17 +79,16 @@ library LibVerifying { if (blk.blockId != local.blockId) revert L1_BLOCK_MISMATCH(); local.tid = LibUtils.getTransitionId(_state, blk, local.slot, local.blockHash); - // When `tid` is 0, it indicates that there is no proven - // transition with its parentHash equal to the blockHash of the - // most recently verified block. + // When `tid` is 0, it indicates that there is no proven transition with its + // parentHash equal to the blockHash of the most recently verified block. if (local.tid == 0) break; // A transition with the correct `parentHash` has been located. TaikoData.TransitionState storage ts = _state.transitions[local.slot][local.tid]; - // It's not possible to verify this block if either the - // transition is contested and awaiting higher-tier proof or if - // the transition is still within its cooldown period. + // It's not possible to verify this block if either the transition is contested and + // awaiting higher-tier proof or if the transition is still within its cooldown + // period. local.tier = ts.tier; if (ts.contester != address(0)) { @@ -110,8 +105,8 @@ library LibVerifying { ).cooldownWindow; if (!LibUtils.isPostDeadline(ts.timestamp, local.b.lastUnpausedAt, cooldown)) { - // If cooldownWindow is 0, the block can theoretically - // be proved and verified within the same L1 block. + // If cooldownWindow is 0, the block can theoretically be proved and verified + // within the same L1 block. break; } @@ -122,12 +117,12 @@ library LibVerifying { LibBonds.creditBond(_state, local.prover, local.blockId, ts.validityBond); - // Note: We exclusively address the bonds linked to the - // transition used for verification. While there may exist - // other transitions for this block, we disregard them entirely. - // The bonds for these other transitions are burned (more precisely held in custody) - // either when the transitions are generated or proven. In such cases, both the - // provers and contesters of those transitions forfeit their bonds. + // Note: We exclusively address the bonds linked to the transition used for + // verification. While there may exist other transitions for this block, we + // disregard them entirely. The bonds for these other transitions are burned (more + // precisely held in custody) either when the transitions are generated or proven. In + // such cases, both the provers and contesters of those transitions forfeit their + // bonds. emit LibUtils.BlockVerifiedV2({ blockId: local.blockId, @@ -179,7 +174,7 @@ library LibVerifying { } } - /// @notice Retrieves the prover of a verified block. + /// @dev Retrieves the prover of a verified block. /// @param _state The current state of TaikoData. /// @param _config The configuration of TaikoData. /// @param _blockId The ID of the block. diff --git a/packages/protocol/contracts/layer1/based/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol index cbda24eb9ac..f9a2a59cb7c 100644 --- a/packages/protocol/contracts/layer1/based/TaikoData.sol +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -7,62 +7,46 @@ import "src/shared/data/LibSharedData.sol"; /// @notice This library defines various data structures used in the Taiko protocol. /// @custom:security-contact security@taiko.xyz library TaikoData { - /// @dev Struct holding Taiko configuration parameters. See {TaikoConfig}. + /// @notice Struct holding Taiko configuration parameters. See {TaikoConfig}. struct Config { - // --------------------------------------------------------------------- - // Group 1: General configs - // --------------------------------------------------------------------- - // The chain ID of the network where Taiko contracts are deployed. + /// @notice The chain ID of the network where Taiko contracts are deployed. uint64 chainId; - // --------------------------------------------------------------------- - // Group 2: Block level configs - // --------------------------------------------------------------------- - // The maximum number of verifications allowed when a block is proposed or proved. + /// @notice The maximum number of verifications allowed when a block is proposed or proved. uint64 blockMaxProposals; - // Size of the block ring buffer, allowing extra space for proposals. + /// @notice Size of the block ring buffer, allowing extra space for proposals. uint64 blockRingBufferSize; - // The maximum number of verifications allowed when a block is proposed - // or proved. + /// @notice The maximum number of verifications allowed when a block is proposed or proved. uint64 maxBlocksToVerify; - // The maximum gas limit allowed for a block. + /// @notice The maximum gas limit allowed for a block. uint32 blockMaxGasLimit; - // --------------------------------------------------------------------- - // Group 3: Proof related configs - // --------------------------------------------------------------------- - // The amount of Taiko token as a prover liveness bond. + /// @notice The amount of Taiko token as a prover liveness bond. uint96 livenessBond; - // --------------------------------------------------------------------- - // Group 4: Cross-chain sync - // --------------------------------------------------------------------- - // The number of L2 blocks between each L2-to-L1 state root sync. + /// @notice The number of L2 blocks between each L2-to-L1 state root sync. uint8 stateRootSyncInternal; + /// @notice The max differences of the anchor height and the current block number. uint64 maxAnchorHeightOffset; - // --------------------------------------------------------------------- - // Group 5: Previous configs in TaikoL2 - // --------------------------------------------------------------------- + /// @notice Base fee configuration LibSharedData.BaseFeeConfig baseFeeConfig; - // --------------------------------------------------------------------- - // Group 6: Others - // --------------------------------------------------------------------- + /// @notie The Ontake fork height on L2. uint64 ontakeForkHeight; } - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev A proof and the tier of proof it belongs to. + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice A proof and the tier of proof it belongs to. struct TierProof { uint16 tier; bytes data; } - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev Hook and it's data (currently used only during proposeBlock) + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Hook and its data (currently used only during proposeBlock) struct HookCall { address hook; bytes data; } - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev Represents proposeBlock's _data input parameter + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Represents proposeBlock's _data input parameter struct BlockParams { address assignedProver; // DEPRECATED, value ignored. address coinbase; @@ -83,11 +67,10 @@ library TaikoData { uint8 blobIndex; // NEW } - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev Struct containing data only required for proving a block - /// Note: On L2, `block.difficulty` is the pseudo name of - /// `block.prevrandao`, which returns a random number provided by the layer - /// 1 chain. + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct containing data only required for proving a block + /// @notice Note: On L2, `block.difficulty` is the pseudo name of `block.prevrandao`, which + /// returns a random number provided by the layer 1 chain. struct BlockMetadata { bytes32 l1Hash; bytes32 difficulty; @@ -128,7 +111,7 @@ library TaikoData { LibSharedData.BaseFeeConfig baseFeeConfig; } - /// @dev Struct representing transition to be proven. + /// @notice Struct representing transition to be proven. struct Transition { bytes32 parentHash; bytes32 blockHash; @@ -136,8 +119,8 @@ library TaikoData { bytes32 graffiti; // Arbitrary data that the prover can use for various purposes. } - /// @dev Struct representing state transition data. - /// 6 slots used. + /// @notice Struct representing state transition data. + /// @notice 6 slots used. struct TransitionState { bytes32 key; // slot 1, only written/read for the 1st state transition. bytes32 blockHash; // slot 2 @@ -146,14 +129,14 @@ library TaikoData { uint96 validityBond; address contester; // slot 5 uint96 contestBond; - uint64 timestamp; // slot 6 (90 bits) + uint64 timestamp; // slot 6 (88 bits) uint16 tier; uint8 __reserved1; } - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev Struct containing data required for verifying a block. - /// 3 slots used. + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct containing data required for verifying a block. + /// @notice 3 slots used. struct Block { bytes32 metaHash; // slot 1 address assignedProver; @@ -162,14 +145,13 @@ library TaikoData { uint64 proposedAt; uint64 proposedIn; uint32 nextTransitionId; - // The ID of the transaction that is used to verify this block. However, if - // this block is not verified as the last block in a batch, verifiedTransitionId - // will remain zero. + // The ID of the transaction that is used to verify this block. However, if this block is + // not verified as the last block in a batch, verifiedTransitionId will remain zero. uint32 verifiedTransitionId; } - /// @dev Struct containing data required for verifying a block. - /// 3 slots used. + /// @notice Struct containing data required for verifying a block. + /// @notice 3 slots used. struct BlockV2 { bytes32 metaHash; // slot 1 address assignedProver; // DEPRECATED!!! @@ -184,21 +166,20 @@ library TaikoData { uint24 verifiedTransitionId; } - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev Struct representing an Ethereum deposit. - /// 2 slot used. Currently removed from protocol, but to be backwards compatible, the struct and - /// return values stayed for now. + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct representing an Ethereum deposit. + /// @notice 2 slot used. Currently removed from protocol, but to be backwards compatible, the + /// struct and return values stayed for now. struct EthDeposit { address recipient; uint96 amount; uint64 id; } - /// @dev Forge is only able to run coverage in case the contracts by default - /// capable of compiling without any optimization (neither optimizer runs, - /// no compiling --via-ir flag). - /// In order to resolve stack too deep without optimizations, we needed to - /// introduce outsourcing vars into structs below. + /// @notice Forge is only able to run coverage in case the contracts by default capable of + /// compiling without any optimization (neither optimizer runs, no compiling --via-ir flag). + /// @notice In order to resolve stack too deep without optimizations, we needed to introduce + /// outsourcing vars into structs below. struct SlotA { uint64 genesisHeight; uint64 genesisTimestamp; @@ -216,7 +197,7 @@ library TaikoData { uint64 lastUnpausedAt; } - /// @dev Struct holding the state variables for the {TaikoL1} contract. + /// @notice Struct holding the state variables for the {TaikoL1} contract. struct State { // Ring buffer for proposed blocks and a some recent verified blocks. mapping(uint64 blockId_mod_blockRingBufferSize => BlockV2 blk) blocks; diff --git a/packages/protocol/contracts/layer1/based/TaikoEvents.sol b/packages/protocol/contracts/layer1/based/TaikoEvents.sol index f7cde269bb3..9abfb9d6888 100644 --- a/packages/protocol/contracts/layer1/based/TaikoEvents.sol +++ b/packages/protocol/contracts/layer1/based/TaikoEvents.sol @@ -4,37 +4,35 @@ pragma solidity ^0.8.24; import "./TaikoData.sol"; /// @title TaikoEvents -/// @notice This abstract contract provides event declarations for the Taiko -/// protocol, which are emitted during block proposal, proof, verification, and -/// Ethereum deposit processes. -/// @dev The events defined here must match the definitions in the corresponding -/// L1 libraries. +/// @notice This abstract contract provides event declarations for the Taiko protocol, which are +/// emitted during block proposal, proof, verification, and Ethereum deposit processes. +/// @dev The events defined here must match the definitions in the corresponding L1 libraries. /// @custom:security-contact security@taiko.xyz abstract contract TaikoEvents { - /// @dev Emitted when tokens are deposited into a user's bond balance. + /// @notice Emitted when tokens are deposited into a user's bond balance. /// @param user The address of the user who deposited the tokens. /// @param amount The amount of tokens deposited. event BondDeposited(address indexed user, uint256 amount); - /// @dev Emitted when tokens are withdrawn from a user's bond balance. + /// @notice Emitted when tokens are withdrawn from a user's bond balance. /// @param user The address of the user who withdrew the tokens. /// @param amount The amount of tokens withdrawn. event BondWithdrawn(address indexed user, uint256 amount); - /// @dev Emitted when a token is credited back to a user's bond balance. + /// @notice Emitted when a token is credited back to a user's bond balance. /// @param user The address of the user whose bond balance is credited. /// @param blockId The ID of the block to credit for. /// @param amount The amount of tokens credited. event BondCredited(address indexed user, uint256 blockId, uint256 amount); - /// @dev Emitted when a token is debited from a user's bond balance. + /// @notice Emitted when a token is debited from a user's bond balance. /// @param user The address of the user whose bond balance is debited. /// @param blockId The ID of the block to debit for. /// @param amount The amount of tokens debited. event BondDebited(address indexed user, uint256 blockId, uint256 amount); - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @notice Emitted when a block is proposed. + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a block is + /// proposed. /// @param blockId The ID of the proposed block. /// @param assignedProver The address of the assigned prover. /// @param livenessBond The liveness bond of the proposed block. @@ -59,8 +57,8 @@ abstract contract TaikoEvents { /// @param txList The txList. event CalldataTxList(uint256 indexed blockId, bytes txList); - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @notice Emitted when a transition is proved. + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a transition + /// is proved. /// @param blockId The block ID. /// @param tran The transition data. /// @param prover The prover's address. @@ -90,8 +88,8 @@ abstract contract TaikoEvents { uint64 proposedIn ); - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @notice Emitted when a transition is contested. + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a transition + /// is contested. /// @param blockId The block ID. /// @param tran The transition data. /// @param contester The contester's address. @@ -125,11 +123,10 @@ abstract contract TaikoEvents { /// @param paused The pause status. event ProvingPaused(bool paused); - /// @dev DEPRECATED but used by node/client for syncing old blocks - /// @dev Emitted when a block is verified. + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a block is + /// verified. /// @param blockId The ID of the verified block. - /// @param prover The prover whose transition is used for verifying the - /// block. + /// @param prover The prover whose transition is used for verifying the block. /// @param blockHash The hash of the verified block. /// @param stateRoot Deprecated and is always zero. /// @param tier The tier ID of the proof. @@ -141,10 +138,9 @@ abstract contract TaikoEvents { uint16 tier ); - /// @dev Emitted when a block is verified. + /// @notice Emitted when a block is verified. /// @param blockId The ID of the verified block. - /// @param prover The prover whose transition is used for verifying the - /// block. + /// @param prover The prover whose transition is used for verifying the block. /// @param blockHash The hash of the verified block. /// @param tier The tier ID of the proof. event BlockVerifiedV2( diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 5a60a60f60a..bce9eb6daba 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -14,9 +14,9 @@ import "./ITaikoL1.sol"; /// @notice This contract serves as the "base layer contract" of the Taiko protocol, providing /// functionalities for proposing, proving, and verifying blocks. The term "base layer contract" /// means that although this is usually deployed on L1, it can also be deployed on L2s to create -/// L3 "inception layers". The contract also handles the deposit and withdrawal of Taiko tokens -/// and Ether. Additionally, this contract doesn't hold any Ether. Ether deposited to L2 are held -/// by the Bridge contract. +/// L3s. The contract also handles the deposit and withdrawal of Taiko tokens and Ether. +/// Additionally, this contract doesn't hold any Ether. Ether deposited to L2 are held by the Bridge +/// contract. /// @dev Labeled in AddressResolver as "taiko" /// @custom:security-contact security@taiko.xyz contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { @@ -63,6 +63,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { state.__reserve1 = 0; } + /// @notice This function shall be called by previously deployed contracts. function init3() external onlyOwner reinitializer(3) { // this value from EssentialContract is no longer used. __lastUnpausedAt = 0; @@ -154,6 +155,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { LibBonds.withdrawBond(state, this, _amount); } + /// @notice Unpauses the contract. function unpause() public override whenPaused { _authorizePause(msg.sender, false); __paused = _FALSE; @@ -162,6 +164,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { } /// @notice Gets the current bond balance of a given address. + /// @param _user The address of the user. /// @return The current bond balance. function bondBalanceOf(address _user) external view returns (uint256) { return LibBonds.bondBalanceOf(state, _user); @@ -271,6 +274,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { return (state.slotA, state.slotB); } + /// @notice Returns the timestamp of the last unpaused state. + /// @return The timestamp of the last unpaused state. function lastUnpausedAt() public view override returns (uint64) { return state.slotB.lastUnpausedAt; } diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol index 61e28c9d58c..128f6bf39bf 100644 --- a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol @@ -6,10 +6,11 @@ import "../iface/IPreconfServiceManager.sol"; import "./iface/ISlasher.sol"; import "./iface/IAVSDirectory.sol"; +/// @title PreconfServiceManager /// @dev This contract would serve as the address of the AVS w.r.t the restaking platform being -/// used. -/// Currently, this is based on a mock version of Eigenlayer that we have created solely for a +/// used. Currently, this is based on a mock version of Eigenlayer that we have created solely for a /// POC. +/// @custom:security-contact security@taiko.xyz contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { address internal immutable preconfRegistry; address internal immutable preconfTaskManager; diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol index 99f137e13c4..ad4922b5174 100644 --- a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @title IAVSDirectory +/// @custom:security-contact security@taiko.xyz interface IAVSDirectory { struct SignatureWithSaltAndExpiry { // the signature itself, formatted as a single bytes object diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol index 38301322415..d786a0d7537 100644 --- a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @title IDelegationManager +/// @custom:security-contact security@taiko.xyz interface IDelegationManager { event OperatorSharesIncreased( address indexed operator, address staker, address strategy, uint256 shares diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol index 7d521f089e0..5e399835e54 100644 --- a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @title ISlasher +/// @custom:security-contact security@taiko.xyz interface ISlasher { event OperatorSlashed(address indexed operator, address indexed avs); event OptedIntoSlashing(address indexed operator, address indexed avs); diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol index f4f7795dde5..dda27f58ce1 100644 --- a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @title IStrategyManager +/// @custom:security-contact security@taiko.xyz interface IStrategyManager { event Deposit(address staker, address token, address strategy, uint256 shares); diff --git a/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol index f710eb2e53c..c25da59facb 100644 --- a/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol +++ b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol @@ -4,5 +4,7 @@ pragma solidity ^0.8.24; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "../iface/IPreconfServiceManager.sol"; +/// @title PreconfServiceManager /// @dev An implementation of IPreconfServiceManager on top of Eigenlayer restaking. +/// @custom:security-contact security@taiko.xyz abstract contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { } diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol index b4cb69f2ad7..cfafe4081f6 100644 --- a/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.24; import "../libs/LibBLS12381.sol"; +/// @title IPreconfRegistry +/// @custom:security-contact security@taiko.xyz interface IPreconfRegistry { struct Validator { // Preconfer that the validator proposer blocks for diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol index 7a7fb65955b..d47951d76e5 100644 --- a/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @title IPreconfServiceManager +/// @custom:security-contact security@taiko.xyz interface IPreconfServiceManager { event StakeLockedUntil(address indexed operator, uint256 timestamp); diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol index f3fb1e7a8f9..c381b71f34b 100644 --- a/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.24; import "../libs/LibEIP4788.sol"; +/// @title IPreconfTaskManager +/// @custom:security-contact security@taiko.xyz interface IPreconfTaskManager { struct LookaheadBufferEntry { // True when the preconfer is randomly selected diff --git a/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol index 7a24709180d..12e408bb38a 100644 --- a/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol +++ b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +/// @title LibPreconfConstants +/// @custom:security-contact security@taiko.xyz library LibPreconfConstants { uint256 internal constant MAINNET_BEACON_GENESIS = 1_606_824_023; uint256 internal constant SECONDS_IN_SLOT = 12; diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol index 31fe787827f..42d35e37288 100644 --- a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol @@ -7,6 +7,8 @@ import "../iface/IPreconfServiceManager.sol"; import "../libs/LibBLSSignature.sol"; import "./LibPreconfConstants.sol"; +/// @title PreconfRegistry +/// @custom:security-contact security@taiko.xyz contract PreconfRegistry is IPreconfRegistry, Initializable { using LibBLS12381 for LibBLS12381.G1Point; diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol index 225d875102f..ec3b6f075af 100644 --- a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol @@ -11,6 +11,8 @@ import "../iface/IPreconfRegistry.sol"; import "../libs/LibEIP4788.sol"; import "./LibPreconfConstants.sol"; +/// @title PreconfTaskManager +/// @custom:security-contact security@taiko.xyz contract PreconfTaskManager is IPreconfTaskManager, Initializable { // Cannot be kept in `LibPreconfConstants` file because solidity expects array sizes // to be stored in the main contract file itself. diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol index c7d839ac6d8..835b2f029b9 100644 --- a/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol @@ -3,6 +3,8 @@ // https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/src/HashToCurve.sol pragma solidity ^0.8.24; +/// @title LibBLS12381 +/// @custom:security-contact security@taiko.xyz library LibBLS12381 { using LibBLS12381 for *; diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol index 3ec591cdfbd..1b2255450ba 100644 --- a/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.24; import "./LibBLS12381.sol"; +/// @title LibBLSSignature +/// @custom:security-contact security@taiko.xyz library LibBLSSignature { using LibBLS12381 for *; diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol index 1331f708a25..1b1c7a7c432 100644 --- a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol +++ b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol @@ -5,6 +5,8 @@ pragma solidity ^0.8.24; import "./LibMerkleUtils.sol"; +/// @title LibEIP4788 +/// @custom:security-contact security@taiko.xyz library LibEIP4788 { struct InclusionProof { // `Chunks` of the SSZ encoded validator diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol index 6b5214cfdac..c9a962edea4 100644 --- a/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol +++ b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.24; +/// @title LibMerkleUtils +/// @custom:security-contact security@taiko.xyz library LibMerkleUtils { uint256 internal constant CHUNKS_LENGTH = 8; uint256 internal constant TMP_LENGTH = 4; diff --git a/packages/protocol/contracts/layer2/based/LibEIP1559.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol index 1c0b2593fd9..b00c25f2a2a 100644 --- a/packages/protocol/contracts/layer2/based/LibEIP1559.sol +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -12,6 +12,7 @@ import "src/shared/common/LibMath.sol"; library LibEIP1559 { using LibMath for uint256; + /// @notice The maximum allowable input value for the exp() function. uint128 public constant MAX_EXP_INPUT = 135_305_999_368_893_231_588; error EIP1559_INVALID_PARAMS(); diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol index 3242c551264..d2befc46d41 100644 --- a/packages/protocol/contracts/layer2/based/TaikoL2.sol +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -41,7 +41,11 @@ contract TaikoL2 is EssentialContract, IBlockHash { /// @notice The last synced L1 block height. uint64 public lastSyncedBlock; + + /// @notice The last L2 block's timestamp. uint64 public parentTimestamp; + + /// @notice The last L2 block's gas target. uint64 public parentGasTarget; /// @notice The L1's chain ID. @@ -161,6 +165,15 @@ contract TaikoL2 is EssentialContract, IBlockHash { emit Anchored(parentHash, newGasExcess); } + /// @notice Anchors the latest L1 block details to L2 for cross-layer + /// message verification. + /// @dev This function can be called freely as the golden touch private key is publicly known, + /// but the Taiko node guarantees the first transaction of each block is always this anchor + /// transaction, and any subsequent calls will revert with L2_PUBLIC_INPUT_HASH_MISMATCH. + /// @param _anchorBlockId The `anchorBlockId` value in this block's metadata. + /// @param _anchorStateRoot The state root for the L1 block with id equals `_anchorBlockId`. + /// @param _parentGasUsed The gas used in the parent block. + /// @param _baseFeeConfig The base fee configuration. function anchorV2( uint64 _anchorBlockId, bytes32 _anchorStateRoot, @@ -309,6 +322,14 @@ contract TaikoL2 is EssentialContract, IBlockHash { return false; } + /// @notice Returns the parent timestamp. + /// @return The timestamp of the parent block. + function getParentTimestamp() public view returns (uint64) { + return parentTimestamp; + } + + /// @notice Returns the Ontake fork height. + /// @return The Ontake fork height. function ontakeForkHeight() public pure virtual returns (uint64) { return 0; } From 1abde15d439f48b727695d4c2e9fa9167ec4d978 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 28 Oct 2024 21:25:10 +0800 Subject: [PATCH 26/38] Update LibProposing.sol --- .../protocol/contracts/layer1/based/LibProposing.sol | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index b82c25bf6d4..26e1c49a64a 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -164,6 +164,7 @@ library LibProposing { } if (local.params.timestamp == 0) { + // timestamp and anchorBlockId are not necessarily associated with the same L1 block local.params.timestamp = uint64(block.timestamp); } @@ -177,7 +178,7 @@ library LibProposing { if ( local.params.anchorBlockId + _config.maxAnchorHeightOffset < block.number // || local.params.anchorBlockId >= block.number - || local.params.anchorBlockId < parentBlk.proposedIn + || local.params.anchorBlockId < parentBlk.proposedIn // parent.params.anchorBlockId ) { revert L1_INVALID_ANCHOR_BLOCK(); } @@ -187,7 +188,7 @@ library LibProposing { if ( local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK < block.timestamp || local.params.timestamp > block.timestamp - || local.params.timestamp < parentBlk.proposedAt + || local.params.timestamp < parentBlk.proposedAt // parent.params.timestamp ) { revert L1_INVALID_TIMESTAMP(); } @@ -255,8 +256,8 @@ library LibProposing { assignedProver: address(0), livenessBond: 0, blockId: local.b.numBlocks, - proposedAt: local.params.timestamp, // name kept but used differently - proposedIn: local.params.anchorBlockId, // name kept but used differently + proposedAt: local.params.timestamp, // = params.timestamp post Ontake + proposedIn: local.params.anchorBlockId, // = params.anchorBlockId post Ontake nextTransitionId: 1, // For a new block, the next transition ID is always 1, not 0. livenessBondReturned: false, // For unverified block, its verifiedTransitionId is always 0. From 290a9f902c86687cff60e57ed9be8d620600e197 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Mon, 28 Oct 2024 21:29:01 +0800 Subject: [PATCH 27/38] Update LibProposing.sol --- packages/protocol/contracts/layer1/based/LibProposing.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index b394ed18836..b16d72a9b7b 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -164,6 +164,7 @@ library LibProposing { local.params.anchorBlockId = uint64(block.number - 1); } + // We deliberately avoid subtracting 12 second to use a more recent timestamp. if (local.params.timestamp == 0) { local.params.timestamp = uint64(block.timestamp); } From eb47f8818ff700c2f7ff5bd69c041d4a28d6fad3 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Mon, 28 Oct 2024 21:59:56 +0800 Subject: [PATCH 28/38] fix(protocol): check ontake for height in _proposeBlock (#18329) --- .../protocol/contracts/layer1/based/LibProposing.sol | 9 ++++++--- packages/protocol/contracts/layer1/based/TaikoL1.sol | 6 ++++++ packages/protocol/test/layer1/based/TaikoL1.t.sol | 1 + .../test/layer1/based/TaikoL1LibProvingWithTiers.t.sol | 1 + .../protocol/test/layer1/based/TaikoL1TestGroupBase.sol | 1 + 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index b16d72a9b7b..ee76a93842d 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -36,6 +36,7 @@ library LibProposing { error L1_BLOB_NOT_AVAILABLE(); error L1_BLOB_NOT_FOUND(); + error L1_FORK_HEIGHT_ERROR(); error L1_INVALID_ANCHOR_BLOCK(); error L1_INVALID_CUSTOM_PROPOSER(); error L1_INVALID_PARAMS(); @@ -130,9 +131,11 @@ library LibProposing { // It's essential to ensure that the ring buffer for proposed blocks still has space for at // least one more block. unchecked { - if (local.b.numBlocks >= local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1) { - revert L1_TOO_MANY_BLOCKS(); - } + require(local.b.numBlocks >= _config.ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + require( + local.b.numBlocks < local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1, + L1_TOO_MANY_BLOCKS() + ); } address preconfTaskManager = _resolver.resolve(LibStrings.B_PRECONF_TASK_MANAGER, true); diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index bce9eb6daba..871aa363b8d 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -25,6 +25,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { uint256[50] private __gap; + error L1_FORK_HEIGHT_ERROR(); + modifier whenProvingNotPaused() { if (state.slotB.provingPaused) revert LibProving.L1_PROVING_PAUSED(); _; @@ -179,12 +181,16 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { /// @param _blockId Index of the block. /// @return blk_ The block. function getBlock(uint64 _blockId) external view returns (TaikoData.Block memory blk_) { + require(_blockId < getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + (TaikoData.BlockV2 memory blk,) = LibUtils.getBlock(state, getConfig(), _blockId); blk_ = LibData.blockV2ToV1(blk); } /// @inheritdoc ITaikoL1 function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_) { + require(_blockId >= getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); } diff --git a/packages/protocol/test/layer1/based/TaikoL1.t.sol b/packages/protocol/test/layer1/based/TaikoL1.t.sol index d950a1c777a..3289979f193 100644 --- a/packages/protocol/test/layer1/based/TaikoL1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1.t.sol @@ -11,6 +11,7 @@ contract TaikoL1_NoCooldown is TaikoL1 { config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token + config.ontakeForkHeight = 0; } } diff --git a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index 04d8f2da1eb..d27eb8a968c 100644 --- a/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -11,6 +11,7 @@ contract TaikoL1Tiers is TaikoL1 { config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token + config.ontakeForkHeight = 0; } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol index 5d45d0ef695..6accc380dc8 100644 --- a/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol @@ -10,6 +10,7 @@ contract TaikoL1New is TaikoL1 { config.blockMaxProposals = 20; config.blockRingBufferSize = 25; config.stateRootSyncInternal = 2; + config.ontakeForkHeight = 0; } } From 454d4b6d41aecbfa94614e3050b8e11cdbb61953 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:30:37 +0800 Subject: [PATCH 29/38] chore(protocol): use require-statements for readability (#18325) Co-authored-by: Roger <50648015+RogerLamTd@users.noreply.github.com> Co-authored-by: dantaik Co-authored-by: Gavin Yu --- .../contracts/layer1/based/LibProposing.sol | 49 +++++++------ .../contracts/layer1/based/LibProving.sol | 61 +++++++--------- .../contracts/layer1/based/LibUtils.sol | 18 ++--- .../contracts/layer1/based/LibVerifying.sol | 6 +- .../contracts/layer1/based/TaikoL1.sol | 2 +- .../preconf/avs-mvp/PreconfServiceManager.sol | 8 +-- .../layer1/preconf/impl/PreconfRegistry.sol | 43 +++++------- .../preconf/impl/PreconfTaskManager.sol | 70 ++++++------------- .../layer1/preconf/libs/LibEIP4788.sol | 53 ++++++-------- .../preconf/mock/MockPreconfRegistry.sol | 68 ++++++++---------- .../layer1/provers/GuardianProver.sol | 30 ++++---- .../contracts/layer1/provers/ProverSet.sol | 11 +-- .../layer1/verifiers/Risc0Verifier.sol | 20 ++---- .../layer1/verifiers/SgxVerifier.sol | 28 ++++---- .../layer1/verifiers/SgxVerifierBase.sol | 12 ++-- .../verifiers/compose/ComposeVerifier.sol | 14 ++-- .../shared/common/AddressManager.sol | 2 +- .../shared/common/AddressResolver.sol | 22 +++--- .../shared/common/EssentialContract.sol | 12 ++-- .../contracts/shared/common/LibAddress.sol | 6 +- .../contracts/shared/common/LibBytes.sol | 2 +- .../contracts/shared/common/LibTrieProof.sol | 4 +- 22 files changed, 229 insertions(+), 312 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index 0ffa04872b0..dfe75709e6a 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -130,8 +130,9 @@ library LibProposing { // It's essential to ensure that the ring buffer for proposed blocks still has space for at // least one more block. + require(local.b.numBlocks >= _config.ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + unchecked { - require(local.b.numBlocks >= _config.ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); require( local.b.numBlocks < local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1, L1_TOO_MANY_BLOCKS() @@ -140,7 +141,7 @@ library LibProposing { address preconfTaskManager = _resolver.resolve(LibStrings.B_PRECONF_TASK_MANAGER, true); if (preconfTaskManager != address(0)) { - if (preconfTaskManager != msg.sender) revert L1_INVALID_PROPOSER(); + require(preconfTaskManager == msg.sender, L1_INVALID_PROPOSER()); local.allowCustomProposer = true; } @@ -151,9 +152,10 @@ library LibProposing { if (local.params.proposer == address(0)) { local.params.proposer = msg.sender; } else { - if (local.params.proposer != msg.sender && !local.allowCustomProposer) { - revert L1_INVALID_CUSTOM_PROPOSER(); - } + require( + local.params.proposer == msg.sender || local.allowCustomProposer, + L1_INVALID_CUSTOM_PROPOSER() + ); } if (local.params.coinbase == address(0)) { @@ -177,30 +179,33 @@ library LibProposing { } // Verify the passed in L1 state block number to anchor. - if ( - local.params.anchorBlockId + _config.maxAnchorHeightOffset < block.number // - || local.params.anchorBlockId >= block.number - || local.params.anchorBlockId < parentBlk.proposedIn // parent.params.anchorBlockId - ) { - revert L1_INVALID_ANCHOR_BLOCK(); - } + require( + local.params.anchorBlockId + _config.maxAnchorHeightOffset >= block.number, + L1_INVALID_ANCHOR_BLOCK() + ); + require(local.params.anchorBlockId < block.number, L1_INVALID_ANCHOR_BLOCK()); + + // parentBlk.proposedIn is actually parent's params.anchorBlockId + require(local.params.anchorBlockId >= parentBlk.proposedIn, L1_INVALID_ANCHOR_BLOCK()); // Verify the provided timestamp to anchor. Note that local.params.anchorBlockId and // local.params.timestamp may not correspond to the same L1 block. - if ( + require( local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK - < block.timestamp || local.params.timestamp > block.timestamp - || local.params.timestamp < parentBlk.proposedAt // parent.params.timestamp - ) { - revert L1_INVALID_TIMESTAMP(); - } + >= block.timestamp, + L1_INVALID_TIMESTAMP() + ); + require(local.params.timestamp <= block.timestamp, L1_INVALID_TIMESTAMP()); + + // parentBlk.proposedAt is actually parent's params.timestamp + require(local.params.timestamp >= parentBlk.proposedAt, L1_INVALID_TIMESTAMP()); // Check if parent block has the right meta hash. This is to allow the proposer to make sure // the block builds on the expected latest chain state. if (local.params.parentMetaHash == 0) { local.params.parentMetaHash = parentBlk.metaHash; - } else if (local.params.parentMetaHash != parentBlk.metaHash) { - revert L1_UNEXPECTED_PARENT(); + } else { + require(local.params.parentMetaHash == parentBlk.metaHash, L1_UNEXPECTED_PARENT()); } // Initialize metadata to compute a metaHash, which forms a part of the block data to be @@ -235,9 +240,9 @@ library LibProposing { // Update certain meta fields if (meta_.blobUsed) { - if (!LibNetwork.isDencunSupported(block.chainid)) revert L1_BLOB_NOT_AVAILABLE(); + require(LibNetwork.isDencunSupported(block.chainid), L1_BLOB_NOT_AVAILABLE()); meta_.blobHash = blobhash(local.params.blobIndex); - if (meta_.blobHash == 0) revert L1_BLOB_NOT_FOUND(); + require(meta_.blobHash != 0, L1_BLOB_NOT_FOUND()); } else { meta_.blobHash = keccak256(_txList); emit CalldataTxList(meta_.id, _txList); diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index f6354b39813..ea99e3e518e 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -71,6 +71,7 @@ library LibProving { error L1_BLOCK_MISMATCH(); error L1_CANNOT_CONTEST(); error L1_DIFF_VERIFIER(); + error L1_INVALID_BLOCK_ID(); error L1_INVALID_PARAMS(); error L1_INVALID_PAUSE_STATUS(); error L1_INVALID_TIER(); @@ -82,7 +83,7 @@ library LibProving { /// @param _state Current TaikoData.State. /// @param _pause The pause status. function pauseProving(TaikoData.State storage _state, bool _pause) internal { - if (_state.slotB.provingPaused == _pause) revert L1_INVALID_PAUSE_STATUS(); + require(_state.slotB.provingPaused != _pause, L1_INVALID_PAUSE_STATUS()); _state.slotB.provingPaused = _pause; if (!_pause) { @@ -111,14 +112,13 @@ library LibProving { ) public { - if (_blockIds.length == 0 || _blockIds.length != _inputs.length) { - revert L1_INVALID_PARAMS(); - } + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _inputs.length, L1_INVALID_PARAMS()); TaikoData.TierProof memory batchProof; if (_batchProof.length != 0) { batchProof = abi.decode(_batchProof, (TaikoData.TierProof)); - if (batchProof.tier == 0) revert L1_INVALID_TIER(); + require(batchProof.tier != 0, L1_INVALID_TIER()); } IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](_blockIds.length); @@ -137,8 +137,8 @@ library LibProving { if (!batchVerifierNameSet) { batchVerifierNameSet = true; batchVerifierName = _verifierName; - } else if (batchVerifierName != _verifierName) { - revert L1_DIFF_VERIFIER(); + } else { + require(batchVerifierName == _verifierName, L1_DIFF_VERIFIER()); } } } @@ -211,16 +211,14 @@ library LibProving { local.proof = _batchProof; } - if (_blockId != local.meta.id) revert LibUtils.L1_INVALID_BLOCK_ID(); - - if (ctx_.tran.parentHash == 0 || ctx_.tran.blockHash == 0 || ctx_.tran.stateRoot == 0) { - revert L1_INVALID_TRANSITION(); - } + require(ctx_.tran.parentHash != 0, L1_INVALID_TRANSITION()); + require(ctx_.tran.blockHash != 0, L1_INVALID_TRANSITION()); + require(ctx_.tran.stateRoot != 0, L1_INVALID_TRANSITION()); // Check that the block has been proposed but has not yet been verified. - if (local.meta.id <= local.b.lastVerifiedBlockId || local.meta.id >= local.b.numBlocks) { - revert LibUtils.L1_INVALID_BLOCK_ID(); - } + require(_blockId == local.meta.id, L1_INVALID_BLOCK_ID()); + require(local.meta.id > local.b.lastVerifiedBlockId, L1_INVALID_BLOCK_ID()); + require(local.meta.id < local.b.numBlocks, L1_INVALID_BLOCK_ID()); local.slot = local.meta.id % _config.blockRingBufferSize; TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; @@ -229,10 +227,7 @@ library LibProving { // Check the integrity of the block data. It's worth noting that in theory, this check may // be skipped, but it's included for added caution. - { - bytes32 metaHash = keccak256(abi.encode(local.meta)); - if (local.metaHash != metaHash) revert L1_BLOCK_MISMATCH(); - } + require(local.metaHash == keccak256(abi.encode(local.meta)), L1_BLOCK_MISMATCH()); // Each transition is uniquely identified by the parentHash, with the blockHash and // stateRoot open for later updates as higher-tier proofs become available. In cases where a @@ -246,12 +241,9 @@ library LibProving { // The new proof must meet or exceed the minimum tier required by the block or the previous // proof; it cannot be on a lower tier. - if ( - local.proof.tier == 0 || local.proof.tier < local.meta.minTier - || local.proof.tier < ts.tier - ) { - revert L1_INVALID_TIER(); - } + require(local.proof.tier != 0, L1_INVALID_TIER()); + require(local.proof.tier >= local.meta.minTier, L1_INVALID_TIER()); + require(local.proof.tier >= ts.tier, L1_INVALID_TIER()); // Retrieve the tier configurations. If the tier is not supported, the subsequent action // will result in a revert. @@ -275,7 +267,7 @@ library LibProving { local.tier.contestBond != 0 && ts.contester == address(0) && local.tid == 1 && ts.tier == 0 && local.inProvingWindow ) { - if (msg.sender != local.meta.proposer) revert L1_NOT_ASSIGNED_PROVER(); + require(msg.sender == local.meta.proposer, L1_NOT_ASSIGNED_PROVER()); } // We must verify the proof, and any failure in proof verification will result in a revert. // It's crucial to emphasize that the proof can be assessed in two potential modes: "proving @@ -336,7 +328,7 @@ library LibProving { } else { // New transition and old transition on the same tier - and if this transaction tries to // prove the same, it reverts - if (local.sameTransition) revert L1_ALREADY_PROVED(); + require(!local.sameTransition, L1_ALREADY_PROVED()); if (local.isTopTier) { // The top tier prover re-proves. @@ -357,17 +349,16 @@ library LibProving { }); } else { // Contesting but not on the highest tier - if (ts.contester != address(0)) revert L1_ALREADY_CONTESTED(); + require(ts.contester == address(0), L1_ALREADY_CONTESTED()); // Making it a non-sliding window, relative when ts.timestamp was registered (or to // lastUnpaused if that one is bigger) - if ( - LibUtils.isPostDeadline( + require( + !LibUtils.isPostDeadline( ts.timestamp, local.b.lastUnpausedAt, local.tier.cooldownWindow - ) - ) { - revert L1_CANNOT_CONTEST(); - } + ), + L1_CANNOT_CONTEST() + ); // Burn the contest bond from the prover. LibBonds.debitBond( @@ -507,7 +498,7 @@ library LibProving { } } } else { - if (_local.sameTransition) revert L1_ALREADY_PROVED(); + require(!_local.sameTransition, L1_ALREADY_PROVED()); // The code below will be executed if 1) the transition is proved for the first time // or 2) the transition is contested. diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 62321d9132c..574de010bbc 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -37,7 +37,7 @@ library LibUtils { /// @param _state The state to initialize. /// @param _genesisBlockHash The block hash of the genesis block. function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) internal { - if (_genesisBlockHash == 0) revert L1_INVALID_GENESIS_HASH(); + require(_genesisBlockHash != 0, L1_INVALID_GENESIS_HASH()); // Init state _state.slotA.genesisHeight = uint64(block.number); _state.slotA.genesisTimestamp = uint64(block.timestamp); @@ -82,7 +82,7 @@ library LibUtils { { slot_ = _blockId % _config.blockRingBufferSize; blk_ = _state.blocks[slot_]; - if (blk_.blockId != _blockId) revert L1_INVALID_BLOCK_ID(); + require(blk_.blockId == _blockId, L1_INVALID_BLOCK_ID()); } /// @dev Retrieves a block's block hash and state root. @@ -132,7 +132,8 @@ library LibUtils { { (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); - if (_tid == 0 || _tid >= blk.nextTransitionId) revert L1_TRANSITION_NOT_FOUND(); + require(_tid != 0, L1_TRANSITION_NOT_FOUND()); + require(_tid < blk.nextTransitionId, L1_TRANSITION_NOT_FOUND()); return _state.transitions[slot][_tid]; } @@ -156,7 +157,7 @@ library LibUtils { (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); uint24 tid = getTransitionId(_state, blk, slot, _parentHash); - if (tid == 0) revert L1_TRANSITION_NOT_FOUND(); + require(tid != 0, L1_TRANSITION_NOT_FOUND()); return _state.transitions[slot][tid]; } @@ -178,9 +179,8 @@ library LibUtils { view returns (TaikoData.TransitionState[] memory transitions_) { - if (_blockIds.length == 0 || _blockIds.length != _parentHashes.length) { - revert L1_INVALID_PARAMS(); - } + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _parentHashes.length, L1_INVALID_PARAMS()); transitions_ = new TaikoData.TransitionState[](_blockIds.length); for (uint256 i; i < _blockIds.length; ++i) { (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockIds[i]); @@ -210,10 +210,10 @@ library LibUtils { { if (_state.transitions[_slot][1].key == _parentHash) { tid_ = 1; - if (tid_ >= _blk.nextTransitionId) revert L1_UNEXPECTED_TRANSITION_ID(); + require(tid_ < _blk.nextTransitionId, L1_UNEXPECTED_TRANSITION_ID()); } else { tid_ = _state.transitionIds[_blk.blockId][_parentHash]; - if (tid_ != 0 && tid_ >= _blk.nextTransitionId) revert L1_UNEXPECTED_TRANSITION_ID(); + require(tid_ == 0 || tid_ < _blk.nextTransitionId, L1_UNEXPECTED_TRANSITION_ID()); } } diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 407072c2f15..ff3637dde9d 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -53,13 +53,13 @@ library LibVerifying { local.slot = local.blockId % _config.blockRingBufferSize; TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; - if (blk.blockId != local.blockId) revert L1_BLOCK_MISMATCH(); + require(blk.blockId == local.blockId, L1_BLOCK_MISMATCH()); local.lastVerifiedTransitionId = blk.verifiedTransitionId; local.tid = local.lastVerifiedTransitionId; // The following scenario should never occur but is included as a precaution. - if (local.tid == 0) revert L1_TRANSITION_ID_ZERO(); + require(local.tid != 0, L1_TRANSITION_ID_ZERO()); // The `blockHash` variable represents the most recently trusted blockHash on L2. local.blockHash = _state.transitions[local.slot][local.tid].blockHash; @@ -76,7 +76,7 @@ library LibVerifying { local.slot = local.blockId % _config.blockRingBufferSize; blk = _state.blocks[local.slot]; - if (blk.blockId != local.blockId) revert L1_BLOCK_MISMATCH(); + require(blk.blockId == local.blockId, L1_BLOCK_MISMATCH()); local.tid = LibUtils.getTransitionId(_state, blk, local.slot, local.blockHash); // When `tid` is 0, it indicates that there is no proven transition with its diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 871aa363b8d..4adf649fb2f 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -28,7 +28,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { error L1_FORK_HEIGHT_ERROR(); modifier whenProvingNotPaused() { - if (state.slotB.provingPaused) revert LibProving.L1_PROVING_PAUSED(); + require(!state.slotB.provingPaused, LibProving.L1_PROVING_PAUSED()); _; } diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol index 128f6bf39bf..f49db7dfa20 100644 --- a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol @@ -35,9 +35,7 @@ contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { } modifier onlyCallableBy(address allowedSender) { - if (msg.sender != allowedSender) { - revert SenderIsNotAllowed(); - } + require(msg.sender == allowedSender, SenderIsNotAllowed()); _; } @@ -84,9 +82,7 @@ contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { nonReentrant onlyCallableBy(preconfTaskManager) { - if (slasher.isOperatorSlashed(operator)) { - revert OperatorAlreadySlashed(); - } + require(!slasher.isOperatorSlashed(operator), OperatorAlreadySlashed()); slasher.slashOperator(operator); } } diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol index 42d35e37288..e3ad403436f 100644 --- a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol @@ -47,9 +47,7 @@ contract PreconfRegistry is IPreconfRegistry, Initializable { */ function registerPreconfer(bytes calldata operatorSignature) external { // Preconfer must not have registered already - if (preconferToIndex[msg.sender] != 0) { - revert PreconferAlreadyRegistered(); - } + require(preconferToIndex[msg.sender] == 0, PreconferAlreadyRegistered()); uint256 _nextPreconferIndex = nextPreconferIndex; @@ -73,9 +71,7 @@ contract PreconfRegistry is IPreconfRegistry, Initializable { function deregisterPreconfer() external { // Preconfer must have registered already uint256 removedPreconferIndex = preconferToIndex[msg.sender]; - if (removedPreconferIndex == 0) { - revert PreconferNotRegistered(); - } + require(removedPreconferIndex != 0, PreconferNotRegistered()); // Remove the preconfer and exchange its index with the last preconfer preconferToIndex[msg.sender] = 0; @@ -108,9 +104,7 @@ contract PreconfRegistry is IPreconfRegistry, Initializable { function addValidators(AddValidatorParam[] calldata addValidatorParams) external { for (uint256 i; i < addValidatorParams.length; ++i) { // Revert if preconfer is not registered - if (preconferToIndex[msg.sender] == 0) { - revert PreconferNotRegistered(); - } + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); // Note: BLS signature checks are commented out for the POC @@ -133,21 +127,19 @@ contract PreconfRegistry is IPreconfRegistry, Initializable { // Update the validator if it has no preconfer assigned, or if it has stopped proposing // for the former preconfer - if ( + require( validator.preconfer == address(0) - || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt) - ) { - unchecked { - validators[pubKeyHash] = Validator({ - preconfer: msg.sender, - // The delay is crucial in order to not contradict the lookahead - startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), - stopProposingAt: uint40(0) - }); - } - } else { - // Validator is already proposing for a preconfer - revert ValidatorAlreadyActive(); + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt), + ValidatorAlreadyActive() + ); + + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); } emit ValidatorAdded(pubKeyHash, msg.sender); @@ -167,9 +159,8 @@ contract PreconfRegistry is IPreconfRegistry, Initializable { // Revert if the validator is not active (or already removed, but waiting to stop // proposing) - if (validator.preconfer == address(0) || validator.stopProposingAt != 0) { - revert ValidatorAlreadyInactive(); - } + require(validator.preconfer != address(0), ValidatorAlreadyInactive()); + require(validator.stopProposingAt == 0, ValidatorAlreadyInactive()); // Note: BLS signature checks have been commented out // Todo: It would be reasonable to remove BLS checks altogether for validator removals. diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol index ec3b6f075af..c44bede30c5 100644 --- a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol @@ -107,14 +107,9 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { // ------[Last slot with an entry]---[X]---[X]----[X]----[Preconfer]------- // ------[ prevTimestamp ]---[ ]---[ ]----[ ]----[timestamp]------- // - if ( - block.timestamp <= lookaheadEntry.prevTimestamp - || block.timestamp > lookaheadEntry.timestamp - ) { - revert InvalidLookaheadPointer(); - } else if (msg.sender != lookaheadEntry.preconfer) { - revert SenderIsNotThePreconfer(); - } + require(block.timestamp > lookaheadEntry.prevTimestamp, InvalidLookaheadPointer()); + require(block.timestamp <= lookaheadEntry.timestamp, InvalidLookaheadPointer()); + require(msg.sender == lookaheadEntry.preconfer, SenderIsNotThePreconfer()); uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; @@ -159,14 +154,13 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { address poster = getLookaheadPoster(epochTimestamp); // Poster must not have been slashed - if (poster == address(0)) { - revert PosterAlreadySlashedOrLookaheadIsEmpty(); - } + require(poster != address(0), PosterAlreadySlashedOrLookaheadIsEmpty()); // Must not have missed dispute period - if (block.timestamp - slotTimestamp > LibPreconfConstants.DISPUTE_PERIOD) { - revert MissedDisputeWindow(); - } + require( + block.timestamp <= slotTimestamp + LibPreconfConstants.DISPUTE_PERIOD, + MissedDisputeWindow() + ); // Verify that the sent validator is the one in Beacon state LibEIP4788.verifyValidator( @@ -176,12 +170,8 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); // Validate lookahead pointer - if ( - slotTimestamp > lookaheadEntry.timestamp - || slotTimestamp <= lookaheadEntry.prevTimestamp - ) { - revert InvalidLookaheadPointer(); - } + require(slotTimestamp <= lookaheadEntry.timestamp, InvalidLookaheadPointer()); + require(slotTimestamp > lookaheadEntry.prevTimestamp, InvalidLookaheadPointer()); // We pull the preconfer present at the required slot timestamp in the lookahead. // If no preconfer is present for a slot, we simply use the 0-address to denote the @@ -215,9 +205,7 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { // Revert if the lookahead preconfer matches the one that the validator pulled from beacon // state // is proposing for - if (preconferInLookahead == preconferInRegistry) { - revert LookaheadEntryIsCorrect(); - } + require(preconferInLookahead != preconferInRegistry, LookaheadEntryIsCorrect()); uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; @@ -287,16 +275,12 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { */ function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external { // Sender must be a preconfer - if (preconfRegistry.getPreconferIndex(msg.sender) == 0) { - revert PreconferNotRegistered(); - } + require(preconfRegistry.getPreconferIndex(msg.sender) != 0, PreconferNotRegistered()); // Lookahead must be missing uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; - if (!_isLookaheadRequired(epochTimestamp, nextEpochTimestamp)) { - revert LookaheadIsNotRequired(); - } + require(_isLookaheadRequired(epochTimestamp, nextEpochTimestamp), LookaheadIsNotRequired()); // Update the lookahead for next epoch _updateLookahead(nextEpochTimestamp, lookaheadSetParams); @@ -358,17 +342,12 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { uint256 slotTimestamp = lookaheadSetParams[i].timestamp; // Each entry must be registered in the preconf registry - if (preconfRegistry.getPreconferIndex(preconfer) == 0) { - revert PreconferNotRegistered(); - } + require(preconfRegistry.getPreconferIndex(preconfer) != 0, PreconferNotRegistered()); // Ensure that the timestamps belong to a valid slot in the epoch - if ( - (slotTimestamp - epochTimestamp) % 12 != 0 || slotTimestamp >= epochEndTimestamp - || slotTimestamp <= prevSlotTimestamp - ) { - revert InvalidSlotTimestamp(); - } + require((slotTimestamp - epochTimestamp) % 12 == 0, InvalidSlotTimestamp()); + require(slotTimestamp < epochEndTimestamp, InvalidSlotTimestamp()); + require(slotTimestamp > prevSlotTimestamp, InvalidSlotTimestamp()); // Update the lookahead entry _setLookaheadEntry( @@ -470,12 +449,11 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { } function _validateEpochTimestamp(uint256 epochTimestamp) internal view { - if ( - epochTimestamp < beaconGenesis - || (epochTimestamp - beaconGenesis) % LibPreconfConstants.SECONDS_IN_EPOCH != 0 - ) { - revert InvalidEpochTimestamp(); - } + require(epochTimestamp >= beaconGenesis, InvalidEpochTimestamp()); + require( + (epochTimestamp - beaconGenesis) % LibPreconfConstants.SECONDS_IN_EPOCH == 0, + InvalidEpochTimestamp() + ); } //======= @@ -490,9 +468,7 @@ contract PreconfTaskManager is IPreconfTaskManager, Initializable { uint256 nextPreconferIndex = preconfRegistry.getNextPreconferIndex(); // Registry must have at least one preconfer - if (nextPreconferIndex == 1) { - revert NoRegisteredPreconfer(); - } + require(nextPreconferIndex != 1, NoRegisteredPreconfer()); // Start of the last epoch uint256 lastEpochTimestamp = epochTimestamp - LibPreconfConstants.SECONDS_IN_EPOCH; diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol index 1b1c7a7c432..153cb582131 100644 --- a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol +++ b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol @@ -49,61 +49,50 @@ library LibEIP4788 { { // Validator's BLS public key is verified against the hash tree root within Validator chunks bytes32 pubKeyHashTreeRoot = sha256(abi.encodePacked(validatorBLSPubKey, bytes16(0))); - if (pubKeyHashTreeRoot != inclusionProof.validator[0]) { - revert InvalidValidatorBLSPubKey(); - } + require(pubKeyHashTreeRoot == inclusionProof.validator[0], InvalidValidatorBLSPubKey()); // Validator is verified against the validator list in the beacon state bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(inclusionProof.validator); - if ( - !LibMerkleUtils.verifyProof( + require( + LibMerkleUtils.verifyProof( inclusionProof.validatorProof, inclusionProof.validatorsRoot, validatorHashTreeRoot, inclusionProof.validatorIndex - ) - ) { - // Revert if the proof that the expected validator is a part of the validator - // list in beacon state fails - revert ValidatorProofFailed(); - } + ), + ValidatorProofFailed() + ); - if ( - !LibMerkleUtils.verifyProof( + require( + LibMerkleUtils.verifyProof( inclusionProof.beaconStateProof, inclusionProof.beaconStateRoot, inclusionProof.validatorsRoot, 11 - ) - ) { - // Revert if the proof that the validator list is a part of the beacon state fails - revert BeaconStateProofFailed(); - } + ), + BeaconStateProofFailed() + ); // Beacon state is verified against the beacon block - if ( - !LibMerkleUtils.verifyProof( + require( + LibMerkleUtils.verifyProof( inclusionProof.beaconBlockProofForState, beaconBlockRoot, inclusionProof.beaconStateRoot, 3 - ) - ) { - // Revert if the proof for the beacon state being a part of the beacon block fails - revert BeaconBlockProofForStateFailed(); - } + ), + BeaconBlockProofForStateFailed() + ); // Validator index is verified against the beacon block - if ( - !LibMerkleUtils.verifyProof( + require( + LibMerkleUtils.verifyProof( inclusionProof.beaconBlockProofForProposerIndex, beaconBlockRoot, LibMerkleUtils.toLittleEndian(inclusionProof.validatorIndex), 1 - ) - ) { - // Revert if the proof that the proposer index is a part of the beacon block fails - revert BeaconBlockProofForProposerIndex(); - } + ), + BeaconBlockProofForProposerIndex() + ); } } diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol index fd73adb3889..0bb360711ca 100644 --- a/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol +++ b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol @@ -43,9 +43,7 @@ contract MockPreconfRegistry is IPreconfRegistry, Initializable { */ function registerPreconfer(bytes calldata operatorSignature) external { // Preconfer must not have registered already - if (preconferToIndex[msg.sender] != 0) { - revert PreconferAlreadyRegistered(); - } + require(preconferToIndex[msg.sender] == 0, PreconferAlreadyRegistered()); uint256 _nextPreconferIndex = nextPreconferIndex; @@ -68,9 +66,7 @@ contract MockPreconfRegistry is IPreconfRegistry, Initializable { */ function deregisterPreconfer() external { // Preconfer must have registered already - if (preconferToIndex[msg.sender] == 0) { - revert PreconferNotRegistered(); - } + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); unchecked { uint256 _nextPreconferIndex = nextPreconferIndex - 1; @@ -101,9 +97,7 @@ contract MockPreconfRegistry is IPreconfRegistry, Initializable { function addValidators(AddValidatorParam[] calldata addValidatorParams) external { for (uint256 i; i < addValidatorParams.length; ++i) { // Revert if preconfer is not registered - if (preconferToIndex[msg.sender] == 0) { - revert PreconferNotRegistered(); - } + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); // bytes memory message = _createMessage(ValidatorOp.ADD, // addValidatorParams[i].signatureExpiry, msg.sender); @@ -115,9 +109,10 @@ contract MockPreconfRegistry is IPreconfRegistry, Initializable { //} // Revert if the signature has expired - if (block.timestamp > addValidatorParams[i].signatureExpiry) { - revert ValidatorSignatureExpired(); - } + require( + block.timestamp <= addValidatorParams[i].signatureExpiry, + ValidatorSignatureExpired() + ); // Point compress the public key just how it is done on the consensus layer uint256[2] memory compressedPubKey = addValidatorParams[i].pubkey.compress(); @@ -128,21 +123,19 @@ contract MockPreconfRegistry is IPreconfRegistry, Initializable { // Update the validator if it has no preconfer assigned, or if it has stopped proposing // for the former preconfer - if ( + require( validator.preconfer == address(0) - || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt) - ) { - unchecked { - validators[pubKeyHash] = Validator({ - preconfer: msg.sender, - // The delay is crucial in order to not contradict the lookahead - startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), - stopProposingAt: uint40(0) - }); - } - } else { - // Validator is already proposing for a preconfer - revert ValidatorAlreadyActive(); + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt), + ValidatorAlreadyActive() + ); + + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); } emit ValidatorAdded(pubKeyHash, msg.sender); @@ -166,27 +159,26 @@ contract MockPreconfRegistry is IPreconfRegistry, Initializable { // Revert if the validator is not active (or already removed, but waiting to stop // proposing) - if (validator.preconfer == address(0) || validator.stopProposingAt != 0) { - revert ValidatorAlreadyInactive(); - } + require(validator.preconfer != address(0), ValidatorAlreadyInactive()); + require(validator.stopProposingAt == 0, ValidatorAlreadyInactive()); bytes memory message = _createMessage( ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, validator.preconfer ); // Revert if any signature is invalid - if ( - !LibBLSSignature.verifySignature( + require( + LibBLSSignature.verifySignature( message, removeValidatorParams[i].signature, removeValidatorParams[i].pubkey - ) - ) { - revert InvalidValidatorSignature(); - } + ), + InvalidValidatorSignature() + ); // Revert if the signature has expired - if (block.timestamp > removeValidatorParams[i].signatureExpiry) { - revert ValidatorSignatureExpired(); - } + require( + block.timestamp <= removeValidatorParams[i].signatureExpiry, + ValidatorSignatureExpired() + ); unchecked { // We also need to delay the removal by two epochs to avoid contradicting the diff --git a/packages/protocol/contracts/layer1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol index da526d16770..5a8f136efa8 100644 --- a/packages/protocol/contracts/layer1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/layer1/provers/GuardianProver.sol @@ -110,14 +110,12 @@ contract GuardianProver is IVerifier, EssentialContract { onlyOwner { // We need at most 255 guardians (so the approval bits fit in a uint256) - if (_newGuardians.length == 0 || _newGuardians.length > type(uint8).max) { - revert GP_INVALID_GUARDIAN_SET(); - } + require(_newGuardians.length != 0, GP_INVALID_GUARDIAN_SET()); + require(_newGuardians.length <= type(uint8).max, GP_INVALID_GUARDIAN_SET()); // Minimum number of guardians to approve is at least equal or greater than half the // guardians (rounded up) and less or equal than the total number of guardians - if (_minGuardians == 0 || _minGuardians > _newGuardians.length) { - revert GP_INVALID_MIN_GUARDIANS(); - } + require(_minGuardians != 0, GP_INVALID_MIN_GUARDIANS()); + require(_minGuardians <= _newGuardians.length, GP_INVALID_MIN_GUARDIANS()); // Delete the current guardians for (uint256 i; i < guardians.length; ++i) { @@ -128,9 +126,9 @@ contract GuardianProver is IVerifier, EssentialContract { // Set the new guardians for (uint256 i; i < _newGuardians.length; ++i) { address guardian = _newGuardians[i]; - if (guardian == address(0)) revert GP_INVALID_GUARDIAN(); + require(guardian != address(0), GP_INVALID_GUARDIAN()); // This makes sure there are not duplicate addresses - if (guardianIds[guardian] != 0) revert GP_INVALID_GUARDIAN_SET(); + require(guardianIds[guardian] == 0, GP_INVALID_GUARDIAN_SET()); // Save and index the guardian guardians.push(guardian); @@ -147,7 +145,7 @@ contract GuardianProver is IVerifier, EssentialContract { /// @notice Enables or disables proving auto pause. /// @param _enable True to enable, false to disable. function enableProvingAutoPause(bool _enable) external onlyOwner { - if (provingAutoPauseEnabled == _enable) revert GP_INVALID_STATUS(); + require(provingAutoPauseEnabled != _enable, GP_INVALID_STATUS()); provingAutoPauseEnabled = _enable; emit ProvingAutoPauseEnabled(_enable); @@ -165,7 +163,7 @@ contract GuardianProver is IVerifier, EssentialContract { /// @param _to The recipient address. /// @param _amount The amount of Taiko token to withdraw. Use 0 for all balance. function withdrawTaikoToken(address _to, uint256 _amount) external onlyOwner { - if (_to == address(0)) revert GV_ZERO_ADDRESS(); + require(_to != address(0), GV_ZERO_ADDRESS()); IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); uint256 amount = _amount == 0 ? tko.balanceOf(address(this)) : _amount; @@ -198,11 +196,9 @@ contract GuardianProver is IVerifier, EssentialContract { /// @notice Pauses chain proving and verification. function pauseTaikoProving() external whenNotPaused { - if (guardianIds[msg.sender] == 0) revert GP_INVALID_GUARDIAN(); + require(guardianIds[msg.sender] != 0, GP_INVALID_GUARDIAN()); - if (address(this) != resolve(LibStrings.B_CHAIN_WATCHDOG, true)) { - revert GV_PERMISSION_DENIED(); - } + require(address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true), GV_PERMISSION_DENIED()); ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); } @@ -216,7 +212,7 @@ contract GuardianProver is IVerifier, EssentialContract { external view { - if (_ctx.msgSender != address(this)) revert GV_PERMISSION_DENIED(); + require(_ctx.msgSender == address(this), GV_PERMISSION_DENIED()); } /// @inheritdoc IVerifier @@ -228,7 +224,7 @@ contract GuardianProver is IVerifier, EssentialContract { view { for (uint256 i; i < _ctxs.length; ++i) { - if (_ctxs[i].msgSender != address(this)) revert GV_PERMISSION_DENIED(); + require(_ctxs[i].msgSender == address(this), GV_PERMISSION_DENIED()); } } @@ -299,7 +295,7 @@ contract GuardianProver is IVerifier, EssentialContract { returns (bool approved_) { uint256 id = guardianIds[msg.sender]; - if (id == 0) revert GP_INVALID_GUARDIAN(); + require(id != 0, GP_INVALID_GUARDIAN()); uint256 _version = version; diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol index 7de671f5a74..d78df93f2ff 100644 --- a/packages/protocol/contracts/layer1/provers/ProverSet.sol +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -32,14 +32,15 @@ contract ProverSet is EssentialContract, IERC1271 { error PERMISSION_DENIED(); modifier onlyAuthorized() { - if (msg.sender != admin && msg.sender != IHasRecipient(admin).recipient()) { - revert PERMISSION_DENIED(); - } + require( + msg.sender == admin || msg.sender == IHasRecipient(admin).recipient(), + PERMISSION_DENIED() + ); _; } modifier onlyProver() { - if (!isProver[msg.sender]) revert PERMISSION_DENIED(); + require(isProver[msg.sender], PERMISSION_DENIED()); _; } @@ -64,7 +65,7 @@ contract ProverSet is EssentialContract, IERC1271 { /// @notice Enables or disables a prover. function enableProver(address _prover, bool _isProver) external onlyAuthorized { - if (isProver[_prover] == _isProver) revert INVALID_STATUS(); + require(isProver[_prover] != _isProver, INVALID_STATUS()); isProver[_prover] = _isProver; emit ProverEnabled(_prover, _isProver); diff --git a/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol index 68a93df3ecd..2700c1cefe7 100644 --- a/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol @@ -62,9 +62,7 @@ contract Risc0Verifier is EssentialContract, IVerifier { // Decode will throw if not proper length/encoding (bytes memory seal, bytes32 imageId) = abi.decode(_proof.data, (bytes, bytes32)); - if (!isImageTrusted[imageId]) { - revert RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID(); - } + require(isImageTrusted[imageId], RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID()); bytes32 publicInputHash = LibPublicInput.hashPublicInputs( _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, taikoChainId() @@ -77,9 +75,7 @@ contract Risc0Verifier is EssentialContract, IVerifier { (bool success,) = resolve(LibStrings.B_RISCZERO_GROTH16_VERIFIER, false).staticcall( abi.encodeCall(IRiscZeroVerifier.verify, (seal, imageId, journalDigest)) ); - if (!success) { - revert RISC_ZERO_INVALID_PROOF(); - } + require(success, RISC_ZERO_INVALID_PROOF()); } /// @inheritdoc IVerifier @@ -94,13 +90,9 @@ contract Risc0Verifier is EssentialContract, IVerifier { abi.decode(_proof.data, (bytes, bytes32, bytes32)); // Check if the aggregation program is trusted - if (!isImageTrusted[aggregationImageId]) { - revert RISC_ZERO_INVALID_AGGREGATION_IMAGE_ID(); - } + require(isImageTrusted[aggregationImageId], RISC_ZERO_INVALID_AGGREGATION_IMAGE_ID()); // Check if the block proving program is trusted - if (!isImageTrusted[blockImageId]) { - revert RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID(); - } + require(isImageTrusted[blockImageId], RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID()); // Collect public inputs bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 1); @@ -126,9 +118,7 @@ contract Risc0Verifier is EssentialContract, IVerifier { (bool success,) = resolve(LibStrings.B_RISCZERO_GROTH16_VERIFIER, false).staticcall( abi.encodeCall(IRiscZeroVerifier.verify, (seal, aggregationImageId, journalDigest)) ); - if (!success) { - revert RISC_ZERO_INVALID_PROOF(); - } + require(success, RISC_ZERO_INVALID_PROOF()); } function taikoChainId() internal view virtual returns (uint64) { diff --git a/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol index 4583f79cc99..1044bec19b4 100644 --- a/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol @@ -106,7 +106,7 @@ contract SgxVerifier is EssentialContract, IVerifier { for (uint256 i; i < _ids.length; ++i) { uint256 idx = _ids[i]; - if (instances[idx].addr == address(0)) revert SGX_INVALID_INSTANCE(); + require(instances[idx].addr != address(0), SGX_INVALID_INSTANCE()); emit InstanceDeleted(idx, instances[idx].addr); @@ -123,13 +123,11 @@ contract SgxVerifier is EssentialContract, IVerifier { { address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); - if (automataDcapAttestation == address(0)) { - revert SGX_RA_NOT_SUPPORTED(); - } + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); - if (!verified) revert SGX_INVALID_ATTESTATION(); + require(verified, SGX_INVALID_ATTESTATION()); address[] memory addresses = new address[](1); addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); @@ -151,7 +149,7 @@ contract SgxVerifier is EssentialContract, IVerifier { // Size is: 89 bytes // 4 bytes + 20 bytes + 65 bytes (signature) = 89 - if (_proof.data.length != 89) revert SGX_INVALID_PROOF(); + require(_proof.data.length == 89, SGX_INVALID_PROOF()); uint32 id = uint32(bytes4(_proof.data[:4])); address newInstance = address(bytes20(_proof.data[4:24])); @@ -163,7 +161,7 @@ contract SgxVerifier is EssentialContract, IVerifier { _proof.data[24:] ); - if (!_isInstanceValid(id, oldInstance)) revert SGX_INVALID_INSTANCE(); + require(_isInstanceValid(id, oldInstance), SGX_INVALID_INSTANCE()); if (newInstance != oldInstance && newInstance != address(0)) { _replaceInstance(id, oldInstance, newInstance); @@ -180,7 +178,7 @@ contract SgxVerifier is EssentialContract, IVerifier { { // Size is: 109 bytes // 4 bytes + 20 bytes + 20 bytes + 65 bytes (signature) = 109 - if (_proof.data.length != 109) revert SGX_INVALID_PROOF(); + require(_proof.data.length == 109, SGX_INVALID_PROOF()); uint32 id = uint32(bytes4(_proof.data[:4])); address oldInstance = address(bytes20(_proof.data[4:24])); @@ -207,11 +205,9 @@ contract SgxVerifier is EssentialContract, IVerifier { bytes32 signatureHash = keccak256(abi.encodePacked(publicInputs)); // Verify the blocks - if (oldInstance != ECDSA.recover(signatureHash, signature)) { - revert SGX_INVALID_PROOF(); - } + require(oldInstance == ECDSA.recover(signatureHash, signature), SGX_INVALID_PROOF()); - if (!_isInstanceValid(id, oldInstance)) revert SGX_INVALID_INSTANCE(); + require(_isInstanceValid(id, oldInstance), SGX_INVALID_INSTANCE()); if (newInstance != oldInstance && newInstance != address(0)) { _replaceInstance(id, oldInstance, newInstance); @@ -238,11 +234,11 @@ contract SgxVerifier is EssentialContract, IVerifier { } for (uint256 i; i < _instances.length; ++i) { - if (addressRegistered[_instances[i]]) revert SGX_ALREADY_ATTESTED(); + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); addressRegistered[_instances[i]] = true; - if (_instances[i] == address(0)) revert SGX_INVALID_INSTANCE(); + require(_instances[i] != address(0), SGX_INVALID_INSTANCE()); instances[nextInstanceId] = Instance(_instances[i], validSince); ids[i] = nextInstanceId; @@ -261,8 +257,8 @@ contract SgxVerifier is EssentialContract, IVerifier { } function _isInstanceValid(uint256 id, address instance) private view returns (bool) { - if (instance == address(0)) return false; - if (instance != instances[id].addr) return false; + require(instance != address(0), SGX_INVALID_INSTANCE()); + require(instance == instances[id].addr, SGX_INVALID_INSTANCE()); return instances[id].validSince <= block.timestamp && block.timestamp <= instances[id].validSince + INSTANCE_EXPIRY; } diff --git a/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol index f3510a0484f..451d88604a3 100644 --- a/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol @@ -82,13 +82,11 @@ abstract contract SgxVerifierBase is EssentialContract { { address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); - if (automataDcapAttestation == address(0)) { - revert SGX_RA_NOT_SUPPORTED(); - } + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); - if (!verified) revert SGX_INVALID_ATTESTATION(); + require(verified, SGX_INVALID_ATTESTATION()); address[] memory addresses = new address[](1); addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); @@ -116,7 +114,7 @@ abstract contract SgxVerifierBase is EssentialContract { for (uint256 i; i < _ids.length; ++i) { uint256 idx = _ids[i]; - if (instances[idx].addr == address(0)) revert SGX_INVALID_INSTANCE(); + require(instances[idx].addr != address(0), SGX_INVALID_INSTANCE()); emit InstanceDeleted(idx, instances[idx].addr); @@ -140,11 +138,11 @@ abstract contract SgxVerifierBase is EssentialContract { } for (uint256 i; i < _instances.length; ++i) { - if (addressRegistered[_instances[i]]) revert SGX_ALREADY_ATTESTED(); + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); addressRegistered[_instances[i]] = true; - if (_instances[i] == address(0)) revert SGX_INVALID_INSTANCE(); + require(_instances[i] != address(0), SGX_INVALID_INSTANCE()); instances[nextInstanceId] = Instance(_instances[i], validSince); ids[i] = nextInstanceId; diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol index 50345be7a4c..da4d2ef4bda 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -25,7 +25,7 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { error CV_SUB_VERIFIER_NOT_FOUND(); modifier onlyAuthorizedCaller() { - if (!isCallerAuthorized(msg.sender)) revert CV_INVALID_CALLER(); + require(isCallerAuthorized(msg.sender), CV_INVALID_CALLER()); _; } @@ -49,10 +49,10 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); SubProof[] memory subProofs = abi.decode(_proof.data, (SubProof[])); - if (subProofs.length != numSubProofs_) revert CV_INVALID_SUBPROOF_LENGTH(); + require(subProofs.length == numSubProofs_, CV_INVALID_SUBPROOF_LENGTH()); for (uint256 i; i < subProofs.length; ++i) { - if (subProofs[i].verifier == address(0)) revert CV_INVALID_SUB_VERIFIER(); + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); // find the verifier bool verifierFound; @@ -63,7 +63,7 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { } } - if (!verifierFound) revert CV_SUB_VERIFIER_NOT_FOUND(); + require(verifierFound, CV_SUB_VERIFIER_NOT_FOUND()); IVerifier(subProofs[i].verifier).verifyProof( _ctx, _tran, TaikoData.TierProof(_proof.tier, subProofs[i].proof) @@ -83,10 +83,10 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); SubProof[] memory subProofs = abi.decode(_proof.data, (SubProof[])); - if (subProofs.length != numSubProofs_) revert CV_INVALID_SUBPROOF_LENGTH(); + require(subProofs.length == numSubProofs_, CV_INVALID_SUBPROOF_LENGTH()); for (uint256 i; i < subProofs.length; ++i) { - if (subProofs[i].verifier == address(0)) revert CV_INVALID_SUB_VERIFIER(); + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); // find the verifier bool verifierFound; @@ -97,7 +97,7 @@ abstract contract ComposeVerifier is EssentialContract, IVerifier { } } - if (!verifierFound) revert CV_SUB_VERIFIER_NOT_FOUND(); + require(verifierFound, CV_SUB_VERIFIER_NOT_FOUND()); IVerifier(subProofs[i].verifier).verifyBatchProof( _ctxs, TaikoData.TierProof(_proof.tier, subProofs[i].proof) diff --git a/packages/protocol/contracts/shared/common/AddressManager.sol b/packages/protocol/contracts/shared/common/AddressManager.sol index 0fe5dddc5c7..ac0ab0ae7ea 100644 --- a/packages/protocol/contracts/shared/common/AddressManager.sol +++ b/packages/protocol/contracts/shared/common/AddressManager.sol @@ -48,7 +48,7 @@ contract AddressManager is EssentialContract, IAddressManager { onlyOwner { address oldAddress = __addresses[_chainId][_name]; - if (_newAddress == oldAddress) revert AM_ADDRESS_ALREADY_SET(); + require(_newAddress != oldAddress, AM_ADDRESS_ALREADY_SET()); __addresses[_chainId][_name] = _newAddress; emit AddressSet(_chainId, _name, _newAddress, oldAddress); } diff --git a/packages/protocol/contracts/shared/common/AddressResolver.sol b/packages/protocol/contracts/shared/common/AddressResolver.sol index d00705f9255..ebfaec3a8be 100644 --- a/packages/protocol/contracts/shared/common/AddressResolver.sol +++ b/packages/protocol/contracts/shared/common/AddressResolver.sol @@ -22,7 +22,7 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// name. /// @param _name The name to check against. modifier onlyFromNamed(bytes32 _name) { - if (msg.sender != resolve(_name, true)) revert RESOLVER_DENIED(); + require(msg.sender == resolve(_name, true), RESOLVER_DENIED()); _; } @@ -31,7 +31,7 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @param _name The name to check against. modifier onlyFromOptionalNamed(bytes32 _name) { address addr = resolve(_name, true); - if (addr != address(0) && msg.sender != addr) revert RESOLVER_DENIED(); + require(addr == address(0) || msg.sender == addr, RESOLVER_DENIED()); _; } @@ -40,9 +40,10 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @param _name1 The first name to check against. /// @param _name2 The second name to check against. modifier onlyFromNamedEither(bytes32 _name1, bytes32 _name2) { - if (msg.sender != resolve(_name1, true) && msg.sender != resolve(_name2, true)) { - revert RESOLVER_DENIED(); - } + require( + msg.sender == resolve(_name1, true) || msg.sender == resolve(_name2, true), + RESOLVER_DENIED() + ); _; } @@ -73,9 +74,8 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @dev Initialization method for setting up AddressManager reference. /// @param _addressManager Address of the AddressManager. function __AddressResolver_init(address _addressManager) internal virtual onlyInitializing { - if (block.chainid > type(uint64).max) { - revert RESOLVER_UNEXPECTED_CHAINID(); - } + require(block.chainid <= type(uint64).max, RESOLVER_UNEXPECTED_CHAINID()); + addressManager = _addressManager; } @@ -97,14 +97,12 @@ abstract contract AddressResolver is IAddressResolver, Initializable { { addr_ = _getAddress(_chainId, _name); - if (!_allowZeroAddress && addr_ == address(0)) { - revert RESOLVER_ZERO_ADDR(_chainId, _name); - } + require(_allowZeroAddress || addr_ != address(0), RESOLVER_ZERO_ADDR(_chainId, _name)); } function _getAddress(uint64 _chainId, bytes32 _name) internal view virtual returns (address) { address _addressManager = addressManager; - if (_addressManager == address(0)) revert RESOLVER_INVALID_MANAGER(); + require(_addressManager != address(0), RESOLVER_INVALID_MANAGER()); return IAddressManager(_addressManager).getAddress(_chainId, _name); } diff --git a/packages/protocol/contracts/shared/common/EssentialContract.sol b/packages/protocol/contracts/shared/common/EssentialContract.sol index 5c271ad2623..654393b21e7 100644 --- a/packages/protocol/contracts/shared/common/EssentialContract.sol +++ b/packages/protocol/contracts/shared/common/EssentialContract.sol @@ -35,7 +35,7 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, /// @dev Modifier that ensures the caller is the owner or resolved address of a given name. /// @param _name The name to check against. modifier onlyFromOwnerOrNamed(bytes32 _name) { - if (msg.sender != owner() && msg.sender != resolve(_name, true)) revert RESOLVER_DENIED(); + require(msg.sender == owner() || msg.sender == resolve(_name, true), RESOLVER_DENIED()); _; } @@ -45,29 +45,29 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, } modifier nonReentrant() { - if (_loadReentryLock() == _TRUE) revert REENTRANT_CALL(); + require(_loadReentryLock() != _TRUE, REENTRANT_CALL()); _storeReentryLock(_TRUE); _; _storeReentryLock(_FALSE); } modifier whenPaused() { - if (!paused()) revert INVALID_PAUSE_STATUS(); + require(paused(), INVALID_PAUSE_STATUS()); _; } modifier whenNotPaused() { - if (paused()) revert INVALID_PAUSE_STATUS(); + require(!paused(), INVALID_PAUSE_STATUS()); _; } modifier nonZeroAddr(address _addr) { - if (_addr == address(0)) revert ZERO_ADDRESS(); + require(_addr != address(0), ZERO_ADDRESS()); _; } modifier nonZeroValue(uint256 _value) { - if (_value == 0) revert ZERO_VALUE(); + require(_value != 0, ZERO_VALUE()); _; } diff --git a/packages/protocol/contracts/shared/common/LibAddress.sol b/packages/protocol/contracts/shared/common/LibAddress.sol index 6e14eddfff7..5bc0cd324ae 100644 --- a/packages/protocol/contracts/shared/common/LibAddress.sol +++ b/packages/protocol/contracts/shared/common/LibAddress.sol @@ -27,7 +27,7 @@ library LibAddress { returns (bool success_) { // Check for zero-address transactions - if (_to == address(0)) revert ETH_TRANSFER_FAILED(); + require(_to != address(0), ETH_TRANSFER_FAILED()); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata @@ -52,9 +52,7 @@ library LibAddress { /// @param _gasLimit The max amount gas to pay for this transaction. function sendEtherAndVerify(address _to, uint256 _amount, uint256 _gasLimit) internal { if (_amount == 0) return; - if (!sendEther(_to, _amount, _gasLimit, "")) { - revert ETH_TRANSFER_FAILED(); - } + require(sendEther(_to, _amount, _gasLimit, ""), ETH_TRANSFER_FAILED()); } /// @dev Sends Ether to the specified address. This method will revert if sending ether fails. diff --git a/packages/protocol/contracts/shared/common/LibBytes.sol b/packages/protocol/contracts/shared/common/LibBytes.sol index e8818321561..39c0bf442fb 100644 --- a/packages/protocol/contracts/shared/common/LibBytes.sol +++ b/packages/protocol/contracts/shared/common/LibBytes.sol @@ -34,7 +34,7 @@ library LibBytes { function revertWithExtractedError(bytes memory _returnData) internal pure { // If the _res length is less than 68, then // the transaction failed with custom error or silently (without a revert message) - if (_returnData.length < 68) revert INNER_ERROR(_returnData); + require(_returnData.length >= 68, INNER_ERROR(_returnData)); assembly { // Slice the sighash. diff --git a/packages/protocol/contracts/shared/common/LibTrieProof.sol b/packages/protocol/contracts/shared/common/LibTrieProof.sol index bb3cc7e0d9e..d65e7c4f9ec 100644 --- a/packages/protocol/contracts/shared/common/LibTrieProof.sol +++ b/packages/protocol/contracts/shared/common/LibTrieProof.sol @@ -47,7 +47,7 @@ library LibTrieProof { bytes memory rlpAccount = SecureMerkleTrie.get(abi.encodePacked(_addr), _accountProof, _rootHash); - if (rlpAccount.length == 0) revert LTP_INVALID_ACCOUNT_PROOF(); + require(rlpAccount.length != 0, LTP_INVALID_ACCOUNT_PROOF()); RLPReader.RLPItem[] memory accountState = RLPReader.readList(rlpAccount); @@ -61,6 +61,6 @@ library LibTrieProof { bytes.concat(_slot), RLPWriter.writeUint(uint256(_value)), _storageProof, storageRoot_ ); - if (!verified) revert LTP_INVALID_INCLUSION_PROOF(); + require(verified, LTP_INVALID_INCLUSION_PROOF()); } } From 6b03929ae41f15c3a36b514cec3f8e91e64e8fab Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 30 Oct 2024 11:34:34 +0800 Subject: [PATCH 30/38] Update LibData.sol --- packages/protocol/contracts/layer1/based/LibData.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol index f4f46b09b98..2e67cf87a24 100644 --- a/packages/protocol/contracts/layer1/based/LibData.sol +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -21,8 +21,8 @@ library LibData { assignedProver: address(0), // assigned prover is now meta.proposer. livenessBond: 0, // liveness bond is now meta.livenessBond blockId: _v2.blockId, - proposedAt: _v2.proposedAt, - proposedIn: _v2.proposedIn, + proposedAt: 0, + proposedIn: 0, nextTransitionId: _v2.nextTransitionId, verifiedTransitionId: _v2.verifiedTransitionId }); From 93d7f246c7cee6ce16f91f5858799f8690e6d585 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 30 Oct 2024 14:36:23 +0800 Subject: [PATCH 31/38] feat(protocol): change devnet `ontakeForkHeight` to `0` after cleanup --- packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol b/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol index c256e1500a0..f5f7ce2b21b 100644 --- a/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol +++ b/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol @@ -25,7 +25,7 @@ contract DevnetTaikoL1 is TaikoL1 { minGasExcess: 1_340_000_000, maxGasIssuancePerBlock: 600_000_000 }), - ontakeForkHeight: 2 + ontakeForkHeight: 0 }); } } From 6b453ce24b7b9dfc46529e69df2070297e7a565e Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 30 Oct 2024 15:04:53 +0800 Subject: [PATCH 32/38] restore maxBlocksToVerifyPerProof --- .../protocol/contracts/layer1/tiers/ITierProvider.sol | 1 + .../protocol/contracts/layer1/tiers/TierProviderBase.sol | 2 +- packages/protocol/test/layer1/based/TestTierRouter.sol | 9 ++++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/protocol/contracts/layer1/tiers/ITierProvider.sol b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol index ca0f540e6cf..1e74dbcf25d 100644 --- a/packages/protocol/contracts/layer1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol @@ -11,6 +11,7 @@ interface ITierProvider { uint96 contestBond; uint24 cooldownWindow; // in minutes uint16 provingWindow; // in minutes + uint8 maxBlocksToVerifyPerProof; // DEPRECATED } error TIER_NOT_FOUND(); diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol index facaf1392c3..86c734b0702 100644 --- a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -98,7 +98,7 @@ abstract contract TierProviderBase is ITierProvider { contestBond: _validityBond / 10_000 * 65_625, cooldownWindow: _cooldownWindow * 60, provingWindow: GRACE_PERIOD + _provingWindow, - maxBlocksToVerifyPerProof: 0 + maxBlocksToVerifyPerProof: 0 // DEPRECATED }); } } diff --git a/packages/protocol/test/layer1/based/TestTierRouter.sol b/packages/protocol/test/layer1/based/TestTierRouter.sol index e581eabebff..833d259f639 100644 --- a/packages/protocol/test/layer1/based/TestTierRouter.sol +++ b/packages/protocol/test/layer1/based/TestTierRouter.sol @@ -25,7 +25,8 @@ contract TestTierRouter is ITierProvider, ITierRouter { validityBond: 250 ether, // TKO contestBond: 500 ether, // TKO cooldownWindow: 1440, //24 hours - provingWindow: 30 // 0.5 hours + provingWindow: 30, // 0.5 hours + maxBlocksToVerifyPerProof: 0 // DEPRECATED }); } @@ -35,7 +36,8 @@ contract TestTierRouter is ITierProvider, ITierRouter { validityBond: 250 ether, // TKO contestBond: 1640 ether, // =250TKO * 6.5625 cooldownWindow: 1440, //24 hours - provingWindow: 60 // 1 hours + provingWindow: 60, // 1 hours + maxBlocksToVerifyPerProof: 0 // DEPRECATED }); } @@ -45,7 +47,8 @@ contract TestTierRouter is ITierProvider, ITierRouter { validityBond: 0, // must be 0 for top tier contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours - provingWindow: 2880 // 48 hours + provingWindow: 2880, // 48 hours + maxBlocksToVerifyPerProof: 0 // DEPRECATED }); } From 502d87dd7b8a8a5de2ce541e47d292b323cac31b Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 30 Oct 2024 15:06:08 +0800 Subject: [PATCH 33/38] Update TierProviderBase.sol --- packages/protocol/contracts/layer1/tiers/TierProviderBase.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol index 86c734b0702..be95b4db39c 100644 --- a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -99,6 +99,6 @@ abstract contract TierProviderBase is ITierProvider { cooldownWindow: _cooldownWindow * 60, provingWindow: GRACE_PERIOD + _provingWindow, maxBlocksToVerifyPerProof: 0 // DEPRECATED - }); + }); } } From c8599fabd093e6cfb33644a3eb958d8a57d8ffab Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 30 Oct 2024 17:42:41 +0800 Subject: [PATCH 34/38] Update LibEIP1559.sol --- packages/protocol/contracts/layer2/based/LibEIP1559.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/layer2/based/LibEIP1559.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol index f0b7a939a34..8ff9d16a4e1 100644 --- a/packages/protocol/contracts/layer2/based/LibEIP1559.sol +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -42,7 +42,7 @@ library LibEIP1559 { } /// @dev Returns the new gas excess that will keep the basefee the same. - /// `_newGasTarget * ln(_newGasTarget / _target) + _gasExcess * _newGasTarget / _target` + /// `_newGasTarget * ln(_newGasTarget / _gasTarget) + _gasExcess * _newGasTarget / _gasTarget` function adjustExcess( uint64 _gasExcess, uint64 _gasTarget, @@ -53,7 +53,7 @@ library LibEIP1559 { returns (uint64) { if (_gasTarget == 0) { - return _newGasTarget; + return _gasExcess; } uint256 f = FixedPointMathLib.WAD; From 46e3e768df5632d7cfd8923cad468f5821333ff1 Mon Sep 17 00:00:00 2001 From: Gavin Yu Date: Thu, 31 Oct 2024 14:46:54 +0800 Subject: [PATCH 35/38] chore(protocol): update base `ontakeForkHeight` to 0 (#18354) Co-authored-by: YoGhurt111 --- packages/protocol/contracts/layer1/based/TaikoL1.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 4adf649fb2f..7d7aa04faa9 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -304,8 +304,8 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { minGasExcess: 1_340_000_000, maxGasIssuancePerBlock: 600_000_000 // two minutes }), - ontakeForkHeight: 374_400 // = 7200 * 52 - }); + ontakeForkHeight: 0 + }); } /// @dev chain watchdog is supposed to be a cold wallet. From 693b23475258ab561a90a0fd289a43fb7502e07b Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Fri, 1 Nov 2024 19:38:03 +0800 Subject: [PATCH 36/38] Update LibEIP1559.sol --- packages/protocol/contracts/layer2/based/LibEIP1559.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/layer2/based/LibEIP1559.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol index 8ff9d16a4e1..14dca051fb0 100644 --- a/packages/protocol/contracts/layer2/based/LibEIP1559.sol +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -53,7 +53,7 @@ library LibEIP1559 { returns (uint64) { if (_gasTarget == 0) { - return _gasExcess; + return _newGasTarget; } uint256 f = FixedPointMathLib.WAD; From 9a3c5ab1027d0b88ae1a27083b6a092e8052d997 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 2 Nov 2024 10:02:14 +0800 Subject: [PATCH 37/38] correct comments about verifiedAt --- packages/protocol/contracts/layer1/based/LibUtils.sol | 2 +- packages/protocol/contracts/layer1/based/TaikoL1.sol | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 574de010bbc..3a0b32e0864 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -91,7 +91,7 @@ library LibUtils { /// @param _blockId Id of the block. /// @return blockHash_ The block's block hash. /// @return stateRoot_ The block's storage root. - /// @return verifiedAt_ The timestamp when the block was verified. + /// @return verifiedAt_ The timestamp when the block was proven at. function getBlockInfo( TaikoData.State storage _state, TaikoData.Config memory _config, diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index 7d7aa04faa9..a00a3d98494 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -244,7 +244,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { /// @return blockId_ The last verified block's ID. /// @return blockHash_ The last verified block's blockHash. /// @return stateRoot_ The last verified block's stateRoot. - /// @return verifiedAt_ The timestamp this block is verified at. + /// @return verifiedAt_ The timestamp this block is proven at. function getLastVerifiedBlock() external view @@ -258,7 +258,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { /// @return blockId_ The last verified block's ID. /// @return blockHash_ The last verified block's blockHash. /// @return stateRoot_ The last verified block's stateRoot. - /// @return verifiedAt_ The timestamp this block is verified at. + /// @return verifiedAt_ The timestamp this block is proven at. function getLastSyncedBlock() external view From a76f2ccab6c53a0313c44e5ba529029027e12cad Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 3 Nov 2024 13:44:07 +0800 Subject: [PATCH 38/38] change TaikoL1's library function visibility --- .../contracts/layer1/based/LibBonds.sol | 34 ++--- .../contracts/layer1/based/LibData.sol | 2 +- .../contracts/layer1/based/LibProposing.sol | 4 +- .../contracts/layer1/based/LibProving.sol | 6 +- .../contracts/layer1/based/LibUtils.sol | 116 +++++++++--------- .../contracts/layer1/based/LibVerifying.sol | 2 +- .../contracts/layer1/based/TaikoL1.sol | 7 +- .../mainnet/rollup/MainnetTierRouter.sol | 11 +- 8 files changed, 95 insertions(+), 87 deletions(-) diff --git a/packages/protocol/contracts/layer1/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol index a793b93dac9..1f06b0485a6 100644 --- a/packages/protocol/contracts/layer1/based/LibBonds.sol +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -42,7 +42,7 @@ library LibBonds { IAddressResolver _resolver, uint256 _amount ) - internal + public { emit BondDeposited(msg.sender, _amount); _state.bondBalance[msg.sender] += _amount; @@ -58,13 +58,28 @@ library LibBonds { IAddressResolver _resolver, uint256 _amount ) - internal + public { emit BondWithdrawn(msg.sender, _amount); _state.bondBalance[msg.sender] -= _amount; _tko(_resolver).transfer(msg.sender, _amount); } + /// @dev Gets a user's current TAIKO token bond balance. + /// @param _state The current state of TaikoData. + /// @param _user The address of the user. + /// @return The current token balance. + function bondBalanceOf( + TaikoData.State storage _state, + address _user + ) + public + view + returns (uint256) + { + return _state.bondBalance[_user]; + } + /// @dev Debits TAIKO tokens as bonds. /// @param _state The current state of TaikoData. /// @param _resolver The address resolver interface. @@ -114,21 +129,6 @@ library LibBonds { emit BondCredited(_user, _blockId, _amount); } - /// @dev Gets a user's current TAIKO token bond balance. - /// @param _state The current state of TaikoData. - /// @param _user The address of the user. - /// @return The current token balance. - function bondBalanceOf( - TaikoData.State storage _state, - address _user - ) - internal - view - returns (uint256) - { - return _state.bondBalance[_user]; - } - /// @dev Resolves the TAIKO token address using the address resolver. /// @param _resolver The address resolver interface. /// @return tko_ The IERC20 interface of the TAIKO token. diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol index 2e67cf87a24..c6881f67a49 100644 --- a/packages/protocol/contracts/layer1/based/LibData.sol +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -12,7 +12,7 @@ library LibData { /// @param _v2 The BlockV2 struct to convert. /// @return The converted Block struct. function blockV2ToV1(TaikoData.BlockV2 memory _v2) - internal + public pure returns (TaikoData.Block memory) { diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index dfe75709e6a..27a2424fe91 100644 --- a/packages/protocol/contracts/layer1/based/LibProposing.sol +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -59,7 +59,7 @@ library LibProposing { bytes[] calldata _paramsArr, bytes[] calldata _txListArr ) - public + internal returns (TaikoData.BlockMetadataV2[] memory metas_) { if (_paramsArr.length == 0 || _paramsArr.length != _txListArr.length) { @@ -95,7 +95,7 @@ library LibProposing { bytes calldata _params, bytes calldata _txList ) - public + internal returns (TaikoData.BlockMetadataV2 memory meta_) { meta_ = _proposeBlock(_state, _config, _resolver, _params, _txList); diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol index 431fa4e770c..c455434ae31 100644 --- a/packages/protocol/contracts/layer1/based/LibProving.sol +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -82,7 +82,7 @@ library LibProving { /// @dev Pauses or unpauses the proving process. /// @param _state Current TaikoData.State. /// @param _pause The pause status. - function pauseProving(TaikoData.State storage _state, bool _pause) internal { + function pauseProving(TaikoData.State storage _state, bool _pause) public { require(_state.slotB.provingPaused != _pause, L1_INVALID_PAUSE_STATUS()); _state.slotB.provingPaused = _pause; @@ -110,7 +110,7 @@ library LibProving { bytes[] calldata _inputs, bytes calldata _batchProof ) - public + public // Will reach contract size limit if changed to `internal` { require(_blockIds.length != 0, L1_INVALID_PARAMS()); require(_blockIds.length == _inputs.length, L1_INVALID_PARAMS()); @@ -166,7 +166,7 @@ library LibProving { uint64 _blockId, bytes calldata _input ) - public + public // Will reach contract size limit if changed to `internal` { TaikoData.TierProof memory noBatchProof; _proveBlock(_state, _config, _resolver, _blockId, _input, noBatchProof); diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol index 3a0b32e0864..535f07cedb5 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -36,7 +36,7 @@ library LibUtils { /// @dev Initializes the Taiko protocol state. /// @param _state The state to initialize. /// @param _genesisBlockHash The block hash of the genesis block. - function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) internal { + function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) public { require(_genesisBlockHash != 0, L1_INVALID_GENESIS_HASH()); // Init state _state.slotA.genesisHeight = uint64(block.number); @@ -65,26 +65,6 @@ library LibUtils { }); } - /// @dev Retrieves a block based on its ID. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - /// @return blk_ The block storage pointer. - /// @return slot_ The slot value. - function getBlock( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId - ) - internal - view - returns (TaikoData.BlockV2 storage blk_, uint64 slot_) - { - slot_ = _blockId % _config.blockRingBufferSize; - blk_ = _state.blocks[slot_]; - require(blk_.blockId == _blockId, L1_INVALID_BLOCK_ID()); - } - /// @dev Retrieves a block's block hash and state root. /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. @@ -97,7 +77,7 @@ library LibUtils { TaikoData.Config memory _config, uint64 _blockId ) - internal + public view returns (bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) { @@ -113,28 +93,33 @@ library LibUtils { } } - /// @dev Retrieves the transition with a transition ID. - /// @dev This function will revert if the transition is not found. + /// @dev Gets the state transitions for a batch of block. For transition that doesn't exist, the + /// corresponding transition state will be empty. /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - /// @param _tid The transition id. - /// @return The state transition pointer. - function getTransition( + /// @param _blockIds Id array of the blocks. + /// @param _parentHashes Parent hashes of the blocks. + /// @return transitions_ The state transition pointer array. + function getTransitions( TaikoData.State storage _state, TaikoData.Config memory _config, - uint64 _blockId, - uint24 _tid + uint64[] calldata _blockIds, + bytes32[] calldata _parentHashes ) - internal + public view - returns (TaikoData.TransitionState storage) + returns (TaikoData.TransitionState[] memory transitions_) { - (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); - - require(_tid != 0, L1_TRANSITION_NOT_FOUND()); - require(_tid < blk.nextTransitionId, L1_TRANSITION_NOT_FOUND()); - return _state.transitions[slot][_tid]; + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _parentHashes.length, L1_INVALID_PARAMS()); + transitions_ = new TaikoData.TransitionState[](_blockIds.length); + for (uint256 i; i < _blockIds.length; ++i) { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockIds[i]); + uint24 tid = getTransitionId(_state, blk, slot, _parentHashes[i]); + if (tid != 0) { + transitions_[i] = _state.transitions[slot][tid]; + } + } } /// @dev Retrieves the transition with a given parentHash. @@ -144,13 +129,13 @@ library LibUtils { /// @param _blockId Id of the block. /// @param _parentHash Parent hash of the block. /// @return The state transition pointer. - function getTransition( + function getTransitionByParentHash( TaikoData.State storage _state, TaikoData.Config memory _config, uint64 _blockId, bytes32 _parentHash ) - internal + public view returns (TaikoData.TransitionState storage) { @@ -162,33 +147,48 @@ library LibUtils { return _state.transitions[slot][tid]; } - /// @dev Gets the state transitions for a batch of block. For transition that doesn't exist, the - /// corresponding transition state will be empty. + /// @dev Retrieves a block based on its ID. /// @param _state Current TaikoData.State. /// @param _config Actual TaikoData.Config. - /// @param _blockIds Id array of the blocks. - /// @param _parentHashes Parent hashes of the blocks. - /// @return transitions_ The state transition pointer array. - function getTransitions( + /// @param _blockId Id of the block. + /// @return blk_ The block storage pointer. + /// @return slot_ The slot value. + function getBlock( TaikoData.State storage _state, TaikoData.Config memory _config, - uint64[] calldata _blockIds, - bytes32[] calldata _parentHashes + uint64 _blockId ) internal view - returns (TaikoData.TransitionState[] memory transitions_) + returns (TaikoData.BlockV2 storage blk_, uint64 slot_) { - require(_blockIds.length != 0, L1_INVALID_PARAMS()); - require(_blockIds.length == _parentHashes.length, L1_INVALID_PARAMS()); - transitions_ = new TaikoData.TransitionState[](_blockIds.length); - for (uint256 i; i < _blockIds.length; ++i) { - (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockIds[i]); - uint24 tid = getTransitionId(_state, blk, slot, _parentHashes[i]); - if (tid != 0) { - transitions_[i] = _state.transitions[slot][tid]; - } - } + slot_ = _blockId % _config.blockRingBufferSize; + blk_ = _state.blocks[slot_]; + require(blk_.blockId == _blockId, L1_INVALID_BLOCK_ID()); + } + + /// @dev Retrieves the transition with a transition ID. + /// @dev This function will revert if the transition is not found. + /// @param _state Current TaikoData.State. + /// @param _config Actual TaikoData.Config. + /// @param _blockId Id of the block. + /// @param _tid The transition id. + /// @return The state transition pointer. + function getTransitionById( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId, + uint24 _tid + ) + internal + view + returns (TaikoData.TransitionState storage) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + require(_tid != 0, L1_TRANSITION_NOT_FOUND()); + require(_tid < blk.nextTransitionId, L1_TRANSITION_NOT_FOUND()); + return _state.transitions[slot][_tid]; } /// @dev Retrieves the ID of the transition with a given parentHash. This function will return 0 diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 410e97ef1bb..e0d72d02ec8 100644 --- a/packages/protocol/contracts/layer1/based/LibVerifying.sol +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -193,6 +193,6 @@ library LibVerifying { uint24 tid = blk.verifiedTransitionId; if (tid == 0) return address(0); - return LibUtils.getTransition(_state, _config, _blockId, tid).prover; + return LibUtils.getTransitionById(_state, _config, _blockId, tid).prover; } } diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol index a00a3d98494..a9c1e5054bb 100644 --- a/packages/protocol/contracts/layer1/based/TaikoL1.sol +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -207,7 +207,7 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { view returns (TaikoData.TransitionState memory) { - return LibUtils.getTransition(state, getConfig(), _blockId, _parentHash); + return LibUtils.getTransitionByParentHash(state, getConfig(), _blockId, _parentHash); } /// @notice Gets the state transitions for a batch of block. For transition that doesn't exist, @@ -236,8 +236,9 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { view returns (TaikoData.TransitionState memory) { - return - LibUtils.getTransition(state, getConfig(), _blockId, SafeCastUpgradeable.toUint24(_tid)); + return LibUtils.getTransitionById( + state, getConfig(), _blockId, SafeCastUpgradeable.toUint24(_tid) + ); } /// @notice Returns information about the last verified block. diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol index 6b1054829fa..fae1617ed0d 100644 --- a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol @@ -31,8 +31,15 @@ contract MainnetTierRouter is ITierRouter, TierProviderBase { } /// @inheritdoc ITierProvider - // solhint-disable-next-line no-unused-vars - function getMinTier(address _proposer, uint256 _rand) public view override returns (uint16) { + function getMinTier( + address, /*_proposer*/ + uint256 /*_rand*/ + ) + public + pure + override + returns (uint16) + { return LibTiers.TIER_SGX; } }