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/.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/.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/contract_layout_layer1.md b/packages/protocol/contract_layout_layer1.md index b8a329cd8ef..299e675c91e 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,90 +493,90 @@ | __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 | ## 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 | ## HeklaTierRouter | 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 | @@ -592,7 +592,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 | @@ -615,7 +615,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 | @@ -639,7 +639,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 | @@ -648,23 +648,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 | @@ -692,7 +692,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 | @@ -713,86 +713,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 | @@ -808,7 +808,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 | @@ -820,108 +820,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 | @@ -937,7 +937,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/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol index 1d6517ec013..9ea3977ecdd 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 - /// select the right implementation version. - /// @param _input An abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// @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; @@ -61,14 +48,27 @@ 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. + 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. @@ -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 @@ -86,19 +87,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 token. - /// @param _amount The amount of Taiko token to withdraw. - function withdrawBond(uint256 _amount) external; - - /// @notice Gets the prover that actually proved a verified block. - /// @param _blockId The 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/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol index f8b321ce442..1f06b0485a6 100644 --- a/packages/protocol/contracts/layer1/based/LibBonds.sol +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -11,91 +11,127 @@ 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 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 token is debited from a user's bond balance. - event BondDebited(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 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 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. + /// @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 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, uint256 _amount ) - internal + public { + emit BondDeposited(msg.sender, _amount); _state.bondBalance[msg.sender] += _amount; _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, uint256 _amount ) - internal + public { + emit BondWithdrawn(msg.sender, _amount); _state.bondBalance[msg.sender] -= _amount; _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 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. + /// @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 { + emit BondDeposited(msg.sender, _amount); _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 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. - function bondBalanceOf( + /// @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 + address _user, + uint256 _blockId, + uint256 _amount ) internal - view - returns (uint256) { - return _state.bondBalance[_user]; + if (_amount == 0) return; + unchecked { + _state.bondBalance[_user] += _amount; + } + emit BondCredited(_user, _blockId, _amount); } + /// @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..c6881f67a49 100644 --- a/packages/protocol/contracts/layer1/based/LibData.sol +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -5,100 +5,33 @@ 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 { - // = 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 + /// @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) + public pure returns (TaikoData.Block memory) { 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, + proposedAt: 0, + proposedIn: 0, nextTransitionId: _v2.nextTransitionId, verifiedTransitionId: _v2.verifiedTransitionId }); } - function verifierContextV2toV1(IVerifier.ContextV2 memory _v2) + /// @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 returns (IVerifier.Context memory) diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol index 857a760c1b1..27a2424fe91 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; @@ -21,54 +21,36 @@ 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. + /// @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); 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(); error L1_INVALID_PROPOSER(); error L1_INVALID_TIMESTAMP(); - error L1_LIVENESS_BOND_NOT_RECEIVED(); 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. /// @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, @@ -77,22 +59,17 @@ library LibProposing { bytes[] calldata _paramsArr, bytes[] calldata _txListArr ) - public - returns ( - TaikoData.BlockMetadata[] memory metaV1s_, - TaikoData.BlockMetadataV2[] memory metas_ - ) + internal + 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) { @@ -104,13 +81,12 @@ 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. /// @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, @@ -119,10 +95,10 @@ library LibProposing { bytes calldata _params, bytes calldata _txList ) - public - returns (TaikoData.BlockMetadata memory metaV1_, TaikoData.BlockMetadataV2 memory meta_) + internal + 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)) { @@ -131,6 +107,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, @@ -139,41 +122,40 @@ 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. - if (local.b.numBlocks >= local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1) { - revert L1_TOO_MANY_BLOCKS(); + // 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 < local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1, + 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)) { + require(preconfTaskManager == msg.sender, L1_INVALID_PROPOSER()); 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)) { 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)) { @@ -196,52 +178,48 @@ library LibProposing { 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 to anchor. + require( + local.params.anchorBlockId + _config.maxAnchorHeightOffset >= block.number, + L1_INVALID_ANCHOR_BLOCK() + ); + require(local.params.anchorBlockId < block.number, 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 * SECONDS_PER_BLOCK - < block.timestamp || local.params.timestamp > block.timestamp - || local.params.timestamp < parentBlk.proposedAt - ) { - revert L1_INVALID_TIMESTAMP(); - } - } + // parentBlk.proposedIn is actually parent's params.anchorBlockId + require(local.params.anchorBlockId >= parentBlk.proposedIn, L1_INVALID_ANCHOR_BLOCK()); - // 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. + // Verify the provided timestamp to anchor. Note that local.params.anchorBlockId and + // local.params.timestamp may not correspond to the same L1 block. + require( + local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK + >= 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 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 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, + // 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, gasLimit: _config.blockMaxGasLimit, @@ -262,14 +240,9 @@ 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. + 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); @@ -284,20 +257,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, // = 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. verifiedTransitionId: 0 @@ -311,27 +279,14 @@ library LibProposing { ++_state.slotB.numBlocks; } - LibBonds.debitBond(_state, _resolver, local.params.proposer, _config.livenessBond); + LibBonds.debitBond(_state, _resolver, local.params.proposer, meta_.id, _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); - } - - 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_); } + /// @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 39a50636965..c455434ae31 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 proving and contesting block transitions. /// @custom:security-contact security@taiko.xyz library LibProving { using LibMath for uint256; @@ -22,9 +21,6 @@ library LibProving { TaikoData.BlockMetadataV2 meta; TaikoData.TierProof proof; bytes32 metaHash; - address assignedProver; - bytes32 stateRoot; - uint96 livenessBond; uint64 slot; uint64 blockId; uint24 tid; @@ -32,26 +28,9 @@ library LibProving { bool isTopTier; bool inProvingWindow; bool sameTransition; - bool postFork; - uint64 proposedAt; - bool isSyncBlock; } - /// @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. + /// @dev Emitted when a transition is proved. /// @param blockId The block ID. /// @param tran The transition data. /// @param prover The prover's address. @@ -67,21 +46,7 @@ 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. + /// @dev Emitted when a transition is contested. /// @param blockId The block ID. /// @param tran The transition data. /// @param contester The contester's address. @@ -97,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); @@ -106,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(); @@ -113,11 +79,11 @@ 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 { - if (_state.slotB.provingPaused == _pause) revert L1_INVALID_PAUSE_STATUS(); + function pauseProving(TaikoData.State storage _state, bool _pause) public { + require(_state.slotB.provingPaused != _pause, L1_INVALID_PAUSE_STATUS()); _state.slotB.provingPaused = _pause; if (!_pause) { @@ -130,12 +96,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, @@ -144,24 +110,23 @@ library LibProving { bytes[] calldata _inputs, bytes calldata _batchProof ) - public + public // Will reach contract size limit if changed to `internal` { - 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); 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) = @@ -172,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()); } } } @@ -190,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, @@ -201,12 +166,24 @@ 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); } + /// @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, @@ -221,93 +198,55 @@ 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(); - - // 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(); - } + 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]; - local.proposedAt = local.postFork ? local.meta.proposedAt : blk.proposedAt; - - local.isSyncBlock = - LibUtils.shouldSyncStateRoot(_config.stateRootSyncInternal, local.blockId); - if (local.isSyncBlock) { - 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))); - - if (local.metaHash != metaHash) revert L1_BLOCK_MISMATCH(); - } + // 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. + 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 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. - if ( - local.proof.tier == 0 || local.proof.tier < local.meta.minTier - || local.proof.tier < ts.tier - ) { - revert L1_INVALID_TIER(); - } + // Reset a deprecated field. + ts.__reserved1 = 0; - // Retrieve the tier configurations. If the tier is not supported, the - // subsequent action will result in a revert. + // 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. + 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. { ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(local.blockId)); @@ -323,29 +262,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.isTopTier && ts.contester == address(0) && local.tid == 1 && ts.tier == 0 && local.inProvingWindow ) { - if (msg.sender != local.assignedProver) 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 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, @@ -364,14 +296,20 @@ 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 ); } } - 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. @@ -379,28 +317,18 @@ 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 - if (local.sameTransition) revert L1_ALREADY_PROVED(); + require(!local.sameTransition, L1_ALREADY_PROVED()); if (local.isTopTier) { // The top tier prover re-proves. @@ -409,71 +337,48 @@ library LibProving { ts.prover = msg.sender; 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 - }); - } + ts.stateRoot = ctx_.tran.stateRoot; + + 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(); + 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() + ); - // _checkIfContestable(/*_state,*/ tier.cooldownWindow, ts.timestamp); // Burn the contest bond from the prover. - LibBonds.debitBond(_state, _resolver, msg.sender, 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. + 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 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; - 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 + }); } } @@ -487,7 +392,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, @@ -500,50 +411,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. - ts_.timestamp = _local.proposedAt; + // 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. - ts_.prover = _local.assignedProver; + // 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 @@ -556,16 +458,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, @@ -586,41 +486,41 @@ 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 { - 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 fist 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 (_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); } } } @@ -628,9 +528,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 + ); } } @@ -641,16 +545,21 @@ library LibProving { if (!_local.sameTransition) { _ts.blockHash = _tran.blockHash; - _ts.stateRoot = _local.stateRoot; + _ts.stateRoot = _tran.stateRoot; } } /// @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 6f132186381..535f07cedb5 100644 --- a/packages/protocol/contracts/layer1/based/LibUtils.sol +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -11,54 +11,33 @@ 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; - /// @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 - ); + 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 - /// 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( 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(); 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, - TaikoData.Config memory _config, - bytes32 _genesisBlockHash - ) - internal - { - if (_genesisBlockHash == 0) revert L1_INVALID_GENESIS_HASH(); + function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) public { + require(_genesisBlockHash != 0, L1_INVALID_GENESIS_HASH()); // Init state _state.slotA.genesisHeight = uint64(block.number); _state.slotA.genesisTimestamp = uint64(block.timestamp); @@ -68,6 +47,7 @@ library LibUtils { TaikoData.BlockV2 storage blk = _state.blocks[0]; blk.nextTransitionId = 2; blk.proposedAt = uint64(block.timestamp); + blk.proposedIn = uint64(block.number); blk.verifiedTransitionId = 1; blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. @@ -77,42 +57,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 - }); - } - } - - /// @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_]; - if (blk_.blockId != _blockId) revert L1_INVALID_BLOCK_ID(); + emit BlockVerifiedV2({ + blockId: 0, + prover: address(0), + blockHash: _genesisBlockHash, + tier: 0 + }); } /// @dev Retrieves a block's block hash and state root. @@ -121,12 +71,13 @@ 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 proven at. function getBlockInfo( TaikoData.State storage _state, TaikoData.Config memory _config, uint64 _blockId ) - internal + public view returns (bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) { @@ -142,87 +93,111 @@ library LibUtils { } } - /// @notice This function will revert if the transition is not found. - /// @dev Retrieves the transition with a given parentHash. + /// @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, - uint32 _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); - - if (_tid == 0 || _tid >= blk.nextTransitionId) revert 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]; + } + } } - /// @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. /// @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) { (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]; } - /// @notice 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_) { - if (_blockIds.length == 0 || _blockIds.length != _parentHashes.length) { - revert 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 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. + /// @param _parentHash The parent hash of the block. + /// @return tid_ The transition ID. function getTransitionId( TaikoData.State storage _state, TaikoData.BlockV2 storage _blk, @@ -235,13 +210,18 @@ 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()); } } + /// @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, @@ -252,11 +232,17 @@ 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; } } + /// @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, @@ -267,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; @@ -286,7 +263,12 @@ library LibUtils { return _blockId % segmentSize == (_isBlockProposed ? 0 : segmentSize >> 1); } - function shouldSyncStateRoot( + /// @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 isSyncBlock( uint256 _stateRootSyncInternal, uint256 _blockId ) diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol index 0fc0bf1501e..e0d72d02ec8 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; @@ -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. + /// @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, @@ -52,24 +53,20 @@ 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(); + // The following scenario should never occur but is included as a precaution. + require(local.tid != 0, 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 verifying 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; @@ -77,23 +74,21 @@ 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(); + 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 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; } @@ -120,33 +115,23 @@ library LibVerifying { local.blockHash = ts.blockHash; local.prover = ts.prover; - LibBonds.creditBond(_state, local.prover, 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. - - 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 - }); - } + 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. + + emit LibUtils.BlockVerifiedV2({ + blockId: local.blockId, + prover: local.prover, + blockHash: local.blockHash, + 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; @@ -189,6 +174,11 @@ library LibVerifying { } } + /// @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. + /// @return The address of the prover. function getVerifiedBlockProver( TaikoData.State storage _state, TaikoData.Config memory _config, @@ -203,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/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol index e0ed8918ed0..f9a2a59cb7c 100644 --- a/packages/protocol/contracts/layer1/based/TaikoData.sol +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -4,63 +4,49 @@ pragma solidity ^0.8.24; import "src/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}. + /// @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 proposals allowed in a single block. + /// @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 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 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 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; @@ -81,10 +67,10 @@ library TaikoData { uint8 blobIndex; // NEW } - /// @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; @@ -117,17 +103,15 @@ 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; LibSharedData.BaseFeeConfig baseFeeConfig; } - /// @dev Struct representing transition to be proven. + /// @notice Struct representing transition to be proven. struct Transition { bytes32 parentHash; bytes32 blockHash; @@ -135,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 @@ -145,69 +129,62 @@ 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 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; // 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 - // 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; // 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 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; uint64 lastSyncedBlockId; - uint64 lastSynecdAt; // typo! + uint64 lastSynecdAt; // known typo (lastSyncedAt) } struct SlotB { @@ -220,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; @@ -229,7 +206,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 32bae8634b4..9abfb9d6888 100644 --- a/packages/protocol/contracts/layer1/based/TaikoEvents.sol +++ b/packages/protocol/contracts/layer1/based/TaikoEvents.sol @@ -4,20 +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 token is credited back to a user's bond balance. - event BondCredited(address indexed user, uint256 amount); + /// @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 token is debited from a user's bond balance. - event BondDebited(address indexed user, uint256 amount); + /// @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); - /// @notice Emitted when a block is proposed. + /// @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); + + /// @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); + + /// @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. @@ -42,7 +57,8 @@ abstract contract TaikoEvents { /// @param txList The txList. event CalldataTxList(uint256 indexed blockId, bytes txList); - /// @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. @@ -72,7 +88,8 @@ abstract contract TaikoEvents { uint64 proposedIn ); - /// @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. @@ -106,10 +123,10 @@ abstract contract TaikoEvents { /// @param paused The pause status. event ProvingPaused(bool paused); - /// @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. @@ -121,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 b546527f488..a9c1e5054bb 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"; @@ -13,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 { @@ -24,11 +25,10 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { uint256[50] private __gap; - error L1_FORK_ERROR(); - error L1_INVALID_PARAMS(); + error L1_FORK_HEIGHT_ERROR(); modifier whenProvingNotPaused() { - if (state.slotB.provingPaused) revert LibProving.L1_PROVING_PAUSED(); + require(!state.slotB.provingPaused, LibProving.L1_PROVING_PAUSED()); _; } @@ -52,7 +52,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,26 +65,13 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { state.__reserve1 = 0; } - /// @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(); - - TaikoData.BlockMetadataV2 memory metaV2; - (meta_, metaV2) = LibProposing.proposeBlock(state, config, this, _params, _txList); - if (metaV2.id >= config.ontakeForkHeight) revert L1_FORK_ERROR(); - deposits_ = new TaikoData.EthDeposit[](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; } + /// @inheritdoc ITaikoL1 function proposeBlockV2( bytes calldata _params, bytes calldata _txList @@ -96,8 +83,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 @@ -112,10 +98,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 @@ -174,7 +157,16 @@ 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; + state.slotB.lastUnpausedAt = uint64(block.timestamp); + emit Unpaused(msg.sender); + } + /// @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); @@ -189,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); + 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); } @@ -211,14 +207,15 @@ 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, /// 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 @@ -239,7 +236,9 @@ contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { view returns (TaikoData.TransitionState memory) { - return LibUtils.getTransition(state, getConfig(), _blockId, _tid); + return LibUtils.getTransitionById( + state, getConfig(), _blockId, SafeCastUpgradeable.toUint24(_tid) + ); } /// @notice Returns information about the last verified block. @@ -282,10 +281,10 @@ 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); + /// @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; } /// @inheritdoc ITaikoL1 @@ -306,11 +305,11 @@ 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_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/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 }); } } diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol index ec0184fb5b4..d69989ba6ad 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/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; } } 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..f49db7dfa20 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol @@ -0,0 +1,88 @@ +// 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"; + +/// @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 +/// POC. +/// @custom:security-contact security@taiko.xyz +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) { + require(msg.sender == allowedSender, 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) + { + require(!slasher.isOperatorSlashed(operator), 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..ad4922b5174 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol @@ -0,0 +1,38 @@ +// 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 + 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..d786a0d7537 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol @@ -0,0 +1,22 @@ +// 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 + ); + + /// @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..5e399835e54 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol @@ -0,0 +1,18 @@ +// 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); + + /// @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..dda27f58ce1 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol @@ -0,0 +1,18 @@ +// 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); + + /// @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..c25da59facb --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +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 new file mode 100644 index 00000000000..cfafe4081f6 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +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 + 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..d47951d76e5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol @@ -0,0 +1,25 @@ +// 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); + + 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..c381b71f34b --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +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 + 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..12e408bb38a --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol @@ -0,0 +1,12 @@ +// 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; + 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..e3ad403436f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol @@ -0,0 +1,246 @@ +// 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"; + +/// @title PreconfRegistry +/// @custom:security-contact security@taiko.xyz +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 + require(preconferToIndex[msg.sender] == 0, 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]; + require(removedPreconferIndex != 0, 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 + require(preconferToIndex[msg.sender] != 0, 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 + require( + validator.preconfer == address(0) + || (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); + } + } + + /** + * @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) + 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. + + // 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..c44bede30c5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol @@ -0,0 +1,637 @@ +// 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"; + +/// @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. + 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]------- + // + 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; + + // 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 + require(poster != address(0), PosterAlreadySlashedOrLookaheadIsEmpty()); + + // Must not have missed dispute period + require( + block.timestamp <= slotTimestamp + LibPreconfConstants.DISPUTE_PERIOD, + 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 + 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 + // 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 + require(preconferInLookahead != preconferInRegistry, 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 + require(preconfRegistry.getPreconferIndex(msg.sender) != 0, PreconferNotRegistered()); + + // Lookahead must be missing + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + require(_isLookaheadRequired(epochTimestamp, nextEpochTimestamp), 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 + require(preconfRegistry.getPreconferIndex(preconfer) != 0, PreconferNotRegistered()); + + // Ensure that the timestamps belong to a valid slot in the epoch + require((slotTimestamp - epochTimestamp) % 12 == 0, InvalidSlotTimestamp()); + require(slotTimestamp < epochEndTimestamp, InvalidSlotTimestamp()); + require(slotTimestamp > prevSlotTimestamp, 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 { + require(epochTimestamp >= beaconGenesis, InvalidEpochTimestamp()); + require( + (epochTimestamp - beaconGenesis) % LibPreconfConstants.SECONDS_IN_EPOCH == 0, + 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 + require(nextPreconferIndex != 1, 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..835b2f029b9 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol @@ -0,0 +1,468 @@ +// 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; + +/// @title LibBLS12381 +/// @custom:security-contact security@taiko.xyz +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..1b2255450ba --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./LibBLS12381.sol"; + +/// @title LibBLSSignature +/// @custom:security-contact security@taiko.xyz +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..153cb582131 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol @@ -0,0 +1,98 @@ +// 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"; + +/// @title LibEIP4788 +/// @custom:security-contact security@taiko.xyz +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))); + require(pubKeyHashTreeRoot == inclusionProof.validator[0], InvalidValidatorBLSPubKey()); + + // Validator is verified against the validator list in the beacon state + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(inclusionProof.validator); + require( + LibMerkleUtils.verifyProof( + inclusionProof.validatorProof, + inclusionProof.validatorsRoot, + validatorHashTreeRoot, + inclusionProof.validatorIndex + ), + ValidatorProofFailed() + ); + + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconStateProof, + inclusionProof.beaconStateRoot, + inclusionProof.validatorsRoot, + 11 + ), + BeaconStateProofFailed() + ); + + // Beacon state is verified against the beacon block + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForState, + beaconBlockRoot, + inclusionProof.beaconStateRoot, + 3 + ), + BeaconBlockProofForStateFailed() + ); + + // Validator index is verified against the beacon block + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForProposerIndex, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(inclusionProof.validatorIndex), + 1 + ), + 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..c9a962edea4 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT + +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; + + 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..0bb360711ca --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol @@ -0,0 +1,245 @@ +// 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 + require(preconferToIndex[msg.sender] == 0, 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 + require(preconferToIndex[msg.sender] != 0, 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 + require(preconferToIndex[msg.sender] != 0, 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 + 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(); + // 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 + require( + validator.preconfer == address(0) + || (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); + } + } + + /** + * @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) + 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 + require( + LibBLSSignature.verifySignature( + message, removeValidatorParams[i].signature, removeValidatorParams[i].pubkey + ), + InvalidValidatorSignature() + ); + + // Revert if the signature has expired + require( + block.timestamp <= removeValidatorParams[i].signatureExpiry, + 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/layer1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol index 53bd8960709..5a8f136efa8 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, @@ -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); @@ -144,58 +142,39 @@ 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(); + require(provingAutoPauseEnabled != _enable, GP_INVALID_STATUS()); provingAutoPauseEnabled = _enable; emit ProvingAutoPauseEnabled(_enable); } /// @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 { - 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; tko.transfer(_to, amount); } - /// @dev Called by guardians to approve a guardian proof - /// @param _meta The block's metadata. + /// @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 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 - }); - } - + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. function approveV2( TaikoData.BlockMetadataV2 calldata _metaV2, TaikoData.Transition calldata _tran, @@ -217,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); } @@ -235,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 @@ -247,16 +224,23 @@ 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()); } } - /// @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 +283,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 @@ -307,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; @@ -320,6 +308,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 c0b4d66dec9..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()); _; } @@ -58,16 +59,13 @@ 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); } /// @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); @@ -84,26 +82,7 @@ contract ProverSet is EssentialContract, IERC1271 { } /// @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, - bytes calldata _txList - ) - external - payable - onlyProver - { + function proposeBlockV2(bytes calldata _params, bytes calldata _txList) external onlyProver { ITaikoL1(taikoL1()).proposeBlockV2(_params, _txList); } @@ -113,7 +92,6 @@ contract ProverSet is EssentialContract, IERC1271 { bytes[] calldata _txListArr ) external - payable onlyProver { ITaikoL1(taikoL1()).proposeBlocksV2(_paramsArr, _txListArr); diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol index 000393b91fa..27415a361ef 100644 --- a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -97,7 +97,7 @@ abstract contract TierProviderBase is ITierProvider { contestBond: _validityBond / 10_000 * 65_625, cooldownWindow: _cooldownWindow, provingWindow: GRACE_PERIOD + _provingWindow, - maxBlocksToVerifyPerProof: 0 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } } 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 new file mode 100644 index 00000000000..451d88604a3 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol @@ -0,0 +1,169 @@ +// 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); + + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); + + (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); + + require(verified, 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]; + + require(instances[idx].addr != address(0), 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) { + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); + + addressRegistered[_instances[i]] = true; + + require(_instances[i] != address(0), 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/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol index 345d354cbd2..da4d2ef4bda 100644 --- a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -19,14 +19,13 @@ 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(); error CV_SUB_VERIFIER_NOT_FOUND(); modifier onlyAuthorizedCaller() { - if (!isCallerAuthorized(msg.sender)) revert CV_INVALID_CALLER(); + require(isCallerAuthorized(msg.sender), CV_INVALID_CALLER()); _; } @@ -50,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; @@ -64,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) @@ -84,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_DUPLICATE_SUBPROOF(); + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); // find the verifier bool verifierFound; @@ -98,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/layer2/based/Lib1559Math.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol similarity index 93% rename from packages/protocol/contracts/layer2/based/Lib1559Math.sol rename to packages/protocol/contracts/layer2/based/LibEIP1559.sol index 99502d13dd3..14dca051fb0 100644 --- a/packages/protocol/contracts/layer2/based/Lib1559Math.sol +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -4,14 +4,15 @@ 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; + /// @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(); @@ -41,7 +42,7 @@ library Lib1559Math { } /// @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, 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 ff7ba2c657d..d2befc46d41 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"; @@ -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. @@ -106,6 +110,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, @@ -160,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, @@ -230,7 +244,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( @@ -238,11 +254,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 +266,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,9 +281,9 @@ 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( + (basefee_, parentGasExcess_) = LibEIP1559.calc1559BaseFee( uint256(config.gasTargetPerL1Block) * config.basefeeAdjustmentQuotient, parentGasExcess, uint64(_anchorBlockId - lastSyncedBlock) * config.gasTargetPerL1Block, @@ -284,12 +299,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. @@ -304,7 +313,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). @@ -313,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; } @@ -346,11 +363,18 @@ contract TaikoL2 is EssentialContract, IBlockHash { uint256 gasTarget = uint256(_baseFeeConfig.gasIssuancePerSecond) * _baseFeeConfig.adjustmentQuotient; - return Lib1559Math.calc1559BaseFee( + return LibEIP1559.calc1559BaseFee( gasTarget, _parentGasExcess, gasIssuance, _parentGasUsed, _baseFeeConfig.minGasExcess ); } + /// @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/contracts/shared/bridge/Bridge.sol b/packages/protocol/contracts/shared/bridge/Bridge.sol index 9805db23013..eb18c5ef7a6 100644 --- a/packages/protocol/contracts/shared/bridge/Bridge.sol +++ b/packages/protocol/contracts/shared/bridge/Bridge.sol @@ -469,7 +469,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. 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 777ce8809ff..654393b21e7 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; @@ -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()); _; } @@ -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); } 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/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"); 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()); } } diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 7012fe4b58d..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,9 +18,11 @@ 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/" + "script/=script/", ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 864bcdb5467..06ef101d309 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/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/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/based/TaikoL1.t.sol b/packages/protocol/test/layer1/based/TaikoL1.t.sol index 1d06387c1d8..52415ea780d 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; } } @@ -45,7 +46,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 +76,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 +90,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 +111,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 +138,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 +194,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, @@ -225,14 +229,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..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; } } @@ -28,7 +29,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } function proveHigherTierProof( - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 stateRoot, bytes32 blockHash, @@ -53,7 +54,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 +96,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 +142,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 +187,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 +237,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 +297,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 +332,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 +387,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); @@ -422,12 +431,13 @@ 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.BlockMetadata memory meta,) = proposeBlock(Alice, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + mine(1); bytes32 blockHash = bytes32(1_000_000 + blockId); @@ -442,7 +452,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, @@ -479,7 +489,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 +526,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 +535,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // Mess up metahash - meta.l1Height = 200; + meta.proposedIn = 200; proveBlock( Bob, meta, @@ -531,7 +543,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - LibUtils.L1_BLOCK_MISMATCH.selector + LibProving.L1_BLOCK_MISMATCH.selector ); parentHash = blockHash; @@ -547,7 +559,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 +603,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 8dad90a69e0..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 "); @@ -117,24 +118,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 +169,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 a6725bc2296..9226cc75074 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 = ITierProvider(tr).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 = ITierProvider(tr).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 = ITierProvider(tr).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 = ITierProvider(tr).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 = ITierProvider(tr).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 = ITierProvider(tr).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 49cee986060..364c1f62717 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 = ITierProvider(tr).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 = ITierProvider(tr).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 832aa341988..0375309e8d0 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 = ITierProvider(tr).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 = ITierProvider(tr).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 ce0bbdde373..5a748170b7a 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 = ITierProvider(tr).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 = ITierProvider(tr).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 ebbaa4eea57..9b59addfd55 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 = ITierProvider(tr).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 = ITierProvider(tr).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 cb42f8ea7a2..8dbb1649542 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 = ITierProvider(tr).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 78c85f1a00b..f8d57a59536 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 = ITierProvider(tr).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 = ITierProvider(tr).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 ba98ebd1799..0fc7533182b 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 = ITierProvider(tr).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 = ITierProvider(tr).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..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; } } @@ -25,16 +26,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 +63,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 +106,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 +179,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 +199,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 +207,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/TestTierRouter.sol b/packages/protocol/test/layer1/based/TestTierRouter.sol index 173ebd033d4..833d259f639 100644 --- a/packages/protocol/test/layer1/based/TestTierRouter.sol +++ b/packages/protocol/test/layer1/based/TestTierRouter.sol @@ -26,8 +26,8 @@ contract TestTierRouter is ITierProvider, ITierRouter { contestBond: 500 ether, // TKO cooldownWindow: 1440, //24 hours provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 0 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } if (_tierId == LibTiers.TIER_SGX) { @@ -37,8 +37,8 @@ contract TestTierRouter is ITierProvider, ITierRouter { contestBond: 1640 ether, // =250TKO * 6.5625 cooldownWindow: 1440, //24 hours provingWindow: 60, // 1 hours - maxBlocksToVerifyPerProof: 0 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } if (_tierId == LibTiers.TIER_GUARDIAN) { @@ -48,8 +48,8 @@ contract TestTierRouter is ITierProvider, ITierRouter { contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 0 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } revert TIER_NOT_FOUND(); 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/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(); diff --git a/packages/protocol/test/layer2/Lib1559Math.t.sol b/packages/protocol/test/layer2/LibEIP1559.t.sol similarity index 66% rename from packages/protocol/test/layer2/Lib1559Math.t.sol rename to packages/protocol/test/layer2/LibEIP1559.t.sol index b650f231e23..14751940dda 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_gasIssuancePerSecond() 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/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 3e6ce9fb20a..00000000000 --- a/packages/protocol/test/layer2/TaikoL2EIP1559Configurable.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import "src/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 21602e5f721..a57ad6c00d7 100644 --- a/packages/protocol/test/layer2/TaikoL2Test.sol +++ b/packages/protocol/test/layer2/TaikoL2Test.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.24; import "src/layer2/DelegateOwner.sol"; -import "../layer2/TaikoL2EIP1559Configurable.sol"; -import "../layer2/LibL2Signer.sol"; -import "../shared/TaikoTest.sol"; +import "src/layer2/based/LibEIP1559.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/pnpm-lock.yaml b/pnpm-lock.yaml index a2afee63b23..dc2a41d20d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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 @@ -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 @@ -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 @@ -15875,11 +16220,19 @@ snapshots: '@metamask/eth-json-rpc-provider@1.0.1': dependencies: '@metamask/json-rpc-engine': 7.3.2 - '@metamask/safe-event-emitter': 3.0.0 + '@metamask/safe-event-emitter': 3.1.1 '@metamask/utils': 5.0.2 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 @@ -16196,8 +16549,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.3.4 - semver: 7.6.2 + debug: 4.3.7(supports-color@8.1.1) + semver: 7.6.3 superstruct: 1.0.3 transitivePeerDependencies: - supports-color @@ -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 @@ -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 @@ -29875,6 +30627,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 @@ -29888,6 +30644,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 @@ -30053,8 +30813,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 @@ -30069,6 +30838,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