Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 25 from a total of 46 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Vault Limit ... | 125491740 | 27 days ago | IN | 0 ETH | 0.00000163658 | ||||
Set Vault Limit ... | 125456357 | 28 days ago | IN | 0 ETH | 0.000000426162 | ||||
Set Vault Limit ... | 120087104 | 152 days ago | IN | 0 ETH | 0.00000041288 | ||||
Set Address | 115301017 | 263 days ago | IN | 0 ETH | 0.00017956689 | ||||
Set Address | 115301006 | 263 days ago | IN | 0 ETH | 0.000191413619 | ||||
Set Address | 115300996 | 263 days ago | IN | 0 ETH | 0.000191391635 | ||||
Set Address | 115300983 | 263 days ago | IN | 0 ETH | 0.000194728394 | ||||
Set Address | 115300962 | 263 days ago | IN | 0 ETH | 0.000194033013 | ||||
Set Address | 115300951 | 263 days ago | IN | 0 ETH | 0.00019306237 | ||||
Set Address | 115300916 | 263 days ago | IN | 0 ETH | 0.00019358579 | ||||
Batch Set Addres... | 115249759 | 264 days ago | IN | 0 ETH | 0.001753601403 | ||||
Set Vault Limit ... | 115249749 | 264 days ago | IN | 0 ETH | 0.00017796698 | ||||
Set Required Mes... | 115249746 | 264 days ago | IN | 0 ETH | 0.000178282827 | ||||
Batch Set Addres... | 115249717 | 264 days ago | IN | 0 ETH | 0.001757205395 | ||||
Set Vault Limit ... | 115249707 | 264 days ago | IN | 0 ETH | 0.000177941836 | ||||
Set Required Mes... | 115249703 | 264 days ago | IN | 0 ETH | 0.00017810137 | ||||
Batch Set Addres... | 115249674 | 264 days ago | IN | 0 ETH | 0.001764758548 | ||||
Set Vault Limit ... | 115249664 | 264 days ago | IN | 0 ETH | 0.000118583953 | ||||
Set Required Mes... | 115249661 | 264 days ago | IN | 0 ETH | 0.000118505447 | ||||
Set Vault Limit ... | 115249466 | 264 days ago | IN | 0 ETH | 0.000178471143 | ||||
Set Required Mes... | 115249461 | 264 days ago | IN | 0 ETH | 0.000177235522 | ||||
Batch Set Addres... | 115249429 | 264 days ago | IN | 0 ETH | 0.001759270073 | ||||
Set Vault Limit ... | 115249420 | 264 days ago | IN | 0 ETH | 0.000177130741 | ||||
Set Required Mes... | 115249416 | 264 days ago | IN | 0 ETH | 0.000175589197 | ||||
Batch Set Addres... | 115249387 | 264 days ago | IN | 0 ETH | 0.001745465199 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
115246279 | 264 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x38594203...a16BB48Cb The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
SuperRegistry
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.23; import { QuorumManager } from "src/crosschain-data/utils/QuorumManager.sol"; import { ISuperRBAC } from "src/interfaces/ISuperRBAC.sol"; import { ISuperRegistry } from "src/interfaces/ISuperRegistry.sol"; import { Error } from "src/libraries/Error.sol"; /// @title SuperRegistry /// @dev Keeps information on all addresses used in the Superform ecosystem /// @author Zeropoint Labs contract SuperRegistry is ISuperRegistry, QuorumManager { ////////////////////////////////////////////////////////////// // CONSTANTS // ////////////////////////////////////////////////////////////// uint256 private constant MIN_DELAY = 15 minutes; uint256 private constant MAX_DELAY = 24 hours; uint64 public immutable CHAIN_ID; /// @dev core protocol - identifiers /// @notice should not be allowed to be changed bytes32 public constant override SUPERFORM_ROUTER = keccak256("SUPERFORM_ROUTER"); /// @dev can be used to set a new factory that has form ids paused /// @notice should not be allowed to be changed bytes32 public constant override SUPERFORM_FACTORY = keccak256("SUPERFORM_FACTORY"); /// @dev can be used to set a new paymaster to forward payments to /// @dev could be allowed to be changed bytes32 public constant override PAYMASTER = keccak256("PAYMASTER"); /// @dev accessed in some areas of the protocol to calculate AMB fees. Already has a function to alter the /// configuration /// @dev could be allowed to be changed bytes32 public constant override PAYMENT_HELPER = keccak256("PAYMENT_HELPER"); /// @dev accessed in many areas of the protocol. has direct access to superforms /// @notice should not be allowed to be changed bytes32 public constant override CORE_STATE_REGISTRY = keccak256("CORE_STATE_REGISTRY"); /// @dev accessed in many areas of the protocol. has direct access to timelock form /// @notice should not be allowed to be changed bytes32 public constant override TIMELOCK_STATE_REGISTRY = keccak256("TIMELOCK_STATE_REGISTRY"); /// @dev used to sync messages for pausing superforms or deploying transmuters /// @notice should not be allowed to be changed bytes32 public constant override BROADCAST_REGISTRY = keccak256("BROADCAST_REGISTRY"); /// @dev not accessed in protocol /// @notice should not be allowed to be changed bytes32 public constant override SUPER_POSITIONS = keccak256("SUPER_POSITIONS"); /// @dev accessed in many areas of the protocol /// @notice should not be allowed to be changed bytes32 public constant override SUPER_RBAC = keccak256("SUPER_RBAC"); /// @dev not accessed in protocol /// @dev could be allowed to be changed bytes32 public constant override PAYLOAD_HELPER = keccak256("PAYLOAD_HELPER"); /// @dev accessed in CSR and validators. can be used to alter behaviour of update deposit payloads /// @notice should not be allowed to be changed bytes32 public constant override DST_SWAPPER = keccak256("DST_SWAPPER"); /// @dev accessed in base form to send payloads to emergency queue /// @notice should not be allowed to be changed bytes32 public constant override EMERGENCY_QUEUE = keccak256("EMERGENCY_QUEUE"); /// @dev receiver of bridge refunds and airdropped tokens /// @notice should not be allowed to be changed bytes32 public constant override SUPERFORM_RECEIVER = keccak256("SUPERFORM_RECEIVER"); /// @dev default keepers - identifiers /// @dev could be allowed to be changed bytes32 public constant override PAYMENT_ADMIN = keccak256("PAYMENT_ADMIN"); bytes32 public constant override CORE_REGISTRY_PROCESSOR = keccak256("CORE_REGISTRY_PROCESSOR"); bytes32 public constant override BROADCAST_REGISTRY_PROCESSOR = keccak256("BROADCAST_REGISTRY_PROCESSOR"); bytes32 public constant override TIMELOCK_REGISTRY_PROCESSOR = keccak256("TIMELOCK_REGISTRY_PROCESSOR"); bytes32 public constant override CORE_REGISTRY_UPDATER = keccak256("CORE_REGISTRY_UPDATER"); bytes32 public constant override CORE_REGISTRY_RESCUER = keccak256("CORE_REGISTRY_RESCUER"); bytes32 public constant override CORE_REGISTRY_DISPUTER = keccak256("CORE_REGISTRY_DISPUTER"); bytes32 public constant override DST_SWAPPER_PROCESSOR = keccak256("DST_SWAPPER_PROCESSOR"); ////////////////////////////////////////////////////////////// // STATE VARIABLES // ////////////////////////////////////////////////////////////// /// @dev canonical permit2 contract address private permit2Address; /// @dev rescue timelock delay config uint256 public delay; mapping(bytes32 id => mapping(uint64 chainid => address moduleAddress)) private registry; /// @dev liquidityBridge id is mapped to a liquidityBridge address (to prevent interaction with unauthorized /// bridges) mapping(uint8 bridgeId => address bridgeAddress) public bridgeAddresses; mapping(uint8 bridgeId => address bridgeValidator) public bridgeValidator; mapping(uint8 ambId => address ambAddresses) public ambAddresses; mapping(uint8 ambId => bool isBroadcastAMB) public isBroadcastAMB; mapping(uint64 chainId => uint256 vaultLimitPerDestination) public vaultLimitPerDestination; mapping(uint8 registryId => address registryAddress) public registryAddresses; /// @dev is the reverse mapping of registryAddresses mapping(address registryAddress => uint8 registryId) public stateRegistryIds; /// @dev is the reverse mapping of ambAddresses mapping(address ambAddress => uint8 ambId) public ambIds; ////////////////////////////////////////////////////////////// // MODIFIERS // ////////////////////////////////////////////////////////////// modifier onlyEmergencyAdmin() { if (!ISuperRBAC(registry[SUPER_RBAC][CHAIN_ID]).hasEmergencyAdminRole(msg.sender)) { revert Error.NOT_EMERGENCY_ADMIN(); } _; } modifier onlyProtocolAdmin() { if (!ISuperRBAC(registry[SUPER_RBAC][CHAIN_ID]).hasProtocolAdminRole(msg.sender)) { revert Error.NOT_PROTOCOL_ADMIN(); } _; } ////////////////////////////////////////////////////////////// // CONSTRUCTOR // ////////////////////////////////////////////////////////////// constructor(address superRBAC_) { if (superRBAC_ == address(0)) { revert Error.ZERO_ADDRESS(); } if (block.chainid > type(uint64).max) { revert Error.BLOCK_CHAIN_ID_OUT_OF_BOUNDS(); } CHAIN_ID = uint64(block.chainid); registry[SUPER_RBAC][CHAIN_ID] = superRBAC_; emit AddressUpdated(SUPER_RBAC, CHAIN_ID, address(0), superRBAC_); } ////////////////////////////////////////////////////////////// // EXTERNAL VIEW FUNCTIONS // ////////////////////////////////////////////////////////////// /// @inheritdoc ISuperRegistry function getAddress(bytes32 id_) external view override returns (address addr) { addr = registry[id_][CHAIN_ID]; if (addr == address(0)) revert Error.ZERO_ADDRESS(); } /// @inheritdoc ISuperRegistry function getAddressByChainId(bytes32 id_, uint64 chainId_) external view override returns (address addr) { addr = registry[id_][chainId_]; if (addr == address(0)) revert Error.ZERO_ADDRESS(); } /// @inheritdoc ISuperRegistry function getBridgeAddress(uint8 bridgeId_) external view override returns (address bridgeAddress_) { bridgeAddress_ = bridgeAddresses[bridgeId_]; if (bridgeAddress_ == address(0)) revert Error.ZERO_ADDRESS(); } /// @inheritdoc ISuperRegistry function getBridgeValidator(uint8 bridgeId_) external view override returns (address bridgeValidator_) { bridgeValidator_ = bridgeValidator[bridgeId_]; if (bridgeValidator_ == address(0)) revert Error.ZERO_ADDRESS(); } /// @inheritdoc ISuperRegistry function getAmbAddress(uint8 ambId_) external view override returns (address ambAddress_) { ambAddress_ = ambAddresses[ambId_]; if (ambAddress_ == address(0)) revert Error.ZERO_ADDRESS(); } /// @inheritdoc ISuperRegistry function getAmbId(address ambAddress_) external view override returns (uint8 ambId_) { ambId_ = ambIds[ambAddress_]; } /// @inheritdoc ISuperRegistry function getStateRegistry(uint8 registryId_) external view override returns (address registryAddress_) { registryAddress_ = registryAddresses[registryId_]; if (registryAddress_ == address(0)) revert Error.ZERO_ADDRESS(); } /// @inheritdoc ISuperRegistry function getStateRegistryId(address registryAddress_) external view override returns (uint8 registryId_) { registryId_ = stateRegistryIds[registryAddress_]; if (registryId_ == 0) revert Error.INVALID_REGISTRY_ID(); } /// @inheritdoc ISuperRegistry function getVaultLimitPerDestination(uint64 chainId_) external view override returns (uint256 vaultLimitPerDestination_) { vaultLimitPerDestination_ = vaultLimitPerDestination[chainId_]; } /// @inheritdoc ISuperRegistry function isValidStateRegistry(address registryAddress_) external view override returns (bool valid_) { if (stateRegistryIds[registryAddress_] != 0) return true; return false; } /// @inheritdoc ISuperRegistry function isValidAmbImpl(address ambAddress_) external view override returns (bool valid_) { uint8 ambId = ambIds[ambAddress_]; if (ambId != 0 && !isBroadcastAMB[ambId]) return true; return false; } /// @inheritdoc ISuperRegistry function isValidBroadcastAmbImpl(address ambAddress_) external view override returns (bool valid_) { uint8 ambId = ambIds[ambAddress_]; if (ambId != 0 && isBroadcastAMB[ambId]) return true; return false; } /// @inheritdoc ISuperRegistry function PERMIT2() external view override returns (address) { if (permit2Address == address(0)) revert Error.ZERO_ADDRESS(); return permit2Address; } ////////////////////////////////////////////////////////////// // EXTERNAL WRITE FUNCTIONS // ////////////////////////////////////////////////////////////// /// @inheritdoc ISuperRegistry function setVaultLimitPerDestination(uint64 chainId_, uint256 vaultLimit_) external override onlyEmergencyAdmin { if (vaultLimit_ == 0) { revert Error.ZERO_INPUT_VALUE(); } vaultLimitPerDestination[chainId_] = vaultLimit_; emit SetVaultLimitPerDestination(chainId_, vaultLimit_); } /// @inheritdoc ISuperRegistry function setDelay(uint256 delay_) external override onlyProtocolAdmin { if (delay_ < MIN_DELAY || delay_ > MAX_DELAY) { revert Error.INVALID_TIMELOCK_DELAY(); } uint256 oldDelay_ = delay; delay = delay_; emit SetDelay(oldDelay_, delay_); } /// @inheritdoc ISuperRegistry function setPermit2(address permit2_) external override onlyProtocolAdmin { if (permit2Address != address(0)) revert Error.DISABLED(); if (permit2_ == address(0)) revert Error.ZERO_ADDRESS(); permit2Address = permit2_; emit SetPermit2(permit2_); } /// @inheritdoc ISuperRegistry function batchSetAddress( bytes32[] calldata ids_, address[] calldata newAddresses_, uint64[] calldata chainIds_ ) external override onlyProtocolAdmin { uint256 len = ids_.length; if (len != newAddresses_.length || len != chainIds_.length) revert Error.ARRAY_LENGTH_MISMATCH(); for (uint256 i; i < len; ++i) { setAddress(ids_[i], newAddresses_[i], chainIds_[i]); } } /// @inheritdoc ISuperRegistry function setAddress(bytes32 id_, address newAddress_, uint64 chainId_) public override onlyProtocolAdmin { address oldAddress = registry[id_][chainId_]; if (oldAddress != address(0)) { /// @notice SUPERFORM_FACTORY, CORE_STATE_REGISTRY, TIMELOCK_STATE_REGISTRY, BROADCAST_REGISTRY, SUPER_RBAC, /// DST_SWAPPER, EMERGENCY_QUEUE, SUPER_POSITIONS and SUPERFORM_ROUTER cannot be changed once set if ( id_ == SUPERFORM_FACTORY || id_ == CORE_STATE_REGISTRY || id_ == TIMELOCK_STATE_REGISTRY || id_ == BROADCAST_REGISTRY || id_ == SUPER_RBAC || id_ == DST_SWAPPER || id_ == EMERGENCY_QUEUE || id_ == SUPER_POSITIONS || id_ == SUPERFORM_ROUTER ) { revert Error.DISABLED(); } } registry[id_][chainId_] = newAddress_; emit AddressUpdated(id_, chainId_, oldAddress, newAddress_); } /// @inheritdoc ISuperRegistry function setBridgeAddresses( uint8[] memory bridgeId_, address[] memory bridgeAddress_, address[] memory bridgeValidator_ ) external override onlyProtocolAdmin { uint256 len = bridgeId_.length; if (len != bridgeAddress_.length || len != bridgeValidator_.length) revert Error.ARRAY_LENGTH_MISMATCH(); for (uint256 i; i < len; ++i) { uint8 bridgeId = bridgeId_[i]; address bridgeAddress = bridgeAddress_[i]; address bridgeValidatorT = bridgeValidator_[i]; if (bridgeAddress == address(0)) revert Error.ZERO_ADDRESS(); if (bridgeId == 0) revert Error.ZERO_INPUT_VALUE(); if (bridgeValidatorT == address(0)) revert Error.ZERO_ADDRESS(); if (bridgeAddresses[bridgeId] != address(0)) revert Error.DISABLED(); bridgeAddresses[bridgeId] = bridgeAddress; bridgeValidator[bridgeId] = bridgeValidatorT; emit SetBridgeAddress(bridgeId, bridgeAddress); emit SetBridgeValidator(bridgeId, bridgeValidatorT); } } /// @inheritdoc ISuperRegistry function setAmbAddress( uint8[] memory ambId_, address[] memory ambAddress_, bool[] memory isBroadcastAMB_ ) external override onlyProtocolAdmin { uint256 len = ambId_.length; if (len != ambAddress_.length || len != isBroadcastAMB_.length) revert Error.ARRAY_LENGTH_MISMATCH(); for (uint256 i; i < len; ++i) { address ambAddress = ambAddress_[i]; uint8 ambId = ambId_[i]; bool broadcastAMB = isBroadcastAMB_[i]; if (ambAddress == address(0)) revert Error.ZERO_ADDRESS(); if (ambId == 0) revert Error.ZERO_INPUT_VALUE(); if (ambAddresses[ambId] != address(0)) revert Error.DISABLED(); ambAddresses[ambId] = ambAddress; ambIds[ambAddress] = ambId; isBroadcastAMB[ambId] = broadcastAMB; emit SetAmbAddress(ambId, ambAddress, broadcastAMB); } } /// @inheritdoc ISuperRegistry function setStateRegistryAddress( uint8[] memory registryId_, address[] memory registryAddress_ ) external override onlyProtocolAdmin { uint256 len = registryId_.length; if (len != registryAddress_.length) revert Error.ARRAY_LENGTH_MISMATCH(); for (uint256 i; i < len; ++i) { address registryAddress = registryAddress_[i]; uint8 registryId = registryId_[i]; if (registryAddress == address(0)) revert Error.ZERO_ADDRESS(); if (registryId == 0) revert Error.ZERO_INPUT_VALUE(); if (registryAddresses[registryId] != address(0)) { revert Error.DISABLED(); } registryAddresses[registryId] = registryAddress; stateRegistryIds[registryAddress] = registryId; emit SetStateRegistryAddress(registryId, registryAddress); } } /// @inheritdoc QuorumManager function setRequiredMessagingQuorum(uint64 srcChainId_, uint256 quorum_) external override onlyProtocolAdmin { if (srcChainId_ == 0) { revert Error.INVALID_CHAIN_ID(); } requiredQuorum[srcChainId_] = quorum_; emit QuorumSet(srcChainId_, quorum_); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.23; import { IQuorumManager } from "src/interfaces/IQuorumManager.sol"; import { Error } from "src/libraries/Error.sol"; /// @title QuorumManager /// @dev Quorum thresholds using in sending proofs from chain to chain /// @author ZeroPoint Labs abstract contract QuorumManager is IQuorumManager { ////////////////////////////////////////////////////////////// // STATE VARIABLES // ////////////////////////////////////////////////////////////// mapping(uint64 srcChainId => uint256 quorum) internal requiredQuorum; ////////////////////////////////////////////////////////////// // EXTERNAL VIEW FUNCTIONS // ////////////////////////////////////////////////////////////// /// @inheritdoc IQuorumManager function getRequiredMessagingQuorum(uint64 srcChainId_) public view returns (uint256 quorum_) { /// @dev no chain can have chain id zero. (validates that here) if (srcChainId_ == 0) { revert Error.ZERO_INPUT_VALUE(); } return requiredQuorum[srcChainId_]; } ////////////////////////////////////////////////////////////// // EXTERNAL WRITE FUNCTIONS // ////////////////////////////////////////////////////////////// /// @inheritdoc IQuorumManager function setRequiredMessagingQuorum(uint64 srcChainId_, uint256 quorum_) external virtual; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.23; import { IAccessControl } from "openzeppelin-contracts/contracts/access/IAccessControl.sol"; /// @title ISuperRBAC /// @dev Interface for SuperRBAC /// @author Zeropoint Labs interface ISuperRBAC is IAccessControl { ////////////////////////////////////////////////////////////// // STRUCTS // ////////////////////////////////////////////////////////////// struct InitialRoleSetup { address admin; address emergencyAdmin; address paymentAdmin; address csrProcessor; address tlProcessor; address brProcessor; address csrUpdater; address srcVaaRelayer; address dstSwapper; address csrRescuer; address csrDisputer; } ////////////////////////////////////////////////////////////// // EVENTS // ////////////////////////////////////////////////////////////// /// @dev is emitted when superRegistry is set event SuperRegistrySet(address indexed superRegistry); /// @dev is emitted when an admin is set for a role event RoleAdminSet(bytes32 role, bytes32 adminRole); ////////////////////////////////////////////////////////////// // EXTERNAL VIEW FUNCTIONS // ////////////////////////////////////////////////////////////// /// @dev returns the id of the protocol admin role function PROTOCOL_ADMIN_ROLE() external view returns (bytes32); /// @dev returns the id of the emergency admin role function EMERGENCY_ADMIN_ROLE() external view returns (bytes32); /// @dev returns the id of the payment admin role function PAYMENT_ADMIN_ROLE() external view returns (bytes32); /// @dev returns the id of the broadcaster role function BROADCASTER_ROLE() external view returns (bytes32); /// @dev returns the id of the core state registry processor role function CORE_STATE_REGISTRY_PROCESSOR_ROLE() external view returns (bytes32); /// @dev returns the id of the timelock state registry processor role function TIMELOCK_STATE_REGISTRY_PROCESSOR_ROLE() external view returns (bytes32); /// @dev returns the id of the broadcast state registry processor role function BROADCAST_STATE_REGISTRY_PROCESSOR_ROLE() external view returns (bytes32); /// @dev returns the id of the core state registry updater role function CORE_STATE_REGISTRY_UPDATER_ROLE() external view returns (bytes32); /// @dev returns the id of the dst swapper role function DST_SWAPPER_ROLE() external view returns (bytes32); /// @dev returns the id of the core state registry rescuer role function CORE_STATE_REGISTRY_RESCUER_ROLE() external view returns (bytes32); /// @dev returns the id of the core state registry rescue disputer role function CORE_STATE_REGISTRY_DISPUTER_ROLE() external view returns (bytes32); /// @dev returns the id of wormhole vaa relayer role function WORMHOLE_VAA_RELAYER_ROLE() external view returns (bytes32); /// @dev returns whether the given address has the protocol admin role /// @param admin_ the address to check function hasProtocolAdminRole(address admin_) external view returns (bool); /// @dev returns whether the given address has the emergency admin role /// @param admin_ the address to check function hasEmergencyAdminRole(address admin_) external view returns (bool); ////////////////////////////////////////////////////////////// // EXTERNAL WRITE FUNCTIONS // ////////////////////////////////////////////////////////////// /// @dev updates the super registry address function setSuperRegistry(address superRegistry_) external; /// @dev configures a new role in superForm /// @param role_ the role to set /// @param adminRole_ the admin role to set as admin function setRoleAdmin(bytes32 role_, bytes32 adminRole_) external; /// @dev revokes the role_ from superRegistryAddressId_ on all chains /// @param role_ the role to revoke /// @param extraData_ amb config if broadcasting is required /// @param superRegistryAddressId_ the super registry address id function revokeRoleSuperBroadcast( bytes32 role_, bytes memory extraData_, bytes32 superRegistryAddressId_ ) external payable; /// @dev allows sync of global roles from different chains using broadcast registry /// @notice may not work for all roles function stateSyncBroadcast(bytes memory data_) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.23; /// @title ISuperRegistry /// @dev Interface for SuperRegistry /// @author Zeropoint Labs interface ISuperRegistry { ////////////////////////////////////////////////////////////// // EVENTS // ////////////////////////////////////////////////////////////// /// @dev emitted when permit2 is set. event SetPermit2(address indexed permit2); /// @dev is emitted when an address is set. event AddressUpdated( bytes32 indexed protocolAddressId, uint64 indexed chainId, address indexed oldAddress, address newAddress ); /// @dev is emitted when a new token bridge is configured. event SetBridgeAddress(uint256 indexed bridgeId, address indexed bridgeAddress); /// @dev is emitted when a new bridge validator is configured. event SetBridgeValidator(uint256 indexed bridgeId, address indexed bridgeValidator); /// @dev is emitted when a new amb is configured. event SetAmbAddress(uint8 indexed ambId_, address indexed ambAddress_, bool indexed isBroadcastAMB_); /// @dev is emitted when a new state registry is configured. event SetStateRegistryAddress(uint8 indexed registryId_, address indexed registryAddress_); /// @dev is emitted when a new delay is configured. event SetDelay(uint256 indexed oldDelay_, uint256 indexed newDelay_); /// @dev is emitted when a new vault limit is configured event SetVaultLimitPerDestination(uint64 indexed chainId_, uint256 indexed vaultLimit_); ////////////////////////////////////////////////////////////// // EXTERNAL VIEW FUNCTIONS // ////////////////////////////////////////////////////////////// /// @dev gets the deposit rescue delay function delay() external view returns (uint256); /// @dev returns the permit2 address function PERMIT2() external view returns (address); /// @dev returns the id of the superform router module function SUPERFORM_ROUTER() external view returns (bytes32); /// @dev returns the id of the superform factory module function SUPERFORM_FACTORY() external view returns (bytes32); /// @dev returns the id of the superform paymaster contract function PAYMASTER() external view returns (bytes32); /// @dev returns the id of the superform payload helper contract function PAYMENT_HELPER() external view returns (bytes32); /// @dev returns the id of the core state registry module function CORE_STATE_REGISTRY() external view returns (bytes32); /// @dev returns the id of the timelock form state registry module function TIMELOCK_STATE_REGISTRY() external view returns (bytes32); /// @dev returns the id of the broadcast state registry module function BROADCAST_REGISTRY() external view returns (bytes32); /// @dev returns the id of the super positions module function SUPER_POSITIONS() external view returns (bytes32); /// @dev returns the id of the super rbac module function SUPER_RBAC() external view returns (bytes32); /// @dev returns the id of the payload helper module function PAYLOAD_HELPER() external view returns (bytes32); /// @dev returns the id of the dst swapper keeper function DST_SWAPPER() external view returns (bytes32); /// @dev returns the id of the emergency queue function EMERGENCY_QUEUE() external view returns (bytes32); /// @dev returns the id of the superform receiver function SUPERFORM_RECEIVER() external view returns (bytes32); /// @dev returns the id of the payment admin keeper function PAYMENT_ADMIN() external view returns (bytes32); /// @dev returns the id of the core state registry processor keeper function CORE_REGISTRY_PROCESSOR() external view returns (bytes32); /// @dev returns the id of the broadcast registry processor keeper function BROADCAST_REGISTRY_PROCESSOR() external view returns (bytes32); /// @dev returns the id of the timelock form state registry processor keeper function TIMELOCK_REGISTRY_PROCESSOR() external view returns (bytes32); /// @dev returns the id of the core state registry updater keeper function CORE_REGISTRY_UPDATER() external view returns (bytes32); /// @dev returns the id of the core state registry updater keeper function CORE_REGISTRY_RESCUER() external view returns (bytes32); /// @dev returns the id of the core state registry updater keeper function CORE_REGISTRY_DISPUTER() external view returns (bytes32); /// @dev returns the id of the core state registry updater keeper function DST_SWAPPER_PROCESSOR() external view returns (bytes32); /// @dev gets the address of a contract on current chain /// @param id_ is the id of the contract function getAddress(bytes32 id_) external view returns (address); /// @dev gets the address of a contract on a target chain /// @param id_ is the id of the contract /// @param chainId_ is the chain id of that chain function getAddressByChainId(bytes32 id_, uint64 chainId_) external view returns (address); /// @dev gets the address of a bridge /// @param bridgeId_ is the id of a bridge /// @return bridgeAddress_ is the address of the form function getBridgeAddress(uint8 bridgeId_) external view returns (address bridgeAddress_); /// @dev gets the address of a bridge validator /// @param bridgeId_ is the id of a bridge /// @return bridgeValidator_ is the address of the form function getBridgeValidator(uint8 bridgeId_) external view returns (address bridgeValidator_); /// @dev gets the address of a amb /// @param ambId_ is the id of a bridge /// @return ambAddress_ is the address of the form function getAmbAddress(uint8 ambId_) external view returns (address ambAddress_); /// @dev gets the id of the amb /// @param ambAddress_ is the address of an amb /// @return ambId_ is the identifier of an amb function getAmbId(address ambAddress_) external view returns (uint8 ambId_); /// @dev gets the address of the registry /// @param registryId_ is the id of the state registry /// @return registryAddress_ is the address of the state registry function getStateRegistry(uint8 registryId_) external view returns (address registryAddress_); /// @dev gets the id of the registry /// @notice reverts if the id is not found /// @param registryAddress_ is the address of the state registry /// @return registryId_ is the id of the state registry function getStateRegistryId(address registryAddress_) external view returns (uint8 registryId_); /// @dev gets the safe vault limit /// @param chainId_ is the id of the remote chain /// @return vaultLimitPerDestination_ is the safe number of vaults to deposit /// without hitting out of gas error function getVaultLimitPerDestination(uint64 chainId_) external view returns (uint256 vaultLimitPerDestination_); /// @dev helps validate if an address is a valid state registry /// @param registryAddress_ is the address of the state registry /// @return valid_ a flag indicating if its valid. function isValidStateRegistry(address registryAddress_) external view returns (bool valid_); /// @dev helps validate if an address is a valid amb implementation /// @param ambAddress_ is the address of the amb implementation /// @return valid_ a flag indicating if its valid. function isValidAmbImpl(address ambAddress_) external view returns (bool valid_); /// @dev helps validate if an address is a valid broadcast amb implementation /// @param ambAddress_ is the address of the broadcast amb implementation /// @return valid_ a flag indicating if its valid. function isValidBroadcastAmbImpl(address ambAddress_) external view returns (bool valid_); ////////////////////////////////////////////////////////////// // EXTERNAL WRITE FUNCTIONS // ////////////////////////////////////////////////////////////// /// @dev sets the deposit rescue delay /// @param delay_ the delay in seconds before the deposit rescue can be finalized function setDelay(uint256 delay_) external; /// @dev sets the permit2 address /// @param permit2_ the address of the permit2 contract function setPermit2(address permit2_) external; /// @dev sets the safe vault limit /// @param chainId_ is the remote chain identifier /// @param vaultLimit_ is the max limit of vaults per transaction function setVaultLimitPerDestination(uint64 chainId_, uint256 vaultLimit_) external; /// @dev sets new addresses on specific chains. /// @param ids_ are the identifiers of the address on that chain /// @param newAddresses_ are the new addresses on that chain /// @param chainIds_ are the chain ids of that chain function batchSetAddress( bytes32[] calldata ids_, address[] calldata newAddresses_, uint64[] calldata chainIds_ ) external; /// @dev sets a new address on a specific chain. /// @param id_ the identifier of the address on that chain /// @param newAddress_ the new address on that chain /// @param chainId_ the chain id of that chain function setAddress(bytes32 id_, address newAddress_, uint64 chainId_) external; /// @dev allows admin to set the bridge address for an bridge id. /// @notice this function operates in an APPEND-ONLY fashion. /// @param bridgeId_ represents the bridge unique identifier. /// @param bridgeAddress_ represents the bridge address. /// @param bridgeValidator_ represents the bridge validator address. function setBridgeAddresses( uint8[] memory bridgeId_, address[] memory bridgeAddress_, address[] memory bridgeValidator_ ) external; /// @dev allows admin to set the amb address for an amb id. /// @notice this function operates in an APPEND-ONLY fashion. /// @param ambId_ represents the bridge unique identifier. /// @param ambAddress_ represents the bridge address. /// @param isBroadcastAMB_ represents whether the amb implementation supports broadcasting function setAmbAddress( uint8[] memory ambId_, address[] memory ambAddress_, bool[] memory isBroadcastAMB_ ) external; /// @dev allows admin to set the state registry address for an state registry id. /// @notice this function operates in an APPEND-ONLY fashion. /// @param registryId_ represents the state registry's unique identifier. /// @param registryAddress_ represents the state registry's address. function setStateRegistryAddress(uint8[] memory registryId_, address[] memory registryAddress_) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.23; library Error { ////////////////////////////////////////////////////////////// // CONFIGURATION ERRORS // ////////////////////////////////////////////////////////////// ///@notice errors thrown in protocol setup /// @dev thrown if chain id exceeds max(uint64) error BLOCK_CHAIN_ID_OUT_OF_BOUNDS(); /// @dev thrown if not possible to revoke a role in broadcasting error CANNOT_REVOKE_NON_BROADCASTABLE_ROLES(); /// @dev thrown if not possible to revoke last admin error CANNOT_REVOKE_LAST_ADMIN(); /// @dev thrown if trying to set again pseudo immutables in super registry error DISABLED(); /// @dev thrown if rescue delay is not yet set for a chain error DELAY_NOT_SET(); /// @dev thrown if get native token price estimate in paymentHelper is 0 error INVALID_NATIVE_TOKEN_PRICE(); /// @dev thrown if wormhole refund chain id is not set error REFUND_CHAIN_ID_NOT_SET(); /// @dev thrown if wormhole relayer is not set error RELAYER_NOT_SET(); /// @dev thrown if a role to be revoked is not assigned error ROLE_NOT_ASSIGNED(); ////////////////////////////////////////////////////////////// // AUTHORIZATION ERRORS // ////////////////////////////////////////////////////////////// ///@notice errors thrown if functions cannot be called /// COMMON AUTHORIZATION ERRORS /// --------------------------------------------------------- /// @dev thrown if caller is not address(this), internal call error INVALID_INTERNAL_CALL(); /// @dev thrown if msg.sender is not a valid amb implementation error NOT_AMB_IMPLEMENTATION(); /// @dev thrown if msg.sender is not an allowed broadcaster error NOT_ALLOWED_BROADCASTER(); /// @dev thrown if msg.sender is not broadcast amb implementation error NOT_BROADCAST_AMB_IMPLEMENTATION(); /// @dev thrown if msg.sender is not broadcast state registry error NOT_BROADCAST_REGISTRY(); /// @dev thrown if msg.sender is not core state registry error NOT_CORE_STATE_REGISTRY(); /// @dev thrown if msg.sender is not emergency admin error NOT_EMERGENCY_ADMIN(); /// @dev thrown if msg.sender is not emergency queue error NOT_EMERGENCY_QUEUE(); /// @dev thrown if msg.sender is not minter error NOT_MINTER(); /// @dev thrown if msg.sender is not minter state registry error NOT_MINTER_STATE_REGISTRY_ROLE(); /// @dev thrown if msg.sender is not paymaster error NOT_PAYMASTER(); /// @dev thrown if msg.sender is not payment admin error NOT_PAYMENT_ADMIN(); /// @dev thrown if msg.sender is not protocol admin error NOT_PROTOCOL_ADMIN(); /// @dev thrown if msg.sender is not state registry error NOT_STATE_REGISTRY(); /// @dev thrown if msg.sender is not super registry error NOT_SUPER_REGISTRY(); /// @dev thrown if msg.sender is not superform router error NOT_SUPERFORM_ROUTER(); /// @dev thrown if msg.sender is not a superform error NOT_SUPERFORM(); /// @dev thrown if msg.sender is not superform factory error NOT_SUPERFORM_FACTORY(); /// @dev thrown if msg.sender is not timelock form error NOT_TIMELOCK_SUPERFORM(); /// @dev thrown if msg.sender is not timelock state registry error NOT_TIMELOCK_STATE_REGISTRY(); /// @dev thrown if msg.sender is not user or disputer error NOT_VALID_DISPUTER(); /// @dev thrown if the msg.sender is not privileged caller error NOT_PRIVILEGED_CALLER(bytes32 role); /// STATE REGISTRY AUTHORIZATION ERRORS /// --------------------------------------------------------- /// @dev layerzero adapter specific error, thrown if caller not layerzero endpoint error CALLER_NOT_ENDPOINT(); /// @dev hyperlane adapter specific error, thrown if caller not hyperlane mailbox error CALLER_NOT_MAILBOX(); /// @dev wormhole relayer specific error, thrown if caller not wormhole relayer error CALLER_NOT_RELAYER(); /// @dev thrown if src chain sender is not valid error INVALID_SRC_SENDER(); ////////////////////////////////////////////////////////////// // INPUT VALIDATION ERRORS // ////////////////////////////////////////////////////////////// ///@notice errors thrown if input variables are not valid /// COMMON INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if there is an array length mismatch error ARRAY_LENGTH_MISMATCH(); /// @dev thrown if payload id does not exist error INVALID_PAYLOAD_ID(); /// @dev error thrown when msg value should be zero in certain payable functions error MSG_VALUE_NOT_ZERO(); /// @dev thrown if amb ids length is 0 error ZERO_AMB_ID_LENGTH(); /// @dev thrown if address input is address 0 error ZERO_ADDRESS(); /// @dev thrown if amount input is 0 error ZERO_AMOUNT(); /// @dev thrown if final token is address 0 error ZERO_FINAL_TOKEN(); /// @dev thrown if value input is 0 error ZERO_INPUT_VALUE(); /// SUPERFORM ROUTER INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if the vaults data is invalid error INVALID_SUPERFORMS_DATA(); /// @dev thrown if receiver address is not set error RECEIVER_ADDRESS_NOT_SET(); /// SUPERFORM FACTORY INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if a form is not ERC165 compatible error ERC165_UNSUPPORTED(); /// @dev thrown if a form is not form interface compatible error FORM_INTERFACE_UNSUPPORTED(); /// @dev error thrown if form implementation address already exists error FORM_IMPLEMENTATION_ALREADY_EXISTS(); /// @dev error thrown if form implementation id already exists error FORM_IMPLEMENTATION_ID_ALREADY_EXISTS(); /// @dev thrown if a form does not exist error FORM_DOES_NOT_EXIST(); /// @dev thrown if form id is larger than max uint16 error INVALID_FORM_ID(); /// @dev thrown if superform not on factory error SUPERFORM_ID_NONEXISTENT(); /// @dev thrown if same vault and form implementation is used to create new superform error VAULT_FORM_IMPLEMENTATION_COMBINATION_EXISTS(); /// FORM INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if in case of no txData, if liqData.token != vault.asset() /// in case of txData, if token output of swap != vault.asset() error DIFFERENT_TOKENS(); /// @dev thrown if the amount in direct withdraw is not correct error DIRECT_WITHDRAW_INVALID_LIQ_REQUEST(); /// @dev thrown if the amount in xchain withdraw is not correct error XCHAIN_WITHDRAW_INVALID_LIQ_REQUEST(); /// LIQUIDITY BRIDGE INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if route id is blacklisted in socket error BLACKLISTED_ROUTE_ID(); /// @dev thrown if route id is not blacklisted in socket error NOT_BLACKLISTED_ROUTE_ID(); /// @dev error thrown when txData selector of lifi bridge is a blacklisted selector error BLACKLISTED_SELECTOR(); /// @dev error thrown when txData selector of lifi bridge is not a blacklisted selector error NOT_BLACKLISTED_SELECTOR(); /// @dev thrown if a certain action of the user is not allowed given the txData provided error INVALID_ACTION(); /// @dev thrown if in deposits, the liqDstChainId doesn't match the stateReq dstChainId error INVALID_DEPOSIT_LIQ_DST_CHAIN_ID(); /// @dev thrown if index is invalid error INVALID_INDEX(); /// @dev thrown if the chain id in the txdata is invalid error INVALID_TXDATA_CHAIN_ID(); /// @dev thrown if the validation of bridge txData fails due to a destination call present error INVALID_TXDATA_NO_DESTINATIONCALL_ALLOWED(); /// @dev thrown if the validation of bridge txData fails due to wrong receiver error INVALID_TXDATA_RECEIVER(); /// @dev thrown if the validation of bridge txData fails due to wrong token error INVALID_TXDATA_TOKEN(); /// @dev thrown if txData is not present (in case of xChain actions) error NO_TXDATA_PRESENT(); /// STATE REGISTRY INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if payload is being updated with final amounts length different than amounts length error DIFFERENT_PAYLOAD_UPDATE_AMOUNTS_LENGTH(); /// @dev thrown if payload is being updated with tx data length different than liq data length error DIFFERENT_PAYLOAD_UPDATE_TX_DATA_LENGTH(); /// @dev thrown if keeper update final token is different than the vault underlying error INVALID_UPDATE_FINAL_TOKEN(); /// @dev thrown if broadcast finality for wormhole is invalid error INVALID_BROADCAST_FINALITY(); /// @dev thrown if amb id is not valid leading to an address 0 of the implementation error INVALID_BRIDGE_ID(); /// @dev thrown if chain id involved in xchain message is invalid error INVALID_CHAIN_ID(); /// @dev thrown if payload update amount isn't equal to dst swapper amount error INVALID_DST_SWAP_AMOUNT(); /// @dev thrown if message amb and proof amb are the same error INVALID_PROOF_BRIDGE_ID(); /// @dev thrown if order of proof AMBs is incorrect, either duplicated or not incrementing error INVALID_PROOF_BRIDGE_IDS(); /// @dev thrown if rescue data lengths are invalid error INVALID_RESCUE_DATA(); /// @dev thrown if delay is invalid error INVALID_TIMELOCK_DELAY(); /// @dev thrown if amounts being sent in update payload mean a negative slippage error NEGATIVE_SLIPPAGE(); /// @dev thrown if slippage is outside of bounds error SLIPPAGE_OUT_OF_BOUNDS(); /// SUPERPOSITION INPUT VALIDATION ERRORS /// --------------------------------------------------------- /// @dev thrown if src senders mismatch in state sync error SRC_SENDER_MISMATCH(); /// @dev thrown if src tx types mismatch in state sync error SRC_TX_TYPE_MISMATCH(); ////////////////////////////////////////////////////////////// // EXECUTION ERRORS // ////////////////////////////////////////////////////////////// ///@notice errors thrown due to function execution logic /// COMMON EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if the swap in a direct deposit resulted in insufficient tokens error DIRECT_DEPOSIT_SWAP_FAILED(); /// @dev thrown if payload is not unique error DUPLICATE_PAYLOAD(); /// @dev thrown if native tokens fail to be sent to superform contracts error FAILED_TO_SEND_NATIVE(); /// @dev thrown if allowance is not correct to deposit error INSUFFICIENT_ALLOWANCE_FOR_DEPOSIT(); /// @dev thrown if contract has insufficient balance for operations error INSUFFICIENT_BALANCE(); /// @dev thrown if native amount is not at least equal to the amount in the request error INSUFFICIENT_NATIVE_AMOUNT(); /// @dev thrown if payload cannot be decoded error INVALID_PAYLOAD(); /// @dev thrown if payload status is invalid error INVALID_PAYLOAD_STATUS(); /// @dev thrown if payload type is invalid error INVALID_PAYLOAD_TYPE(); /// LIQUIDITY BRIDGE EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if we try to decode the final swap output token in a xChain liquidity bridging action error CANNOT_DECODE_FINAL_SWAP_OUTPUT_TOKEN(); /// @dev thrown if liquidity bridge fails for erc20 or native tokens error FAILED_TO_EXECUTE_TXDATA(address token); /// @dev thrown if asset being used for deposit mismatches in multivault deposits error INVALID_DEPOSIT_TOKEN(); /// STATE REGISTRY EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if bridge tokens haven't arrived to destination error BRIDGE_TOKENS_PENDING(); /// @dev thrown if withdrawal tx data cannot be updated error CANNOT_UPDATE_WITHDRAW_TX_DATA(); /// @dev thrown if rescue passed dispute deadline error DISPUTE_TIME_ELAPSED(); /// @dev thrown if message failed to reach the specified level of quorum needed error INSUFFICIENT_QUORUM(); /// @dev thrown if broadcast payload is invalid error INVALID_BROADCAST_PAYLOAD(); /// @dev thrown if broadcast fee is invalid error INVALID_BROADCAST_FEE(); /// @dev thrown if retry fees is less than required error INVALID_RETRY_FEE(); /// @dev thrown if broadcast message type is wrong error INVALID_MESSAGE_TYPE(); /// @dev thrown if payload hash is invalid during `retryMessage` on Layezero implementation error INVALID_PAYLOAD_HASH(); /// @dev thrown if update payload function was called on a wrong payload error INVALID_PAYLOAD_UPDATE_REQUEST(); /// @dev thrown if a state registry id is 0 error INVALID_REGISTRY_ID(); /// @dev thrown if a form state registry id is 0 error INVALID_FORM_REGISTRY_ID(); /// @dev thrown if trying to finalize the payload but the withdraw is still locked error LOCKED(); /// @dev thrown if payload is already updated (during xChain deposits) error PAYLOAD_ALREADY_UPDATED(); /// @dev thrown if payload is already processed error PAYLOAD_ALREADY_PROCESSED(); /// @dev thrown if payload is not in UPDATED state error PAYLOAD_NOT_UPDATED(); /// @dev thrown if rescue is still in timelocked state error RESCUE_LOCKED(); /// @dev thrown if rescue is already proposed error RESCUE_ALREADY_PROPOSED(); /// @dev thrown if payload hash is zero during `retryMessage` on Layezero implementation error ZERO_PAYLOAD_HASH(); /// DST SWAPPER EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if process dst swap is tried for processed payload id error DST_SWAP_ALREADY_PROCESSED(); /// @dev thrown if indices have duplicates error DUPLICATE_INDEX(); /// @dev thrown if failed dst swap is already updated error FAILED_DST_SWAP_ALREADY_UPDATED(); /// @dev thrown if indices are out of bounds error INDEX_OUT_OF_BOUNDS(); /// @dev thrown if failed swap token amount is 0 error INVALID_DST_SWAPPER_FAILED_SWAP(); /// @dev thrown if failed swap token amount is not 0 and if token balance is less than amount (non zero) error INVALID_DST_SWAPPER_FAILED_SWAP_NO_TOKEN_BALANCE(); /// @dev thrown if failed swap token amount is not 0 and if native amount is less than amount (non zero) error INVALID_DST_SWAPPER_FAILED_SWAP_NO_NATIVE_BALANCE(); /// @dev forbid xChain deposits with destination swaps without interim token set (for user protection) error INVALID_INTERIM_TOKEN(); /// @dev thrown if dst swap output is less than minimum expected error INVALID_SWAP_OUTPUT(); /// FORM EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if try to forward 4626 share from the superform error CANNOT_FORWARD_4646_TOKEN(); /// @dev thrown in KYCDAO form if no KYC token is present error NO_VALID_KYC_TOKEN(); /// @dev thrown in forms where a certain functionality is not allowed or implemented error NOT_IMPLEMENTED(); /// @dev thrown if form implementation is PAUSED, users cannot perform any action error PAUSED(); /// @dev thrown if shares != deposit output or assets != redeem output when minting SuperPositions error VAULT_IMPLEMENTATION_FAILED(); /// @dev thrown if withdrawal tx data is not updated error WITHDRAW_TOKEN_NOT_UPDATED(); /// @dev thrown if withdrawal tx data is not updated error WITHDRAW_TX_DATA_NOT_UPDATED(); /// @dev thrown when redeeming from vault yields zero collateral error WITHDRAW_ZERO_COLLATERAL(); /// PAYMENT HELPER EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if chainlink is reporting an improper price error CHAINLINK_MALFUNCTION(); /// @dev thrown if chainlink is reporting an incomplete round error CHAINLINK_INCOMPLETE_ROUND(); /// @dev thrown if feed decimals is not 8 error CHAINLINK_UNSUPPORTED_DECIMAL(); /// EMERGENCY QUEUE EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if emergency withdraw is not queued error EMERGENCY_WITHDRAW_NOT_QUEUED(); /// @dev thrown if emergency withdraw is already processed error EMERGENCY_WITHDRAW_PROCESSED_ALREADY(); /// SUPERPOSITION EXECUTION ERRORS /// --------------------------------------------------------- /// @dev thrown if uri cannot be updated error DYNAMIC_URI_FROZEN(); /// @dev thrown if tx history is not found while state sync error TX_HISTORY_NOT_FOUND(); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.23; /// @title IQuorumManager /// @dev Interface for QuorumManager /// @author ZeroPoint Labs interface IQuorumManager { ////////////////////////////////////////////////////////////// // EVENTS // ////////////////////////////////////////////////////////////// /// @dev emitted when a new quorum is set for a specific chain /// @param srcChainId the chain id from which the message (payload) is sent /// @param quorum the minimum number of message bridges required for processing event QuorumSet(uint64 indexed srcChainId, uint256 indexed quorum); ////////////////////////////////////////////////////////////// // EXTERNAL VIEW FUNCTIONS // ////////////////////////////////////////////////////////////// /// @dev returns the required quorum for the srcChain & dstChain /// @param srcChainId_ is the chain id from which the message (payload) is sent /// @return quorum_ the minimum number of message bridges required for processing function getRequiredMessagingQuorum(uint64 srcChainId_) external view returns (uint256 quorum_); ////////////////////////////////////////////////////////////// // EXTERNAL WRITE FUNCTIONS // ////////////////////////////////////////////////////////////// /// @dev allows inheriting contracts to set the messaging quorum for a specific sender chain /// @notice quorum is the number of extra ambs a message proof must go through and be validated /// @param srcChainId_ is the chain id from which the message (payload) is sent /// @param quorum_ the minimum number of message bridges required for processing /// NOTE: overriding child contracts should handle the sender validation & setting of message quorum function setRequiredMessagingQuorum(uint64 srcChainId_, uint256 quorum_) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
{ "remappings": [ "solmate/=lib/ERC1155A/lib/solmate/src/", "@openzeppelin/contracts/=lib/ERC1155A/lib/openzeppelin-contracts/contracts/", "ERC1155A/=lib/ERC1155A/src/", "ds-test/=lib/ds-test/src/", "erc4626-tests/=lib/ERC1155A/lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/ERC1155A/lib/openzeppelin-contracts/", "pigeon/=lib/pigeon/src/", "solady/=lib/pigeon/lib/solady/", "super-vaults/=lib/super-vaults/src/", "v2-core/=lib/super-vaults/lib/v2-core/contracts/", "v2-periphery/=lib/super-vaults/lib/v2-periphery/contracts/", "v3-core/=lib/super-vaults/lib/v3-core/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"superRBAC_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ARRAY_LENGTH_MISMATCH","type":"error"},{"inputs":[],"name":"BLOCK_CHAIN_ID_OUT_OF_BOUNDS","type":"error"},{"inputs":[],"name":"DISABLED","type":"error"},{"inputs":[],"name":"INVALID_CHAIN_ID","type":"error"},{"inputs":[],"name":"INVALID_REGISTRY_ID","type":"error"},{"inputs":[],"name":"INVALID_TIMELOCK_DELAY","type":"error"},{"inputs":[],"name":"NOT_EMERGENCY_ADMIN","type":"error"},{"inputs":[],"name":"NOT_PROTOCOL_ADMIN","type":"error"},{"inputs":[],"name":"ZERO_ADDRESS","type":"error"},{"inputs":[],"name":"ZERO_INPUT_VALUE","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"protocolAddressId","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"chainId","type":"uint64"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"AddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"QuorumSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"ambId_","type":"uint8"},{"indexed":true,"internalType":"address","name":"ambAddress_","type":"address"},{"indexed":true,"internalType":"bool","name":"isBroadcastAMB_","type":"bool"}],"name":"SetAmbAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bridgeId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bridgeAddress","type":"address"}],"name":"SetBridgeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bridgeId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bridgeValidator","type":"address"}],"name":"SetBridgeValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"oldDelay_","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newDelay_","type":"uint256"}],"name":"SetDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"permit2","type":"address"}],"name":"SetPermit2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"registryId_","type":"uint8"},{"indexed":true,"internalType":"address","name":"registryAddress_","type":"address"}],"name":"SetStateRegistryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"chainId_","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"vaultLimit_","type":"uint256"}],"name":"SetVaultLimitPerDestination","type":"event"},{"inputs":[],"name":"BROADCAST_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BROADCAST_REGISTRY_PROCESSOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAIN_ID","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CORE_REGISTRY_DISPUTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CORE_REGISTRY_PROCESSOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CORE_REGISTRY_RESCUER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CORE_REGISTRY_UPDATER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CORE_STATE_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DST_SWAPPER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DST_SWAPPER_PROCESSOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_QUEUE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYLOAD_HELPER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMASTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_HELPER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERFORM_FACTORY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERFORM_RECEIVER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERFORM_ROUTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPER_POSITIONS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPER_RBAC","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_REGISTRY_PROCESSOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIMELOCK_STATE_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"ambId","type":"uint8"}],"name":"ambAddresses","outputs":[{"internalType":"address","name":"ambAddresses","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ambAddress","type":"address"}],"name":"ambIds","outputs":[{"internalType":"uint8","name":"ambId","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ids_","type":"bytes32[]"},{"internalType":"address[]","name":"newAddresses_","type":"address[]"},{"internalType":"uint64[]","name":"chainIds_","type":"uint64[]"}],"name":"batchSetAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"bridgeId","type":"uint8"}],"name":"bridgeAddresses","outputs":[{"internalType":"address","name":"bridgeAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"bridgeId","type":"uint8"}],"name":"bridgeValidator","outputs":[{"internalType":"address","name":"bridgeValidator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id_","type":"bytes32"}],"name":"getAddress","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id_","type":"bytes32"},{"internalType":"uint64","name":"chainId_","type":"uint64"}],"name":"getAddressByChainId","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"ambId_","type":"uint8"}],"name":"getAmbAddress","outputs":[{"internalType":"address","name":"ambAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ambAddress_","type":"address"}],"name":"getAmbId","outputs":[{"internalType":"uint8","name":"ambId_","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"bridgeId_","type":"uint8"}],"name":"getBridgeAddress","outputs":[{"internalType":"address","name":"bridgeAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"bridgeId_","type":"uint8"}],"name":"getBridgeValidator","outputs":[{"internalType":"address","name":"bridgeValidator_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId_","type":"uint64"}],"name":"getRequiredMessagingQuorum","outputs":[{"internalType":"uint256","name":"quorum_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"registryId_","type":"uint8"}],"name":"getStateRegistry","outputs":[{"internalType":"address","name":"registryAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress_","type":"address"}],"name":"getStateRegistryId","outputs":[{"internalType":"uint8","name":"registryId_","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId_","type":"uint64"}],"name":"getVaultLimitPerDestination","outputs":[{"internalType":"uint256","name":"vaultLimitPerDestination_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"ambId","type":"uint8"}],"name":"isBroadcastAMB","outputs":[{"internalType":"bool","name":"isBroadcastAMB","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ambAddress_","type":"address"}],"name":"isValidAmbImpl","outputs":[{"internalType":"bool","name":"valid_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ambAddress_","type":"address"}],"name":"isValidBroadcastAmbImpl","outputs":[{"internalType":"bool","name":"valid_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress_","type":"address"}],"name":"isValidStateRegistry","outputs":[{"internalType":"bool","name":"valid_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"registryId","type":"uint8"}],"name":"registryAddresses","outputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id_","type":"bytes32"},{"internalType":"address","name":"newAddress_","type":"address"},{"internalType":"uint64","name":"chainId_","type":"uint64"}],"name":"setAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"ambId_","type":"uint8[]"},{"internalType":"address[]","name":"ambAddress_","type":"address[]"},{"internalType":"bool[]","name":"isBroadcastAMB_","type":"bool[]"}],"name":"setAmbAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"bridgeId_","type":"uint8[]"},{"internalType":"address[]","name":"bridgeAddress_","type":"address[]"},{"internalType":"address[]","name":"bridgeValidator_","type":"address[]"}],"name":"setBridgeAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delay_","type":"uint256"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"permit2_","type":"address"}],"name":"setPermit2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId_","type":"uint64"},{"internalType":"uint256","name":"quorum_","type":"uint256"}],"name":"setRequiredMessagingQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"registryId_","type":"uint8[]"},{"internalType":"address[]","name":"registryAddress_","type":"address[]"}],"name":"setStateRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId_","type":"uint64"},{"internalType":"uint256","name":"vaultLimit_","type":"uint256"}],"name":"setVaultLimitPerDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"stateRegistryIds","outputs":[{"internalType":"uint8","name":"registryId","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"}],"name":"vaultLimitPerDestination","outputs":[{"internalType":"uint256","name":"vaultLimitPerDestination","type":"uint256"}],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103405760003560e01c80638878b4e3116101b8578063c3d699d711610104578063dfcf829b116100a2578063e85b2b541161007c578063e85b2b54146109b0578063edad76aa146109c3578063eeaf54aa146109d6578063f7c677e4146109e957600080fd5b8063dfcf829b14610961578063e177246e14610974578063e744b10f1461098757600080fd5b8063caac9a8e116100de578063caac9a8e146108d5578063cc2deb0e146108e8578063d0e504e714610911578063dd93465a1461093a57600080fd5b8063c3d699d714610874578063c4a556211461089b578063ca7adffb146108c257600080fd5b80639d62a6ed11610171578063bbe557b91161014b578063bbe557b9146107ea578063bd8b96ee14610811578063be580cf414610838578063bffc1e131461084b57600080fd5b80639d62a6ed14610775578063a6e3fad51461079c578063bbadb52b146107c357600080fd5b80638878b4e3146106b35780638a54adf7146106da5780638d3366541461070157806395fdab87146107145780639914e6f8146107275780639a5988fa1461074e57600080fd5b806334cbf15511610292578063695b5dfb116102305780637f2454861161020a5780637f2454861461061a57806382c78fb81461063a5780638375cb921461066157806385e1f4d01461067457600080fd5b8063695b5dfb146105e25780636a42b8f8146106095780636afdd8501461061257600080fd5b806357203ab41161026c57806357203ab41461056e5780635c504b601461058157806360cfb8e114610594578063650c3942146105bb57600080fd5b806334cbf155146104f757806341965eee1461052057806346cea3fb1461054757600080fd5b80630df46b4b116102ff5780631049a0db116102d95780631049a0db146104ab57806321f8a721146104be5780632f6438ab146104d157806331949bb3146104e457600080fd5b80630df46b4b1461043a5780630eff125d1461046d578063101ec30a1461049857600080fd5b806266f83514610345578062ea38211461037f578063024ba9aa146103a2578063040b14da146103d75780630896ea2a146103ec57806308aa553814610413575b600080fd5b610368610353366004611eaf565b600b6020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b61036861038d366004611eaf565b600a6020526000908152604090205460ff1681565b6103c97f6b50fa17b77d24e42e27a04b69fe50cd6967cfb767d18de0bd5fe7e1a32aa86881565b604051908152602001610376565b6103ea6103e5366004611ee8565b610a15565b005b6103c97f816be8d6eaff6d180ca78a92019c22ceea9b16b75ba6ef9ec600304a9b6cdad781565b6103c97fab437a16135e856111e538dc45051dd9c2778c6069d25a22fb9ac4766c356aa181565b61045d610448366004611f23565b60076020526000908152604090205460ff1681565b6040519015158152602001610376565b61048061047b366004611f23565b610b53565b6040516001600160a01b039091168152602001610376565b6103ea6104a6366004611eaf565b610b92565b6103c96104b9366004611f3e565b610cfa565b6104806104cc366004611f59565b610d42565b6103686104df366004611eaf565b610dac565b6103ea6104f23660046120b7565b610de9565b610480610505366004611f23565b6006602052600090815260409020546001600160a01b031681565b6103c97fa2d83cf6f43caf068994e5ffe0938f6eabaa551d915b59bfda16ba012d30d96881565b6103c97fba0b74768b1de73590a53e1384870dcbc846e5c73bab23c07d71eaa7cbf8411b81565b61048061057c366004611f23565b61102e565b61045d61058f366004611eaf565b611068565b6103c97f86a7f6b88da6de42c331676d4da78508adfef4970dc8aa541004f26b6eef4ab981565b6103c97f3a2f5529773e03d975be44bdae98a8509bdf1159e407504e558536cde56cf6ac81565b6103c97fc03fcc4c77767946e7cbd87688feee0d5b2420b658fd6b1608ebce261f5b253c81565b6103c960025481565b6104806110bc565b6103c9610628366004611f3e565b60086020526000908152604090205481565b6103c97fbddfa8c39a1f6275bcfb3aa5c70638c466999edbf14e6162d81b3492caca9fce81565b6103ea61066f36600461212b565b6110f8565b61069b7f000000000000000000000000000000000000000000000000000000000000000a81565b6040516001600160401b039091168152602001610376565b6103c97fab0cccd084e90bea3aff8bc38267b4d235cb7974c46c5d1518f31a098442b5fe81565b6103c97f494dfdc880823954ed6700117eb435b9bca3643417437b5781c1a89fba6e8b9781565b6103ea61070f366004612211565b61138c565b61045d610722366004611eaf565b61169a565b6103c97f5afd87ee89bc5c3b6ea29a9fbac7886fb025e9a6d13c188071a97997d0638c7481565b6103c97f40305c72c83de5641a428a52382da2cebe59d8a94bb18c86bd9e2b3b4f31c53d81565b6103c97f70559cef11a652c41685abf00510350bb6a84790083ccc4644920da0815051e581565b6103c97fc388084dbda6b1d1135f88de86c5dd6d19975c86ee667dd5d514f732ad9b236a81565b6103c97f28d820d6a16d28d31120a3fa45794d2b3679f9b39c959c247a77199f97a274f881565b6103c97fbcc180fb907e9ae431665de4bc74305c00b7b27442aadd477980ecc4bb14c01181565b6103c97f7db5bd7a0249409b7ea7b737bcc07ca865010fa8f050fd0656b2b150c1a6c84781565b6103ea610846366004611ee8565b6116e3565b6103c9610859366004611f3e565b6001600160401b031660009081526008602052604090205490565b6103c97f50bafe7265fdcb54167be4ac0d25e2d67e08970155c397d18876726af08dda7181565b6103c97f55b101fc856aff484166c46ad33bc74831c135693c159b0092bb3b72254ffb6b81565b6104806108d0366004611f23565b611818565b6103ea6108e3366004612298565b611852565b6104806108f6366004611f23565b6005602052600090815260409020546001600160a01b031681565b61048061091f366004611f23565b6004602052600090815260409020546001600160a01b031681565b6103c97f61d4f25a58ab968b8df895503bb626f9dad221b8e0c51ebd11185d5ad489433481565b61048061096f366004612331565b6119d4565b6103ea610982366004611f59565b611a24565b610480610995366004611f23565b6009602052600090815260409020546001600160a01b031681565b6104806109be366004611f23565b611b5a565b6103ea6109d136600461235d565b611b94565b61045d6109e4366004611eaf565b611e67565b6103686109f7366004611eaf565b6001600160a01b03166000908152600b602052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac591906123e4565b610ae257604051633721555560e21b815260040160405180910390fd5b816001600160401b0316600003610b0c5760405163030042b760e01b815260040160405180910390fd5b6001600160401b038216600081815260208190526040808220849055518392917fabae4d82bb818a013d43a67ec942d1509bc94f6dcf79e659142c388077d54eb491a35050565b60ff81166000908152600660205260409020546001600160a01b031680610b8d5760405163538ba4f960e01b815260040160405180910390fd5b919050565b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906123e4565b610c5f57604051633721555560e21b815260040160405180910390fd5b6001546001600160a01b031615610c8957604051631596f13360e31b815260040160405180910390fd5b6001600160a01b038116610cb05760405163538ba4f960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f380d5e2edab82a3f66c7d34e09df1209bcfcc795939699a308fa0151c69d692090600090a250565b6000816001600160401b0316600003610d265760405163021b4ea160e01b815260040160405180910390fd5b506001600160401b031660009081526020819052604090205490565b60008181526003602090815260408083206001600160401b037f000000000000000000000000000000000000000000000000000000000000000a1684529091529020546001600160a01b031680610b8d5760405163538ba4f960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600a602052604081205460ff1690819003610b8d57604051630b70b47760e21b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9991906123e4565b610eb657604051633721555560e21b815260040160405180910390fd5b815181518114610ed957604051634456f5e960e11b815260040160405180910390fd5b60005b81811015611028576000838281518110610ef857610ef8612401565b602002602001015190506000858381518110610f1657610f16612401565b6020026020010151905060006001600160a01b0316826001600160a01b031603610f535760405163538ba4f960e01b815260040160405180910390fd5b8060ff16600003610f775760405163021b4ea160e01b815260040160405180910390fd5b60ff81166000908152600960205260409020546001600160a01b031615610fb157604051631596f13360e31b815260040160405180910390fd5b60ff8116600081815260096020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600a909252808320805460ff191685179055519092917fe989a182e1d3c0b8d65de10ffbc485da67d9817e71120f6c98235daaa65c769091a35050600101610edc565b50505050565b60ff81166000908152600960205260409020546001600160a01b031680610b8d5760405163538ba4f960e01b815260040160405180910390fd5b6001600160a01b0381166000908152600b602052604081205460ff1680158015906110a5575060ff80821660009081526007602052604090205416155b156110b35750600192915050565b50600092915050565b6001546000906001600160a01b03166110e85760405163538ba4f960e01b815260040160405180910390fd5b506001546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a891906123e4565b6111c557604051633721555560e21b815260040160405180910390fd5b82518251811415806111d8575081518114155b156111f657604051634456f5e960e11b815260040160405180910390fd5b60005b8181101561138557600084828151811061121557611215612401565b60200260200101519050600086838151811061123357611233612401565b60200260200101519050600085848151811061125157611251612401565b6020026020010151905060006001600160a01b0316836001600160a01b03160361128e5760405163538ba4f960e01b815260040160405180910390fd5b8160ff166000036112b25760405163021b4ea160e01b815260040160405180910390fd5b60ff82166000908152600660205260409020546001600160a01b0316156112ec57604051631596f13360e31b815260040160405180910390fd5b60ff8216600081815260066020908152604080832080546001600160a01b0389166001600160a01b03199091168117909155808452600b8352818420805460ff1990811687179091558585526007909352818420805487151594168417905590519193909290917fbedca897ebad5cf29700bc3df0b43a4335146d3604fa1cf228392438d91bddc69190a45050508060010190506111f9565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c91906123e4565b61145957604051633721555560e21b815260040160405180910390fd5b60008381526003602090815260408083206001600160401b03851684529091529020546001600160a01b0316801561161c577fbcc180fb907e9ae431665de4bc74305c00b7b27442aadd477980ecc4bb14c0118414806114d857507f55b101fc856aff484166c46ad33bc74831c135693c159b0092bb3b72254ffb6b84145b8061150257507f61d4f25a58ab968b8df895503bb626f9dad221b8e0c51ebd11185d5ad489433484145b8061152c57507f86a7f6b88da6de42c331676d4da78508adfef4970dc8aa541004f26b6eef4ab984145b8061155657507f6b50fa17b77d24e42e27a04b69fe50cd6967cfb767d18de0bd5fe7e1a32aa86884145b8061158057507f494dfdc880823954ed6700117eb435b9bca3643417437b5781c1a89fba6e8b9784145b806115aa57507fa2d83cf6f43caf068994e5ffe0938f6eabaa551d915b59bfda16ba012d30d96884145b806115d457507fba0b74768b1de73590a53e1384870dcbc846e5c73bab23c07d71eaa7cbf8411b84145b806115fe57507f3a2f5529773e03d975be44bdae98a8509bdf1159e407504e558536cde56cf6ac84145b1561161c57604051631596f13360e31b815260040160405180910390fd5b60008481526003602090815260408083206001600160401b0386168085529083529281902080546001600160a01b0319166001600160a01b0388811691821790925591519182528416929187917f9450a795106333047f326e0baa22a46587348e9d54f911fb0b0555457053f59b910160405180910390a450505050565b6001600160a01b0381166000908152600b602052604081205460ff1680158015906110a5575060ff80821660009081526007602052604090205416156110b35750600192915050565b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516317a0e54b60e11b81523360048201526001600160a01b0390911690632f41ca9690602401602060405180830381865afa15801561176f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179391906123e4565b6117b05760405163222d861d60e11b815260040160405180910390fd5b806000036117d15760405163021b4ea160e01b815260040160405180910390fd5b6001600160401b038216600081815260086020526040808220849055518392917f8d6fb1c21bd6883cf6a2806de2938c800100387adc035cf7f95b8e22a0ca879991a35050565b60ff81166000908152600460205260409020546001600160a01b031680610b8d5760405163538ba4f960e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906123e4565b61191f57604051633721555560e21b815260040160405180910390fd5b84838114158061192f5750808214155b1561194d57604051634456f5e960e11b815260040160405180910390fd5b60005b818110156119ca576119c288888381811061196d5761196d612401565b9050602002013587878481811061198657611986612401565b905060200201602081019061199b9190611eaf565b8686858181106119ad576119ad612401565b905060200201602081019061070f9190611f3e565b600101611950565b5050505050505050565b60008281526003602090815260408083206001600160401b03851684529091529020546001600160a01b031680611a1e5760405163538ba4f960e01b815260040160405180910390fd5b92915050565b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015611ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad491906123e4565b611af157604051633721555560e21b815260040160405180910390fd5b610384811080611b0357506201518081115b15611b215760405163f66cf56760e01b815260040160405180910390fd5b6002805490829055604051829082907fb75680035c94762a083979c48e5bb6f4b4dfbdda797a925ee7f1b8b162d446f890600090a35050565b60ff81166000908152600560205260409020546001600160a01b031680610b8d5760405163538ba4f960e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a6001600160401b031660009081526000805160206124188339815191526020526040908190205490516369ac88f960e11b81523360048201526001600160a01b039091169063d35911f290602401602060405180830381865afa158015611c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4491906123e4565b611c6157604051633721555560e21b815260040160405180910390fd5b8251825181141580611c74575081518114155b15611c9257604051634456f5e960e11b815260040160405180910390fd5b60005b81811015611385576000858281518110611cb157611cb1612401565b602002602001015190506000858381518110611ccf57611ccf612401565b602002602001015190506000858481518110611ced57611ced612401565b6020026020010151905060006001600160a01b0316826001600160a01b031603611d2a5760405163538ba4f960e01b815260040160405180910390fd5b8260ff16600003611d4e5760405163021b4ea160e01b815260040160405180910390fd5b6001600160a01b038116611d755760405163538ba4f960e01b815260040160405180910390fd5b60ff83166000908152600460205260409020546001600160a01b031615611daf57604051631596f13360e31b815260040160405180910390fd5b60ff8316600081815260046020908152604080832080546001600160a01b03199081166001600160a01b0389811691821790935560059094528285208054909116918716919091179055519092917f8585498d7de284d1c7ffe8331fd6f87a683875b6a4a7ef48cba0a3582a05542991a36040516001600160a01b0382169060ff8516907f21dbf985b47cb3cdc3afeab9b49366529288257f648c7877ceb82f5d8dba1cca90600090a3505050806001019050611c95565b6001600160a01b0381166000908152600a602052604081205460ff1615611e9057506001919050565b506000919050565b80356001600160a01b0381168114610b8d57600080fd5b600060208284031215611ec157600080fd5b611eca82611e98565b9392505050565b80356001600160401b0381168114610b8d57600080fd5b60008060408385031215611efb57600080fd5b611f0483611ed1565b946020939093013593505050565b803560ff81168114610b8d57600080fd5b600060208284031215611f3557600080fd5b611eca82611f12565b600060208284031215611f5057600080fd5b611eca82611ed1565b600060208284031215611f6b57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fb057611fb0611f72565b604052919050565b60006001600160401b03821115611fd157611fd1611f72565b5060051b60200190565b600082601f830112611fec57600080fd5b81356020612001611ffc83611fb8565b611f88565b8083825260208201915060208460051b87010193508684111561202357600080fd5b602086015b848110156120465761203981611f12565b8352918301918301612028565b509695505050505050565b600082601f83011261206257600080fd5b81356020612072611ffc83611fb8565b8083825260208201915060208460051b87010193508684111561209457600080fd5b602086015b84811015612046576120aa81611e98565b8352918301918301612099565b600080604083850312156120ca57600080fd5b82356001600160401b03808211156120e157600080fd5b6120ed86838701611fdb565b9350602085013591508082111561210357600080fd5b5061211085828601612051565b9150509250929050565b801515811461212857600080fd5b50565b60008060006060848603121561214057600080fd5b83356001600160401b038082111561215757600080fd5b61216387838801611fdb565b945060209150818601358181111561217a57600080fd5b61218688828901612051565b94505060408601358181111561219b57600080fd5b86019050601f810187136121ae57600080fd5b80356121bc611ffc82611fb8565b81815260059190911b820183019083810190898311156121db57600080fd5b928401925b828410156122025783356121f38161211a565b825292840192908401906121e0565b80955050505050509250925092565b60008060006060848603121561222657600080fd5b8335925061223660208501611e98565b915061224460408501611ed1565b90509250925092565b60008083601f84011261225f57600080fd5b5081356001600160401b0381111561227657600080fd5b6020830191508360208260051b850101111561229157600080fd5b9250929050565b600080600080600080606087890312156122b157600080fd5b86356001600160401b03808211156122c857600080fd5b6122d48a838b0161224d565b909850965060208901359150808211156122ed57600080fd5b6122f98a838b0161224d565b9096509450604089013591508082111561231257600080fd5b5061231f89828a0161224d565b979a9699509497509295939492505050565b6000806040838503121561234457600080fd5b8235915061235460208401611ed1565b90509250929050565b60008060006060848603121561237257600080fd5b83356001600160401b038082111561238957600080fd5b61239587838801611fdb565b945060208601359150808211156123ab57600080fd5b6123b787838801612051565b935060408601359150808211156123cd57600080fd5b506123da86828701612051565b9150509250925092565b6000602082840312156123f657600080fd5b8151611eca8161211a565b634e487b7160e01b600052603260045260246000fdfef40add71d4955ecc5cc92cb4dcfe99ddcb050fdbe30614b5d7f40759c4669d43a2646970667358221220b290faaa933136c2ebd8ea7d5fac056afc323fe82319da4b33c3ce7a7844a0b364736f6c63430008170033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.