Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x002a8047cd653ba36c2611c003e1af9a174b3dc2e5658c5b87e6ed328288a2a7 | Deposit | (pending) | 1 hr ago | IN | 0.01 ETH | (Pending) | |||
0x68a78f4ed11194373d989b1f5b196cced89d20c0b24fab5e95b9a3bd07a09ac4 | Deposit | (pending) | 1 hr ago | IN | 0.01 ETH | (Pending) | |||
0x4fd8dab9b25ca2eeb50ab91a504aaff69157d4fdac9dea6a300fc75ec668a91f | Deposit | (pending) | 32 hrs ago | IN | 0.002 ETH | (Pending) | |||
0xb186585f00f8849e91af10bdf5dc928aa08f8cfec38374fd007e6f8ee2991e29 | Deposit | (pending) | 8 days ago | IN | 0.002 ETH | (Pending) | |||
0xa09b9723764cfdf7cfd121527272d5ad3aaef094dccb2bede1e70683fbb1ea66 | Deposit | (pending) | 16 days ago | IN | 0.002 ETH | (Pending) | |||
Deposit | 21464524 | 10 secs ago | IN | 0.002 ETH | 0.00039168 | ||||
Deposit | 21464519 | 1 min ago | IN | 0.0119 ETH | 0.00039228 | ||||
Deposit | 21464519 | 1 min ago | IN | 0.048 ETH | 0.00034324 | ||||
Deposit | 21464515 | 1 min ago | IN | 0.0077 ETH | 0.00040277 | ||||
Deposit | 21464515 | 1 min ago | IN | 0.065 ETH | 0.00040302 | ||||
Deposit | 21464515 | 1 min ago | IN | 0.305 ETH | 0.00040163 | ||||
Authorize Withdr... | 21464515 | 1 min ago | IN | 0 ETH | 0.00105391 | ||||
Deposit | 21464512 | 2 mins ago | IN | 0.06134 ETH | 0.00037056 | ||||
Deposit | 21464512 | 2 mins ago | IN | 0.0341 ETH | 0.00041266 | ||||
Deposit | 21464511 | 2 mins ago | IN | 0.03 ETH | 0.00037759 | ||||
Deposit | 21464511 | 2 mins ago | IN | 0.102 ETH | 0.0004233 | ||||
Deposit | 21464509 | 3 mins ago | IN | 0.06 ETH | 0.00041242 | ||||
Deposit | 21464503 | 4 mins ago | IN | 0.1 ETH | 0.00038182 | ||||
Deposit | 21464501 | 4 mins ago | IN | 0.038 ETH | 0.00034511 | ||||
Authorize Withdr... | 21464501 | 4 mins ago | IN | 0 ETH | 0.00103154 | ||||
Authorize Withdr... | 21464498 | 5 mins ago | IN | 0 ETH | 0.00108148 | ||||
Deposit | 21464497 | 5 mins ago | IN | 0.056 ETH | 0.00039293 | ||||
Deposit | 21464495 | 6 mins ago | IN | 0.003 ETH | 0.00034548 | ||||
Deposit | 21464493 | 6 mins ago | IN | 0.1255 ETH | 0.00040418 | ||||
Deposit | 21464492 | 6 mins ago | IN | 0.01 ETH | 0.00041046 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21464524 | 10 secs ago | 0.002 ETH | ||||
21464519 | 1 min ago | 0.0119 ETH | ||||
21464519 | 1 min ago | 0.048 ETH | ||||
21464515 | 1 min ago | 0.0077 ETH | ||||
21464515 | 1 min ago | 0.065 ETH | ||||
21464515 | 1 min ago | 0.305 ETH | ||||
21464512 | 2 mins ago | 0.06134 ETH | ||||
21464512 | 2 mins ago | 0.0341 ETH | ||||
21464511 | 2 mins ago | 0.03 ETH | ||||
21464511 | 2 mins ago | 0.102 ETH | ||||
21464509 | 3 mins ago | 0.06 ETH | ||||
21464503 | 4 mins ago | 0.1 ETH | ||||
21464501 | 4 mins ago | 0.038 ETH | ||||
21464497 | 5 mins ago | 0.056 ETH | ||||
21464495 | 6 mins ago | 0.003 ETH | ||||
21464493 | 6 mins ago | 0.1255 ETH | ||||
21464492 | 6 mins ago | 0.01 ETH | ||||
21464488 | 7 mins ago | 0.03324 ETH | ||||
21464486 | 7 mins ago | 0.055 ETH | ||||
21464478 | 9 mins ago | 0.985 ETH | ||||
21464477 | 9 mins ago | 0.06552 ETH | ||||
21464473 | 10 mins ago | 0.874 ETH | ||||
21464472 | 10 mins ago | 0.2 ETH | ||||
21464467 | 11 mins ago | 0.775 ETH | ||||
21464463 | 12 mins ago | 0.844 ETH |
Loading...
Loading
Contract Name:
CanonicalBridge
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import { AccessControl, IAccessControl } from "openzeppelin-contracts/contracts/access/AccessControl.sol"; import { ReentrancyGuard } from "openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; import { Pausable } from "openzeppelin-contracts/contracts/utils/Pausable.sol"; import { ICanonicalBridge } from "./interfaces/ICanonicalBridge.sol"; import { ITreasury } from "./interfaces/ITreasury.sol"; import { ISemVer } from "./interfaces/ISemVer.sol"; /// @title CanonicalBridge /// @dev A bridge contract for depositing and withdrawing ether to and from the Eclipse rollup. contract CanonicalBridge is ICanonicalBridge, ISemVer, AccessControl, Pausable, ReentrancyGuard { address private constant NULL_ADDRESS = address(0); bytes32 private constant NULL_BYTES32 = bytes32(0); bytes private constant NULL_BYTES = ""; uint256 private constant NEVER = type(uint256).max; uint256 private constant MIN_DEPOSIT_LAMPORTS = 2_000_000; uint256 private constant WEI_PER_LAMPORT = 1_000_000_000; uint256 private constant DEFAULT_FRAUD_WINDOW_DURATION = 7 days; uint256 private constant MIN_FRAUD_WINDOW_DURATION = 1 days; uint256 private constant PRECISION = 1e18; uint8 private constant MAJOR_VERSION = 2; uint8 private constant MINOR_VERSION = 0; uint8 private constant PATCH_VERSION = 0; bytes32 public constant override PAUSER_ROLE = keccak256("Pauser"); bytes32 public constant override STARTER_ROLE = keccak256("Starter"); bytes32 public constant override WITHDRAW_AUTHORITY_ROLE = keccak256("WithdrawAuthority"); bytes32 public constant override CLAIM_AUTHORITY_ROLE = keccak256("ClaimAuthority"); bytes32 public constant override WITHDRAW_CANCELLER_ROLE = keccak256("WithdrawCanceller"); bytes32 public constant override FRAUD_WINDOW_SETTER_ROLE = keccak256("FraudWindowSetter"); uint256 public constant override MIN_DEPOSIT = MIN_DEPOSIT_LAMPORTS * WEI_PER_LAMPORT; address public immutable override TREASURY; uint256 public override fraudWindowDuration = 7 days; mapping (bytes32 withdrawMessageHash => uint256 startTime) public override startTime; mapping (uint64 withdrawMessageId => uint256 blockNumber) public override withdrawMsgIdProcessed; /// @notice Explain to an end user what this does /// @dev Explain to a developer any extra details /// @dev Ensures that bytes32 data is initialized with data. modifier bytes32Initialized(bytes32 _data) { if(_data == NULL_BYTES32) revert EmptyBytes32(); _; } /// @dev Ensures the deposit amount and msg.value are valid, equal and they are >= to the min deposit amount. /// @param amountWei The amount to be deposited. modifier validDepositAmount(uint256 amountWei) { if (msg.value != amountWei) revert CanonicalBridgeTransactionRejected(0, "Deposit amount mismatch"); if (msg.value % WEI_PER_LAMPORT != 0) revert CanonicalBridgeTransactionRejected(0, "Fractional value not allowed"); if (msg.value < MIN_DEPOSIT) revert CanonicalBridgeTransactionRejected(0, "Deposit less than minimum"); _; } /// @dev Ensure that withdraw messages are complete. modifier validWithdrawMessage(WithdrawMessage memory message) { if (message.from == NULL_BYTES32) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "Null message.from"); } if (message.destination == NULL_ADDRESS) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "Null message.destination"); } if (message.amountWei == 0) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "message.amountWei is 0"); } if (message.withdrawId == 0) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "message.withdrawId is 0"); } if (message.feeWei > message.amountWei) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "message.fee exceeds message.amount"); } if (message.feeReceiver == NULL_ADDRESS) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "Null fee receiver"); } _; } /// @dev Constructor that initializes the contract. constructor(address owner, address treasuryAddress) { /// @dev The owner receives default ACL-admin role that controls access to the /// operational roles that follow. _grantRole(DEFAULT_ADMIN_ROLE, owner); /// @dev These assignments are conveniences, since the owner now has user admin authority. _grantRole(PAUSER_ROLE, owner); _grantRole(STARTER_ROLE, owner); _grantRole(WITHDRAW_AUTHORITY_ROLE, owner); _grantRole(CLAIM_AUTHORITY_ROLE, owner); _grantRole(WITHDRAW_CANCELLER_ROLE, owner); _grantRole(FRAUD_WINDOW_SETTER_ROLE, owner); TREASURY = treasuryAddress; emit Deployed(msg.sender, owner, treasuryAddress); _setFraudWindowDuration(DEFAULT_FRAUD_WINDOW_DURATION); } /// @inheritdoc ICanonicalBridge function withdrawMessageStatus( WithdrawMessage calldata message ) external view override validWithdrawMessage(message) returns (WithdrawStatus) { return withdrawMessageStatus(withdrawMessageHash(message)); } /// @inheritdoc ICanonicalBridge function withdrawMessageStatus(bytes32 messageHash) public view override returns (WithdrawStatus) { uint256 startTime_ = startTime[messageHash]; if (startTime_ == 0) return WithdrawStatus.UNKNOWN; if (startTime_ == NEVER) return WithdrawStatus.CLOSED; if (startTime_ > block.timestamp) return WithdrawStatus.PROCESSING; return WithdrawStatus.PENDING; } /// @inheritdoc ICanonicalBridge function withdrawMessageHash(WithdrawMessage memory message) public pure override returns (bytes32) { return keccak256(abi.encode(message)); } /// @inheritdoc ISemVer /// @dev Retrieves the constant version details of the smart contract. function getVersionComponents() public pure override returns (Version memory) { return Version(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION); } // Operations /// @inheritdoc ICanonicalBridge /// @dev Access controlled, pausible function deposit(bytes32 recipient, uint256 amountWei) external payable virtual override whenNotPaused bytes32Initialized(recipient) validDepositAmount(amountWei) nonReentrant { bool success; (success,) = payable(address(TREASURY)).call{value: amountWei}(abi.encodeWithSignature("depositEth()")); if (!success) revert CanonicalBridgeTransactionRejected(0, "failed to transfer funds to the treasury"); // Emit deposit message uint256 amountGwei = amountWei / WEI_PER_LAMPORT; emit Deposited(msg.sender, recipient, amountWei, amountGwei); } /// @inheritdoc ICanonicalBridge /// @dev Access controlled, pausable function authorizeWithdraws( WithdrawMessage[] calldata messages ) external override whenNotPaused onlyRole(WITHDRAW_AUTHORITY_ROLE) { for (uint256 i = 0; i < messages.length; i++) { _authorizeWithdraw(messages[i]); } } /// @inheritdoc ICanonicalBridge /// @dev Access controlled, pausable function authorizeWithdraw( WithdrawMessage calldata message ) external override whenNotPaused onlyRole(WITHDRAW_AUTHORITY_ROLE) { _authorizeWithdraw(message); } /// @notice Inserts a withdraw authorization with a start time after the fraud window. /// @param message The message to record. /// @dev Message must pass validation rules. function _authorizeWithdraw( WithdrawMessage memory message ) private validWithdrawMessage(message) { bytes32 messageHash = withdrawMessageHash(message); uint256 messageStartTime = block.timestamp + fraudWindowDuration; /// @dev This would occur if the relayer passed the same message twice. if (withdrawMessageStatus(messageHash) != WithdrawStatus.UNKNOWN) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "Message already exists"); } /// @dev This would only occur if the same message Id was used for two different messages. if (withdrawMsgIdProcessed[message.withdrawId] != 0) { revert CanonicalBridgeTransactionRejected(message.withdrawId, "Message Id already exists"); } startTime[messageHash] = messageStartTime; withdrawMsgIdProcessed[message.withdrawId] = block.number; /// @dev Transfer fee to feeReceiver. bool success = ITreasury(TREASURY).withdrawEth( message.feeReceiver, message.feeWei ); /// @dev The following condition should never occur and the error should be unreachable code. if (!success) revert WithdrawFailed(); emit WithdrawAuthorized( msg.sender, message, messageHash, messageStartTime ); } /// @inheritdoc ICanonicalBridge /// @dev Pausable function claimWithdraw( WithdrawMessage calldata message ) external override whenNotPaused nonReentrant validWithdrawMessage(message) { bool authorizedWithdrawer = (msg.sender == message.destination || hasRole(CLAIM_AUTHORITY_ROLE, msg.sender)); if (!authorizedWithdrawer) { revert IAccessControl.AccessControlUnauthorizedAccount(msg.sender, CLAIM_AUTHORITY_ROLE); } bytes32 messageHash = withdrawMessageHash(message); if (withdrawMessageStatus(messageHash) != WithdrawStatus.PENDING) revert WithdrawUnauthorized(); startTime[messageHash] = NEVER; emit WithdrawClaimed(message.destination, message.from, messageHash, message); /// @dev Transfer amountWei - feeWei to recipient. bool success = ITreasury(TREASURY).withdrawEth( message.destination, message.amountWei - message.feeWei ); /// @dev The following condition should never occur and the error should be unreachable code. if (!success) revert WithdrawFailed(); } // Admin /// @inheritdoc ICanonicalBridge /// @dev Access controlled function deleteWithdrawMessage( WithdrawMessage calldata message ) external override validWithdrawMessage(message) onlyRole(WITHDRAW_CANCELLER_ROLE) { bytes32 messageHash = withdrawMessageHash(message); WithdrawStatus status = withdrawMessageStatus(messageHash); if (status != WithdrawStatus.PENDING && status != WithdrawStatus.PROCESSING) { revert CannotCancel(); } startTime[messageHash] = 0; withdrawMsgIdProcessed[message.withdrawId] = 0; emit WithdrawMessageDeleted(msg.sender, message); } /// @inheritdoc ICanonicalBridge /// @dev Access controlled function setFraudWindowDuration(uint256 durationSeconds) public onlyRole(FRAUD_WINDOW_SETTER_ROLE) { if (durationSeconds < MIN_FRAUD_WINDOW_DURATION) revert DurationTooShort(); _setFraudWindowDuration(durationSeconds); } function _setFraudWindowDuration(uint256 durationSeconds) internal { fraudWindowDuration = durationSeconds; emit FraudWindowSet(msg.sender, durationSeconds); } /// @dev Pause deposits /// @dev Access controlled function pause() external virtual onlyRole(PAUSER_ROLE) { _pause(); } /// @dev Unpause deposits /// @dev Access controlled function unpause() external virtual onlyRole(STARTER_ROLE) { _unpause(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "./IAccessControl.sol"; import {Context} from "../utils/Context.sol"; import {ERC165} from "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @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. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @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 revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; /// @title IEtherBridge /// @notice Interface for a bridge contract that handles deposits of ether. interface ICanonicalBridge { /// @notice Contains deposit details sent to the target rollup chain. /// @param sender The address which provided the ether to deposit. /// @param recipient Abi packed bytes32 of a base58-encoded Solana address on the target chain. /// @param amountGwei The amount deposited in Gwei. struct DepositMessage { address sender; bytes32 recipient; uint256 amountGwei; } /// @notice Contains withdraw details sent by an authoritative state updater. /// @param pubKey Public key of the primary txn signer. /// @param destination Receiver who can claim the withdraw. /// @param amountWei Amount of wei that can be withdrawn. /// @param withdrawId Unique identifier can be used once. /// @param feeReceiver The address that will receive the transaction fee. /// @param feeWei The amount of fee to deduct from the amountWei. struct WithdrawMessage { bytes32 from; address destination; uint256 amountWei; uint64 withdrawId; address feeReceiver; uint256 feeWei; } enum WithdrawStatus { UNKNOWN, PROCESSING, PENDING, CLOSED } /// @notice Emitted from the contract constructor. /// @param deployer The deployer address. /// @param owner The address that received the default permissions. /// @param treasuryAddress The address that will hold received funds. event Deployed(address indexed deployer, address owner, address treasuryAddress); /// @notice Emitted when the fraud window is set. /// @param sender The authority that updated the fraud window. /// @param durationSeconds The new fraud window. event FraudWindowSet(address indexed sender, uint256 durationSeconds); /// @notice Emitted on a successful deposit. /// @param sender The address of the user who made the deposit. /// @param recipient The recipient account on the target chain. /// @param amountWei The amount in wei deposited. event Deposited( address indexed sender, bytes32 indexed recipient, uint256 amountWei, uint256 amountLamports ); /// @notice Emitted when a withdraw message is accepted. /// @param sender The address of the withdraw authority that forwarded the message. /// @param message The withdraw message accepted. /// @param messageHash The hash of the withdrawMessage. /// @param startTime The earliest timestamp when the withdraw can be executed. event WithdrawAuthorized( address indexed sender, WithdrawMessage message, bytes32 indexed messageHash, uint256 startTime); /// @notice Emitted when a withdraw is claimed and executed. /// @param receiver The recipient of the funds who is also the requester. /// @param message The withdraw message includes details such as origin and amount. /// @param messageHash The hash of the withdrawMessage. event WithdrawClaimed( address indexed receiver, bytes32 indexed remoteSender, bytes32 indexed messageHash, WithdrawMessage message ); /// @notice Emitted when an authorized withdraw is cancelled, by pre-image. /// @param authority The sender to authorized the cancellation. /// @param message The withdraw message that was cancelled. event WithdrawMessageDeleted(address authority, WithdrawMessage message); /// @notice Emitted when an authorized withdraw is cancelled, by hash. /// @param authority The sender to authorized the cancellation. /// @param messageHash The withdraw message hash that was cancelled. event WithdrawMessageHashDeleted(address indexed authority, bytes32 indexed messageHash); /// @notice Emitted when a withdraw authorization is cancelled. /// @param sender The authority that cancelled with the withdraw. /// @param messageHash The hash of the withdraw message that was cancelled. event WithdrawCancelled(address indexed sender, bytes32 indexed messageHash); /// @notice Emitted when the withdraw authorization is rejected. /// @param withdrawId The transactionId that was rejected. /// @dev withdrawId is 0 if deposit transaction. It is meaningful if a withdraw transaction or batch. error CanonicalBridgeTransactionRejected(uint64 withdrawId, string reason); /// @notice Emitted when the requested fraud window is less than the hard-code minimum. error DurationTooShort(); /// @notice Emitted when the Treasury fails to withdraw funds as instructed. error WithdrawFailed(); /// @notice Emitted when an attempted withdraw is unauthorized. error WithdrawUnauthorized(); /// @notice Emitted when an unable to cancel an authorized withdraw. /// @dev The authorized withdraw must be in the PENDING state or it cannot be cancelled. error CannotCancel(); /// @notice Emitted when a bytes32 input is empty. error EmptyBytes32(); /// @notice Returns the pauser role id. function PAUSER_ROLE() external view returns (bytes32); /// @notice Returns the starter role id. function STARTER_ROLE() external view returns (bytes32); /// @notice Returns the withdraw authority role id. function WITHDRAW_AUTHORITY_ROLE() external view returns (bytes32); /// @notice Returns the claim authority role id. function CLAIM_AUTHORITY_ROLE() external view returns (bytes32); /// @notice Returns the withdraw canceller role id. function WITHDRAW_CANCELLER_ROLE() external view returns (bytes32); /// @notice Returns the fraud window duration setter role id. function FRAUD_WINDOW_SETTER_ROLE() external view returns (bytes32); /// @notice Returns the minimum wei required to acquire a single lamport. function MIN_DEPOSIT() external view returns (uint256); /// @notice Returns the address of the treasury that will receive locked funds. function TREASURY() external view returns (address); /// @notice Returns the fraud window duration that governs withdraw eligibility. function fraudWindowDuration() external view returns (uint256); /// @notice Returns the startTime of withdraw eligibility for a withdraw message hash. /// @param withdrawMessageHash A hash of a withdraw message. /// @dev Eth timestamp format is in seconds. zero is not possible for a withdraw message /// with a non-zero amount. 2^^256 means the withdraw has been claimed and can never /// be executed again. function startTime(bytes32 withdrawMessageHash) external view returns (uint256); /// @notice Returns the status of the withdraw message. /// @param message The message to check. function withdrawMessageStatus(WithdrawMessage calldata message) external view returns (WithdrawStatus); /// @notice Returns the status of the withdraw message. /// @param messageHash The message to check. function withdrawMessageStatus(bytes32 messageHash) external view returns (WithdrawStatus); /// @notice Set the duration to delay withdraw eligibility. /// @param durationSeconds The delay duration when withdraw messages are accepted. function setFraudWindowDuration(uint256 durationSeconds) external; /// @notice Allows users to deposit ether to the target chain. /// @dev Accepts Ether along with the deposit message. Emits the `Deposited` event upon success. /// @param recipient The recipient account on target chain. /// @param amountWei The amount in wei to deposit. function deposit(bytes32 recipient, uint256 amountWei) external payable; /// @notice Establishes permission to withdraw funds after the fraud window passes. /// @param messages abi.encoded array of Withdraw messages to authorize. function authorizeWithdraws(WithdrawMessage[] calldata messages) external; /// @notice Establishes permission to withdraw funds after the fraud window passes. /// @param message abi.encoded Withdraw message to authorize. function authorizeWithdraw(WithdrawMessage calldata message) external; /// @notice Allows the receiver to claim an authorized withdraw. /// @param message The message to execute. function claimWithdraw(WithdrawMessage calldata message) external; /// @notice Allows the fraud authority to cancel a pending withdraw. /// @param message The authorized withdraw message to cancel. function deleteWithdrawMessage(WithdrawMessage calldata message) external; /// @notice Returns the hash of a withdraw message. /// @param message The message to hash function withdrawMessageHash(WithdrawMessage calldata message) external pure returns (bytes32); /// @notice Returns the block number if the withdraw message id has been observed and recorded. /// @param withdrawMsgId The message id to inspect. function withdrawMsgIdProcessed(uint64 withdrawMsgId) external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; /// @title ITreasury /// @notice Interface for a treasury contract stores ether. /// @dev This interface assumes the implementation will provide a fallback function to receive ether. interface ITreasury { /// @notice Emitted when the treasury is re-initialized. /// @param admin Address that initiated the re-initialization. /// @param oldOwner Address that was granted various permissions. event TreasuryReinitialized(address admin, address oldOwner); /// @notice Emitted when ether is deposited into the treasury. /// @param from The address of the sender who deposited ether. /// @param amountWei The amount of ether deposited. event TreasuryDeposit(address indexed from, uint256 amountWei); /// @notice Emitted when ether is withdrawn from the treasury. /// @param authority The sender of the withdraw instruction. /// @param to The address of the sender who received ether. /// @param amountWei The amount of ether withdrawn. event TreasuryWithdraw( address authority, address indexed to, uint256 amountWei ); /// @notice Emitted when ether is withdrawn from the treasury during an emergency withdraw. /// @param to The address to which ether was sent. /// @param amountWei The amount of ether withdrawn. event EmergencyTreasuryWithdraw(address indexed to, uint256 amountWei); /// @notice Emitted when withdraws couldn't be sent to the receiver. error TreasuryTransferFailed(); /// @notice Emitted when withdraw amount exceeds funds on hand. error InsufficientFunds(); /// @notice Emitted when an input address is a prohibited address(0). error ZeroAddress(); /// @notice Returns the depositor role id. function DEPOSITOR_ROLE() external view returns (bytes32); /// @notice Returns the withdraw authority role id. function WITHDRAW_AUTHORITY_ROLE() external view returns (bytes32); /// @notice Returns the pauser role id. function PAUSER_ROLE() external view returns (bytes32); /// @notice Returns the starter role id. function STARTER_ROLE() external view returns (bytes32); /// @notice Returns the upgrader role id. function UPGRADER_ROLE() external view returns (bytes32); /// @notice Returns the emergency authority role id. function EMERGENCY_ROLE() external view returns (bytes32); /// @notice Reinitializes the Treasury. Grants roles to the owner. function reinitialize() external; /// @notice Accepts eth deposits. function depositEth() external payable; /// @notice Withdraws Eth from the Treasury. /// @param to The receiver of the withdrawn Eth. /// @param amountWei The gross amount of Eth to withdraw. /// @return success True if the withdraw was succesful. function withdrawEth( address to, uint256 amountWei ) external returns (bool success); /// @notice Stops deposits. Requires the PAUSER_ROLE. function pause() external; /// @notice Starts deposits. Requires the STARTER_ROLE. function unpause() external; /// @notice Withdraws an 'amount' of ether during emergencies. /// @param amountWei The amount of ether to be sent. function emergencyWithdraw(uint256 amountWei) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; /** * @title ISemVer * @dev Interface for SemVer versioning within smart contracts. */ interface ISemVer { /// @dev Struct to hold the version components. /// @param major The major version component, incremented for incompatible API changes. /// @param minor The minor version component, incremented for added functionality in a backwards-compatible manner. /// @param patch The patch version component, incremented for backwards-compatible bug fixes. struct Version { uint8 major; uint8 minor; uint8 patch; } /// @dev Returns the major, minor, and patch components of the version as a struct. /// @return Version memory Returns the version details encapsulated in a Version struct. function getVersionComponents() external pure returns (Version memory); }
// 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 ERC165 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "lib/forge-std:ds-test/=lib/forge-std/lib/ds-test/src/", "lib/openzeppelin-contracts:@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "lib/openzeppelin-contracts:ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "lib/openzeppelin-contracts:erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "lib/openzeppelin-contracts:forge-std/=lib/openzeppelin-contracts/lib/forge-std/src/", "lib/openzeppelin-contracts-upgradeable:@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "lib/openzeppelin-contracts-upgradeable:@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", "lib/openzeppelin-contracts-upgradeable:ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/", "lib/openzeppelin-contracts-upgradeable:erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "lib/openzeppelin-contracts-upgradeable:forge-std/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/", "lib/openzeppelin-contracts-upgradeable:openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/", "@openzeppelin/=lib/openzeppelin-contracts/contracts/", "@openzeppelin-upgradeable/=lib/@penzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/", "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/" ], "optimizer": { "enabled": true, "runs": 1000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"treasuryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"string","name":"reason","type":"string"}],"name":"CanonicalBridgeTransactionRejected","type":"error"},{"inputs":[],"name":"DurationTooShort","type":"error"},{"inputs":[],"name":"EmptyBytes32","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"inputs":[],"name":"WithdrawUnauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"Deployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"bytes32","name":"recipient","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLamports","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"durationSeconds","type":"uint256"}],"name":"FraudWindowSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"indexed":false,"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"},{"indexed":true,"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"WithdrawAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"bytes32","name":"messageHash","type":"bytes32"}],"name":"WithdrawCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"bytes32","name":"remoteSender","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"indexed":false,"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"WithdrawClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"authority","type":"address"},{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"indexed":false,"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"WithdrawMessageDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authority","type":"address"},{"indexed":true,"internalType":"bytes32","name":"messageHash","type":"bytes32"}],"name":"WithdrawMessageHashDeleted","type":"event"},{"inputs":[],"name":"CLAIM_AUTHORITY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAUD_WINDOW_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DEPOSIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_AUTHORITY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_CANCELLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"authorizeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"internalType":"struct ICanonicalBridge.WithdrawMessage[]","name":"messages","type":"tuple[]"}],"name":"authorizeWithdraws","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"claimWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"deleteWithdrawMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"uint256","name":"amountWei","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fraudWindowDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersionComponents","outputs":[{"components":[{"internalType":"uint8","name":"major","type":"uint8"},{"internalType":"uint8","name":"minor","type":"uint8"},{"internalType":"uint8","name":"patch","type":"uint8"}],"internalType":"struct ISemVer.Version","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationSeconds","type":"uint256"}],"name":"setFraudWindowDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"withdrawMessageHash","type":"bytes32"}],"name":"startTime","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"withdrawMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"}],"name":"withdrawMessageStatus","outputs":[{"internalType":"enum ICanonicalBridge.WithdrawStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"from","type":"bytes32"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amountWei","type":"uint256"},{"internalType":"uint64","name":"withdrawId","type":"uint64"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"internalType":"struct ICanonicalBridge.WithdrawMessage","name":"message","type":"tuple"}],"name":"withdrawMessageStatus","outputs":[{"internalType":"enum ICanonicalBridge.WithdrawStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"withdrawMessageId","type":"uint64"}],"name":"withdrawMsgIdProcessed","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0346200016d576200282990601f38839003908101601f19168201906001600160401b038211838310176200017257808391604095869485528339810103126200016d576200005d6020620000558362000188565b920162000188565b60ff1960015416600155600160025562093a80918260035562000080816200019d565b506200008c816200021d565b506200009881620002bf565b50620000a4816200035c565b50620000b081620003f9565b50620000bc8162000496565b50620000c88162000533565b50608082905283516001600160a01b0391821681529116602082015233907fc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b8178082908490a28060035581519081527f9892782f1437afb6be047429f988c13aab6dfb7e314d22ac657b062f4f1a548360203392a2516122389081620005d1823960805181818161068701528181610c6c0152818161150f015281816119490152611a3d0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200016d57565b6001600160a01b031660008181527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604081205490919060ff166200021957818052816020526040822081835260205260408220600160ff198254161790553391600080516020620028098339815191528180a4600190565b5090565b6001600160a01b031660008181527fa1109fe591aa8d3844618999472a1d10db9c7e331f65a2aafe002c00336a446a60205260408120549091907f39935d86204acf3d77da26425d7a46606d2550568c6b1876f3a2e76c804c76269060ff16620002ba57808352826020526040832082845260205260408320600160ff1982541617905560008051602062002809833981519152339380a4600190565b505090565b6001600160a01b031660008181527fe073aef41dc526905b73a8afcb340da5a4ef974efd7f15102e4d3caa11a3a98d60205260408120549091907fac6a94bcd1ac2877eda181de9748e5972fc07f76d4864cecf836b3fca185e53c9060ff16620002ba57808352826020526040832082845260205260408320600160ff1982541617905560008051602062002809833981519152339380a4600190565b6001600160a01b031660008181527f563042ac6f19900ae6f877f555965d3e949234c4788a74f3ca00aa3e8624e39b60205260408120549091907ffe482b7b16acc2ea6eda181934b481a09d50ed8e3579b43c531bc57b84336c539060ff16620002ba57808352826020526040832082845260205260408320600160ff1982541617905560008051602062002809833981519152339380a4600190565b6001600160a01b031660008181527f06246df62a8902d6b7c7ca2049c2a8c1ad05719837cf1f88cc6de0f08d28837660205260408120549091907f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc9060ff16620002ba57808352826020526040832082845260205260408320600160ff1982541617905560008051602062002809833981519152339380a4600190565b6001600160a01b031660008181527f8c3d7c314c89e16efb740181381b7ce78a4b1e3cd527902e14bd38b2b23379f160205260408120549091907fb7a383a5ef6cc414a168844ee7da5cf32b44a10145b4d0cc573e1b7c231d30409060ff16620002ba57808352826020526040832082845260205260408320600160ff1982541617905560008051602062002809833981519152339380a4600190565b6001600160a01b031660008181527ff5b8dcbf1a298d0af632a6b657ac65647617e80caac50b6b28b3b96c19a3e94f60205260408120549091907fe68a6574a7e933010135bdcdb85f5b60aed1ee2a05b00c7c3b88734a75706cf09060ff16620002ba57808352826020526040832082845260205260408320600160ff1982541617905560008051602062002809833981519152339380a460019056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714611cfb5750806303cb849914611cc05780631be9995314611c855780631de26e161461199c578063248a9ca31461196d5780632d2c5565146119295780632f2ff15d146118ea57806330053c69146118cc57806336568abe1461186d5780633b148f59146118415780633f4ba83a1461176e57806340a4aa58146117475780634442eab2146116df5780635c975abb146116bc57806370cccdfe14611681578063744ced3d146113b35780638456cb59146113095780638bcb4fdb146112cb57806391d148541461127d578063931da34614610fe1578063a217fddf14610fc5578063b61b6ee614610a43578063c0cb8f0f14610a24578063c76b99fd14610931578063cc3cfe3714610557578063d547741f14610516578063e1e158a5146104f4578063e63ab1e9146104b9578063f75dc0481461047e578063faa62e50146104435763fd6626101461017457600080fd5b3461043e5760c036600319011261043e5761018e36611e33565b8051156103e4576001600160a01b03806020830151161561038957604082019081511561032e57606083019267ffffffffffffffff928385511680156102d7575060a082015190511061026a576080015116156102115761020d6102016101fc6101f736611e33565b61208a565b612051565b60405191829182611ea7565b0390f35b6102669151166040519182916386c8428160e01b83526004830167ffffffffffffffff608092168152604060208201526011604082015270273ab636103332b2903932b1b2b4bb32b960791b60608201520190565b0390fd5b610266838551166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b604080516386c8428160e01b815267ffffffffffffffff9290921660048301526024820152601760448201527f6d6573736167652e7769746864726177496420697320300000000000000000006064820152608490fd5b6060830151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601660448201527f6d6573736167652e616d6f756e745765692069732030000000000000000000006064820152608490fd5b6060820151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601860448201527f4e756c6c206d6573736167652e64657374696e6174696f6e00000000000000006064820152608490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601160448201527f4e756c6c206d6573736167652e66726f6d0000000000000000000000000000006064820152608490fd5b600080fd5b3461043e57600036600319011261043e5760206040517f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc8152f35b3461043e57600036600319011261043e5760206040517fb7a383a5ef6cc414a168844ee7da5cf32b44a10145b4d0cc573e1b7c231d30408152f35b3461043e57600036600319011261043e5760206040517f39935d86204acf3d77da26425d7a46606d2550568c6b1876f3a2e76c804c76268152f35b3461043e57600036600319011261043e57602060405166071afd498d00008152f35b3461043e57604036600319011261043e57610555600435610535611d99565b90806000526000602052610550600160406000200154611f16565b611fdb565b005b3461043e5760c036600319011261043e57610570612107565b610578611eba565b61058136611e33565b8051156103e4576001600160a01b039060208281830151161561038957604082019081511561032e57606083019167ffffffffffffffff948584511680156102d7575060a085019182519051106108c45760808501818151161561086e576105e88661208a565b96600354420195864211610858576105ff89612051565b6004811015610842576107f35781815116600052600586526040600020546107a457926106839492819287958b600052600487528960406000205551166000526005855243604060002055511691519160006040518096819582946306e6a46960e21b845260048401602090939291936001600160a01b0360408201951681520152565b03927f0000000000000000000000000000000000000000000000000000000000000000165af19182156107985760009261076b575b50501561074157610714604051809360a080918051845260208101516001600160a01b0380911660208601526040820151604086015267ffffffffffffffff606083015116606086015260808201511660808501520151910152565b60c08201527ff486b030a91fdad2b9594a1322d19e1fd67f566f96e6501dfbf69fca11ff95ca60e03392a3005b60046040517f750b219c000000000000000000000000000000000000000000000000000000008152fd5b61078a9250803d10610791575b6107828183611e11565b810190612176565b84806106b8565b503d610778565b6040513d6000823e3d90fd5b608492505116604051906386c8428160e01b8252600482015260406024820152601960448201527f4d65737361676520496420616c726561647920657869737473000000000000006064820152fd5b608492505116604051906386c8428160e01b8252600482015260406024820152601660448201527f4d65737361676520616c726561647920657869737473000000000000000000006064820152fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b610266878651166040519182916386c8428160e01b83526004830167ffffffffffffffff608092168152604060208201526011604082015270273ab636103332b2903932b1b2b4bb32b960791b60608201520190565b610266868551166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b3461043e57602036600319011261043e573360009081527ff5b8dcbf1a298d0af632a6b657ac65647617e80caac50b6b28b3b96c19a3e94f6020526040902054600435907fe68a6574a7e933010135bdcdb85f5b60aed1ee2a05b00c7c3b88734a75706cf09060ff1615610a0657506201518081106109dc57806003556040519081527f9892782f1437afb6be047429f988c13aab6dfb7e314d22ac657b062f4f1a548360203392a2005b60046040517f25c36367000000000000000000000000000000000000000000000000000000008152fd5b6044906040519063e2517d3f60e01b82523360048301526024820152fd5b3461043e57602036600319011261043e5761020d610201600435612051565b3461043e57602036600319011261043e5767ffffffffffffffff6004351161043e5736602360043501121561043e5767ffffffffffffffff600435600401351161043e5736602460c0600435600401350260043501011161043e57610aa6612107565b610aae611eba565b60005b600435600401358110610ac057005b60c081026004350160c0602319823603011261043e5760405190610ae382611df5565b6024810135808352610af760448301611daf565b602084015260648201356040840152608482013567ffffffffffffffff81169283820361043e5760c4916060860152610b3260a48201611daf565b6080860152013560a084015215610f6e57506001600160a01b0360208201511615610f1457604081015115610eba5767ffffffffffffffff60608201511680156102d7575060a0810151604082015110610e55576001600160a01b0360808201511615610e0757610ba28161208a565b90600354420180421161085857610bb883612051565b600481101561084257610dad5767ffffffffffffffff6060830151166000526005602052604060002054610d53578260005260046020528060406000205567ffffffffffffffff606083015116600052600560205243604060002055610c5e60206001600160a01b0360808501511660a08501519060405193849283926306e6a46960e21b845260048401602090939291936001600160a01b0360408201951681520152565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561079857600091610d34575b501561074157610cf8604051809360a080918051845260208101516001600160a01b0380911660208601526040820151604086015267ffffffffffffffff606083015116606086015260808201511660808501520151910152565b60c08201527ff486b030a91fdad2b9594a1322d19e1fd67f566f96e6501dfbf69fca11ff95ca60e03392a3600019811461085857600101610ab1565b610d4d915060203d602011610791576107828183611e11565b85610c9d565b608467ffffffffffffffff606084015116604051906386c8428160e01b8252600482015260406024820152601960448201527f4d65737361676520496420616c726561647920657869737473000000000000006064820152fd5b608467ffffffffffffffff606084015116604051906386c8428160e01b8252600482015260406024820152601660448201527f4d65737361676520616c726561647920657869737473000000000000000000006064820152fd5b60600151604080516386c8428160e01b815267ffffffffffffffff909216600483015260248201526011604482015270273ab636103332b2903932b1b2b4bb32b960791b6064820152608490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152602260448201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756064820152611b9d60f21b608482015260a490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601660448201527f6d6573736167652e616d6f756e745765692069732030000000000000000000006064820152608490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601860448201527f4e756c6c206d6573736167652e64657374696e6174696f6e00000000000000006064820152608490fd5b604080516386c8428160e01b815267ffffffffffffffff9290921660048301526024820152601160448201527f4e756c6c206d6573736167652e66726f6d0000000000000000000000000000006064820152608490fd5b3461043e57600036600319011261043e57602060405160008152f35b3461043e5760c036600319011261043e57610ffb36611e33565b8051156103e4576001600160a01b0360209181838201511615610f1457604081019182511561122257606082019167ffffffffffffffff938484511680156102d7575060a08201519051106111b55760800151161561115f57507fb7a383a5ef6cc414a168844ee7da5cf32b44a10145b4d0cc573e1b7c231d30408060005260008352604060002033600052835260ff6040600020541615610a0657506110a46101f736611e33565b6110ad81612051565b60048110156108425760028114159081611153575b5061112957600052600482526000604081205560643590811680910361043e577fefe476e7ac46b9bde62b3d392a897ae796bfad2fe290ad65adf17b9079b9341e9160e09160005260058152600060408120556111266040519133835282016121a4565ba1005b60046040517ffbc03578000000000000000000000000000000000000000000000000000000008152fd5b600191501415846110c2565b610266925051166040519182916386c8428160e01b83526004830167ffffffffffffffff608092168152604060208201526011604082015270273ab636103332b2903932b1b2b4bb32b960791b60608201520190565b610266848451166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b6060820151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601660448201527f6d6573736167652e616d6f756e745765692069732030000000000000000000006064820152608490fd5b3461043e57604036600319011261043e57611296611d99565b60043560005260006020526001600160a01b0360406000209116600052602052602060ff604060002054166040519015158152f35b3461043e57602036600319011261043e5760043567ffffffffffffffff811680910361043e5760005260056020526020604060002054604051908152f35b3461043e57600036600319011261043e573360009081527fa1109fe591aa8d3844618999472a1d10db9c7e331f65a2aafe002c00336a446a60205260409020547f39935d86204acf3d77da26425d7a46606d2550568c6b1876f3a2e76c804c76269060ff1615610a065761137b612107565b600160ff19815416176001557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461043e5760c036600319011261043e576113cc612107565b6113d461213d565b6113dd36611e33565b8051156103e4576001600160a01b0360209181838201511615610f14576040810190815115610eba57606081019067ffffffffffffffff928383511680156102d7575060a0820151905110611614576080015183161561115f5750508061144261218e565b16331480156115d2575b156115955761145d6101f736611e33565b61146681612051565b60048110156108425760020361156b57806000526004835260001960406000205561148f61218e565b60405161149b816121a4565b7f17301a134abd040120edefa131df2e376da9fb5264e3483c90f23293ab14261160c085600435941692a46114ce61218e565b60443560a4358103908111610858576040516306e6a46960e21b81526001600160a01b039290921660048301526024820152908290829060449082906000907f0000000000000000000000000000000000000000000000000000000000000000165af19182156107985760009261154e575b505015610741576001600255005b6115649250803d10610791576107828183611e11565b8180611540565b60046040517f5cda670e000000000000000000000000000000000000000000000000000000008152fd5b604460405163e2517d3f60e01b81523360048201527f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc6024820152fd5b507f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc60005260008252604060002033600052825260ff6040600020541661144c565b610266838351166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b3461043e57600036600319011261043e5760206040517fe68a6574a7e933010135bdcdb85f5b60aed1ee2a05b00c7c3b88734a75706cf08152f35b3461043e57600036600319011261043e57602060ff600154166040519015158152f35b3461043e57600036600319011261043e576000604080516116ff81611dc3565b8281528260208201520152606060405161171881611dc3565b6002815260ff604060208301926000845201600081528160405193600285525116602084015251166040820152f35b3461043e5760c036600319011261043e5760206117666101f736611e33565b604051908152f35b3461043e57600036600319011261043e573360009081527fe073aef41dc526905b73a8afcb340da5a4ef974efd7f15102e4d3caa11a3a98d60205260409020547fac6a94bcd1ac2877eda181de9748e5972fc07f76d4864cecf836b3fca185e53c9060ff1615610a065760015460ff8116156118175760ff19166001557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b60046040517f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b3461043e57602036600319011261043e5760043560005260046020526020604060002054604051908152f35b3461043e57604036600319011261043e57611886611d99565b336001600160a01b038216036118a25761055590600435611fdb565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b3461043e57600036600319011261043e576020600354604051908152f35b3461043e57604036600319011261043e57610555600435611909611d99565b90806000526000602052611924600160406000200154611f16565b611f5c565b3461043e57600036600319011261043e5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461043e57602036600319011261043e5760043560005260006020526020600160406000200154604051908152f35b604036600319011261043e5760043560248035906119b8612107565b8215611c5b57813403611c1057633b9aca0090813406611bc55766071afd498d00003410611b7a576119e861213d565b604051602081017f439370b100000000000000000000000000000000000000000000000000000000815260048252604082019167ffffffffffffffff9281811084821117611b655760405251600091829190877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1903d15611b5f573d908111611b4a5760405190611a8e601f8201601f191660200183611e11565b8152600060203d92013e5b15611ad95750604051918083520460208201527fcc9c1a7566adfa8bdc9f7a63a106576fec355c6b4f61ce07baad45eaa30560c360403392a36001600255005b60a49060408051916386c8428160e01b835260006004840152820152602860448201527f6661696c656420746f207472616e736665722066756e647320746f207468652060648201527f74726561737572790000000000000000000000000000000000000000000000006084820152fd5b82634e487b7160e01b60005260416004526000fd5b50611a99565b84634e487b7160e01b60005260416004526000fd5b60849060408051916386c8428160e01b835260006004840152820152601960448201527f4465706f736974206c657373207468616e206d696e696d756d000000000000006064820152fd5b60849060408051916386c8428160e01b835260006004840152820152601c60448201527f4672616374696f6e616c2076616c7565206e6f7420616c6c6f776564000000006064820152fd5b60849060408051916386c8428160e01b835260006004840152820152601760448201527f4465706f73697420616d6f756e74206d69736d617463680000000000000000006064820152fd5b60046040517f1c25715b000000000000000000000000000000000000000000000000000000008152fd5b3461043e57600036600319011261043e5760206040517fac6a94bcd1ac2877eda181de9748e5972fc07f76d4864cecf836b3fca185e53c8152f35b3461043e57600036600319011261043e5760206040517ffe482b7b16acc2ea6eda181934b481a09d50ed8e3579b43c531bc57b84336c538152f35b3461043e57602036600319011261043e57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361043e57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115611d6f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483611d68565b602435906001600160a01b038216820361043e57565b35906001600160a01b038216820361043e57565b6060810190811067ffffffffffffffff821117611ddf57604052565b634e487b7160e01b600052604160045260246000fd5b60c0810190811067ffffffffffffffff821117611ddf57604052565b90601f8019910116810190811067ffffffffffffffff821117611ddf57604052565b60c090600319011261043e5760405190611e4c82611df5565b6004358252816001600160a01b03602435818116810361043e576020830152604435604083015260643567ffffffffffffffff8116810361043e576060830152608435908116810361043e57608082015260a060a435910152565b9190602083019260048210156108425752565b3360009081527f563042ac6f19900ae6f877f555965d3e949234c4788a74f3ca00aa3e8624e39b60205260409020547ffe482b7b16acc2ea6eda181934b481a09d50ed8e3579b43c531bc57b84336c539060ff1615610a065750565b80600052600060205260406000203360005260205260ff6040600020541615611f3c5750565b60405163e2517d3f60e01b81523360048201526024810191909152604490fd5b90600091808352826020526001600160a01b036040842092169182845260205260ff60408420541615600014611fd657808352826020526040832082845260205260408320600160ff198254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4600190565b505090565b90600091808352826020526001600160a01b036040842092169182845260205260ff604084205416600014611fd65780835282602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4600190565b6000526004602052604060002054801561208457600019811461207e57421061207957600290565b600190565b50600390565b50600090565b6040516120e360208201809360a080918051845260208101516001600160a01b0380911660208601526040820151604086015267ffffffffffffffff606083015116606086015260808201511660808501520151910152565b60c0815260e0810181811067ffffffffffffffff821117611ddf5760405251902090565b60ff6001541661211357565b60046040517fd93c0665000000000000000000000000000000000000000000000000000000008152fd5b600280541461214c5760028055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b9081602091031261043e5751801515810361043e5790565b6024356001600160a01b038116810361043e5790565b60043581526024356001600160a01b039081811680910361043e576020830152604435604083015260643567ffffffffffffffff811680910361043e57606083015260843590811680910361043e57608082015260a060a43591015256fea2646970667358221220c1b8e7ae9e4e108bc48ac5182d63eb37184c528ad6ebe6e8c24731abb5acd8ea64736f6c634300081500332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d000000000000000000000000d02f545d57536bc1e8f12d867731f006aace71e3000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644
Deployed Bytecode
0x608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714611cfb5750806303cb849914611cc05780631be9995314611c855780631de26e161461199c578063248a9ca31461196d5780632d2c5565146119295780632f2ff15d146118ea57806330053c69146118cc57806336568abe1461186d5780633b148f59146118415780633f4ba83a1461176e57806340a4aa58146117475780634442eab2146116df5780635c975abb146116bc57806370cccdfe14611681578063744ced3d146113b35780638456cb59146113095780638bcb4fdb146112cb57806391d148541461127d578063931da34614610fe1578063a217fddf14610fc5578063b61b6ee614610a43578063c0cb8f0f14610a24578063c76b99fd14610931578063cc3cfe3714610557578063d547741f14610516578063e1e158a5146104f4578063e63ab1e9146104b9578063f75dc0481461047e578063faa62e50146104435763fd6626101461017457600080fd5b3461043e5760c036600319011261043e5761018e36611e33565b8051156103e4576001600160a01b03806020830151161561038957604082019081511561032e57606083019267ffffffffffffffff928385511680156102d7575060a082015190511061026a576080015116156102115761020d6102016101fc6101f736611e33565b61208a565b612051565b60405191829182611ea7565b0390f35b6102669151166040519182916386c8428160e01b83526004830167ffffffffffffffff608092168152604060208201526011604082015270273ab636103332b2903932b1b2b4bb32b960791b60608201520190565b0390fd5b610266838551166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b604080516386c8428160e01b815267ffffffffffffffff9290921660048301526024820152601760448201527f6d6573736167652e7769746864726177496420697320300000000000000000006064820152608490fd5b6060830151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601660448201527f6d6573736167652e616d6f756e745765692069732030000000000000000000006064820152608490fd5b6060820151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601860448201527f4e756c6c206d6573736167652e64657374696e6174696f6e00000000000000006064820152608490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601160448201527f4e756c6c206d6573736167652e66726f6d0000000000000000000000000000006064820152608490fd5b600080fd5b3461043e57600036600319011261043e5760206040517f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc8152f35b3461043e57600036600319011261043e5760206040517fb7a383a5ef6cc414a168844ee7da5cf32b44a10145b4d0cc573e1b7c231d30408152f35b3461043e57600036600319011261043e5760206040517f39935d86204acf3d77da26425d7a46606d2550568c6b1876f3a2e76c804c76268152f35b3461043e57600036600319011261043e57602060405166071afd498d00008152f35b3461043e57604036600319011261043e57610555600435610535611d99565b90806000526000602052610550600160406000200154611f16565b611fdb565b005b3461043e5760c036600319011261043e57610570612107565b610578611eba565b61058136611e33565b8051156103e4576001600160a01b039060208281830151161561038957604082019081511561032e57606083019167ffffffffffffffff948584511680156102d7575060a085019182519051106108c45760808501818151161561086e576105e88661208a565b96600354420195864211610858576105ff89612051565b6004811015610842576107f35781815116600052600586526040600020546107a457926106839492819287958b600052600487528960406000205551166000526005855243604060002055511691519160006040518096819582946306e6a46960e21b845260048401602090939291936001600160a01b0360408201951681520152565b03927f000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644165af19182156107985760009261076b575b50501561074157610714604051809360a080918051845260208101516001600160a01b0380911660208601526040820151604086015267ffffffffffffffff606083015116606086015260808201511660808501520151910152565b60c08201527ff486b030a91fdad2b9594a1322d19e1fd67f566f96e6501dfbf69fca11ff95ca60e03392a3005b60046040517f750b219c000000000000000000000000000000000000000000000000000000008152fd5b61078a9250803d10610791575b6107828183611e11565b810190612176565b84806106b8565b503d610778565b6040513d6000823e3d90fd5b608492505116604051906386c8428160e01b8252600482015260406024820152601960448201527f4d65737361676520496420616c726561647920657869737473000000000000006064820152fd5b608492505116604051906386c8428160e01b8252600482015260406024820152601660448201527f4d65737361676520616c726561647920657869737473000000000000000000006064820152fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b610266878651166040519182916386c8428160e01b83526004830167ffffffffffffffff608092168152604060208201526011604082015270273ab636103332b2903932b1b2b4bb32b960791b60608201520190565b610266868551166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b3461043e57602036600319011261043e573360009081527ff5b8dcbf1a298d0af632a6b657ac65647617e80caac50b6b28b3b96c19a3e94f6020526040902054600435907fe68a6574a7e933010135bdcdb85f5b60aed1ee2a05b00c7c3b88734a75706cf09060ff1615610a0657506201518081106109dc57806003556040519081527f9892782f1437afb6be047429f988c13aab6dfb7e314d22ac657b062f4f1a548360203392a2005b60046040517f25c36367000000000000000000000000000000000000000000000000000000008152fd5b6044906040519063e2517d3f60e01b82523360048301526024820152fd5b3461043e57602036600319011261043e5761020d610201600435612051565b3461043e57602036600319011261043e5767ffffffffffffffff6004351161043e5736602360043501121561043e5767ffffffffffffffff600435600401351161043e5736602460c0600435600401350260043501011161043e57610aa6612107565b610aae611eba565b60005b600435600401358110610ac057005b60c081026004350160c0602319823603011261043e5760405190610ae382611df5565b6024810135808352610af760448301611daf565b602084015260648201356040840152608482013567ffffffffffffffff81169283820361043e5760c4916060860152610b3260a48201611daf565b6080860152013560a084015215610f6e57506001600160a01b0360208201511615610f1457604081015115610eba5767ffffffffffffffff60608201511680156102d7575060a0810151604082015110610e55576001600160a01b0360808201511615610e0757610ba28161208a565b90600354420180421161085857610bb883612051565b600481101561084257610dad5767ffffffffffffffff6060830151166000526005602052604060002054610d53578260005260046020528060406000205567ffffffffffffffff606083015116600052600560205243604060002055610c5e60206001600160a01b0360808501511660a08501519060405193849283926306e6a46960e21b845260048401602090939291936001600160a01b0360408201951681520152565b038160006001600160a01b037f000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644165af190811561079857600091610d34575b501561074157610cf8604051809360a080918051845260208101516001600160a01b0380911660208601526040820151604086015267ffffffffffffffff606083015116606086015260808201511660808501520151910152565b60c08201527ff486b030a91fdad2b9594a1322d19e1fd67f566f96e6501dfbf69fca11ff95ca60e03392a3600019811461085857600101610ab1565b610d4d915060203d602011610791576107828183611e11565b85610c9d565b608467ffffffffffffffff606084015116604051906386c8428160e01b8252600482015260406024820152601960448201527f4d65737361676520496420616c726561647920657869737473000000000000006064820152fd5b608467ffffffffffffffff606084015116604051906386c8428160e01b8252600482015260406024820152601660448201527f4d65737361676520616c726561647920657869737473000000000000000000006064820152fd5b60600151604080516386c8428160e01b815267ffffffffffffffff909216600483015260248201526011604482015270273ab636103332b2903932b1b2b4bb32b960791b6064820152608490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152602260448201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756064820152611b9d60f21b608482015260a490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601660448201527f6d6573736167652e616d6f756e745765692069732030000000000000000000006064820152608490fd5b60600151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601860448201527f4e756c6c206d6573736167652e64657374696e6174696f6e00000000000000006064820152608490fd5b604080516386c8428160e01b815267ffffffffffffffff9290921660048301526024820152601160448201527f4e756c6c206d6573736167652e66726f6d0000000000000000000000000000006064820152608490fd5b3461043e57600036600319011261043e57602060405160008152f35b3461043e5760c036600319011261043e57610ffb36611e33565b8051156103e4576001600160a01b0360209181838201511615610f1457604081019182511561122257606082019167ffffffffffffffff938484511680156102d7575060a08201519051106111b55760800151161561115f57507fb7a383a5ef6cc414a168844ee7da5cf32b44a10145b4d0cc573e1b7c231d30408060005260008352604060002033600052835260ff6040600020541615610a0657506110a46101f736611e33565b6110ad81612051565b60048110156108425760028114159081611153575b5061112957600052600482526000604081205560643590811680910361043e577fefe476e7ac46b9bde62b3d392a897ae796bfad2fe290ad65adf17b9079b9341e9160e09160005260058152600060408120556111266040519133835282016121a4565ba1005b60046040517ffbc03578000000000000000000000000000000000000000000000000000000008152fd5b600191501415846110c2565b610266925051166040519182916386c8428160e01b83526004830167ffffffffffffffff608092168152604060208201526011604082015270273ab636103332b2903932b1b2b4bb32b960791b60608201520190565b610266848451166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b6060820151604080516386c8428160e01b815267ffffffffffffffff90921660048301526024820152601660448201527f6d6573736167652e616d6f756e745765692069732030000000000000000000006064820152608490fd5b3461043e57604036600319011261043e57611296611d99565b60043560005260006020526001600160a01b0360406000209116600052602052602060ff604060002054166040519015158152f35b3461043e57602036600319011261043e5760043567ffffffffffffffff811680910361043e5760005260056020526020604060002054604051908152f35b3461043e57600036600319011261043e573360009081527fa1109fe591aa8d3844618999472a1d10db9c7e331f65a2aafe002c00336a446a60205260409020547f39935d86204acf3d77da26425d7a46606d2550568c6b1876f3a2e76c804c76269060ff1615610a065761137b612107565b600160ff19815416176001557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461043e5760c036600319011261043e576113cc612107565b6113d461213d565b6113dd36611e33565b8051156103e4576001600160a01b0360209181838201511615610f14576040810190815115610eba57606081019067ffffffffffffffff928383511680156102d7575060a0820151905110611614576080015183161561115f5750508061144261218e565b16331480156115d2575b156115955761145d6101f736611e33565b61146681612051565b60048110156108425760020361156b57806000526004835260001960406000205561148f61218e565b60405161149b816121a4565b7f17301a134abd040120edefa131df2e376da9fb5264e3483c90f23293ab14261160c085600435941692a46114ce61218e565b60443560a4358103908111610858576040516306e6a46960e21b81526001600160a01b039290921660048301526024820152908290829060449082906000907f000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644165af19182156107985760009261154e575b505015610741576001600255005b6115649250803d10610791576107828183611e11565b8180611540565b60046040517f5cda670e000000000000000000000000000000000000000000000000000000008152fd5b604460405163e2517d3f60e01b81523360048201527f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc6024820152fd5b507f49d85f38d8d200e3ac71b7ada9a2786ccb6d016b3c28e43e8057f6bbae438adc60005260008252604060002033600052825260ff6040600020541661144c565b610266838351166040519182916386c8428160e01b83526004830167ffffffffffffffff60a09216815260406020820152602260408201527f6d6573736167652e6665652065786365656473206d6573736167652e616d6f756060820152611b9d60f21b60808201520190565b3461043e57600036600319011261043e5760206040517fe68a6574a7e933010135bdcdb85f5b60aed1ee2a05b00c7c3b88734a75706cf08152f35b3461043e57600036600319011261043e57602060ff600154166040519015158152f35b3461043e57600036600319011261043e576000604080516116ff81611dc3565b8281528260208201520152606060405161171881611dc3565b6002815260ff604060208301926000845201600081528160405193600285525116602084015251166040820152f35b3461043e5760c036600319011261043e5760206117666101f736611e33565b604051908152f35b3461043e57600036600319011261043e573360009081527fe073aef41dc526905b73a8afcb340da5a4ef974efd7f15102e4d3caa11a3a98d60205260409020547fac6a94bcd1ac2877eda181de9748e5972fc07f76d4864cecf836b3fca185e53c9060ff1615610a065760015460ff8116156118175760ff19166001557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b60046040517f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b3461043e57602036600319011261043e5760043560005260046020526020604060002054604051908152f35b3461043e57604036600319011261043e57611886611d99565b336001600160a01b038216036118a25761055590600435611fdb565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b3461043e57600036600319011261043e576020600354604051908152f35b3461043e57604036600319011261043e57610555600435611909611d99565b90806000526000602052611924600160406000200154611f16565b611f5c565b3461043e57600036600319011261043e5760206040516001600160a01b037f000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644168152f35b3461043e57602036600319011261043e5760043560005260006020526020600160406000200154604051908152f35b604036600319011261043e5760043560248035906119b8612107565b8215611c5b57813403611c1057633b9aca0090813406611bc55766071afd498d00003410611b7a576119e861213d565b604051602081017f439370b100000000000000000000000000000000000000000000000000000000815260048252604082019167ffffffffffffffff9281811084821117611b655760405251600091829190877f000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e6446001600160a01b03165af1903d15611b5f573d908111611b4a5760405190611a8e601f8201601f191660200183611e11565b8152600060203d92013e5b15611ad95750604051918083520460208201527fcc9c1a7566adfa8bdc9f7a63a106576fec355c6b4f61ce07baad45eaa30560c360403392a36001600255005b60a49060408051916386c8428160e01b835260006004840152820152602860448201527f6661696c656420746f207472616e736665722066756e647320746f207468652060648201527f74726561737572790000000000000000000000000000000000000000000000006084820152fd5b82634e487b7160e01b60005260416004526000fd5b50611a99565b84634e487b7160e01b60005260416004526000fd5b60849060408051916386c8428160e01b835260006004840152820152601960448201527f4465706f736974206c657373207468616e206d696e696d756d000000000000006064820152fd5b60849060408051916386c8428160e01b835260006004840152820152601c60448201527f4672616374696f6e616c2076616c7565206e6f7420616c6c6f776564000000006064820152fd5b60849060408051916386c8428160e01b835260006004840152820152601760448201527f4465706f73697420616d6f756e74206d69736d617463680000000000000000006064820152fd5b60046040517f1c25715b000000000000000000000000000000000000000000000000000000008152fd5b3461043e57600036600319011261043e5760206040517fac6a94bcd1ac2877eda181de9748e5972fc07f76d4864cecf836b3fca185e53c8152f35b3461043e57600036600319011261043e5760206040517ffe482b7b16acc2ea6eda181934b481a09d50ed8e3579b43c531bc57b84336c538152f35b3461043e57602036600319011261043e57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361043e57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115611d6f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483611d68565b602435906001600160a01b038216820361043e57565b35906001600160a01b038216820361043e57565b6060810190811067ffffffffffffffff821117611ddf57604052565b634e487b7160e01b600052604160045260246000fd5b60c0810190811067ffffffffffffffff821117611ddf57604052565b90601f8019910116810190811067ffffffffffffffff821117611ddf57604052565b60c090600319011261043e5760405190611e4c82611df5565b6004358252816001600160a01b03602435818116810361043e576020830152604435604083015260643567ffffffffffffffff8116810361043e576060830152608435908116810361043e57608082015260a060a435910152565b9190602083019260048210156108425752565b3360009081527f563042ac6f19900ae6f877f555965d3e949234c4788a74f3ca00aa3e8624e39b60205260409020547ffe482b7b16acc2ea6eda181934b481a09d50ed8e3579b43c531bc57b84336c539060ff1615610a065750565b80600052600060205260406000203360005260205260ff6040600020541615611f3c5750565b60405163e2517d3f60e01b81523360048201526024810191909152604490fd5b90600091808352826020526001600160a01b036040842092169182845260205260ff60408420541615600014611fd657808352826020526040832082845260205260408320600160ff198254161790557f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d339380a4600190565b505090565b90600091808352826020526001600160a01b036040842092169182845260205260ff604084205416600014611fd65780835282602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4600190565b6000526004602052604060002054801561208457600019811461207e57421061207957600290565b600190565b50600390565b50600090565b6040516120e360208201809360a080918051845260208101516001600160a01b0380911660208601526040820151604086015267ffffffffffffffff606083015116606086015260808201511660808501520151910152565b60c0815260e0810181811067ffffffffffffffff821117611ddf5760405251902090565b60ff6001541661211357565b60046040517fd93c0665000000000000000000000000000000000000000000000000000000008152fd5b600280541461214c5760028055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b9081602091031261043e5751801515810361043e5790565b6024356001600160a01b038116810361043e5790565b60043581526024356001600160a01b039081811680910361043e576020830152604435604083015260643567ffffffffffffffff811680910361043e57606083015260843590811680910361043e57608082015260a060a43591015256fea2646970667358221220c1b8e7ae9e4e108bc48ac5182d63eb37184c528ad6ebe6e8c24731abb5acd8ea64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d02f545d57536bc1e8f12d867731f006aace71e3000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644
-----Decoded View---------------
Arg [0] : owner (address): 0xD02f545d57536BC1E8F12D867731F006AacE71E3
Arg [1] : treasuryAddress (address): 0xD7E4b67E735733aC98a88F13d087D8aac670E644
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d02f545d57536bc1e8f12d867731f006aace71e3
Arg [1] : 000000000000000000000000d7e4b67e735733ac98a88f13d087d8aac670e644
Loading...
Loading
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.