Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x8D99Cc01...3FE7471b5 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
TimelockedCall
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-11-27 */ // SPDX-License-Identifier: BUSL-1.1 pragma solidity >= 0.8.26; interface ITimelockedCall { function initScheduler(address addr, uint256 newTimeLockDuration) external; function enableScheduler(address addr) external; function disableScheduler(address addr) external; function schedule(bytes32 h, address consumerAddr) external; function consume(bytes32 h) external; function consumeOwnership(bytes32 h, address prevOwnerAddr, address newOwnerAddr) external; } /** * @notice Defines the interface for whitelisting addresses. */ interface IAddressWhitelist { /** * @notice Whitelists the address specified. * @param addr The address to enable */ function enableAddress (address addr) external; /** * @notice Whitelists the addresses specified. * @param arr The addresses to enable */ function enableAddresses (address[] calldata arr) external; /** * @notice Disables the address specified. * @param addr The address to disable */ function disableAddress (address addr) external; /** * @notice Disables the addresses specified. * @param arr The addresses to disable */ function disableAddresses (address[] calldata arr) external; /** * @notice Indicates if the address is whitelisted or not. * @param addr The address to disable * @return Returns 1 if the address is whitelisted */ function isWhitelistedAddress (address addr) external view returns (bool); /** * This event is triggered when a new address is whitelisted. * @param addr The address that was whitelisted */ event OnAddressEnabled(address addr); /** * This event is triggered when an address is disabled. * @param addr The address that was disabled */ event OnAddressDisabled(address addr); } /** * @title Base reentrancy guard. This is constructor-less implementation for both proxies and standalone contracts. */ abstract contract BaseReentrancyGuard { uint256 internal constant _REENTRANCY_NOT_ENTERED = 1; uint256 internal constant _REENTRANCY_ENTERED = 2; uint256 internal _reentrancyStatus; /** * @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 require(_reentrancyStatus != _REENTRANCY_ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _reentrancyStatus = _REENTRANCY_ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _reentrancyStatus = _REENTRANCY_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 _reentrancyStatus == _REENTRANCY_ENTERED; } */ } abstract contract BaseOwnable { error OwnerOnly(); address internal _owner; /** * @notice Triggers when contract ownership changes. * @param previousOwner The previous owner of the contract. * @param newOwner The new owner of the contract. */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { if (msg.sender != _owner) revert OwnerOnly(); _; } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @title Lightweight version of the ownership contract. This contract has a reentrancy guard. */ abstract contract LightweightOwnable is BaseReentrancyGuard, BaseOwnable { /** * @notice Transfers ownership of the contract to the account specified. * @param newOwner The address of the new owner. */ function transferOwnership(address newOwner) external virtual nonReentrant onlyOwner { _transferOwnership(newOwner); } /** * @notice Gets the owner of the contract. * @return address The address who owns the contract. */ function owner() external view virtual returns (address) { return _owner; } } /** * @title Standalone contract for whitelisting addresses. */ contract AddressWhitelist is IAddressWhitelist, LightweightOwnable { mapping (address => bool) internal _whitelistedAddresses; constructor(address ownerAddr) { require(ownerAddr != address(0), "Owner required"); _owner = ownerAddr; } /** * @notice Whitelists the address specified. * @param addr The address to enable */ function enableAddress (address addr) external override nonReentrant onlyOwner { require(!_whitelistedAddresses[addr], "Already enabled"); _whitelistedAddresses[addr] = true; emit OnAddressEnabled(addr); } /** * @notice Whitelists the addresses specified. * @param arr The addresses to enable */ function enableAddresses (address[] calldata arr) external override nonReentrant onlyOwner { require(arr.length > 0, "Addresses required"); for (uint256 i; i < arr.length; i++) { require(arr[i] != address(0), "Invalid address"); require(!_whitelistedAddresses[arr[i]], "Already enabled"); _whitelistedAddresses[arr[i]] = true; emit OnAddressEnabled(arr[i]); } } /** * @notice Disables the address specified. * @param addr The address to disable */ function disableAddress (address addr) external override nonReentrant onlyOwner { require(_whitelistedAddresses[addr], "Already disabled"); _whitelistedAddresses[addr] = false; emit OnAddressDisabled(addr); } /** * @notice Disables the addresses specified. * @param arr The addresses to disable */ function disableAddresses (address[] calldata arr) external override nonReentrant onlyOwner { for (uint256 i; i < arr.length; i++) { require(_whitelistedAddresses[arr[i]], "Already disabled"); _whitelistedAddresses[arr[i]] = false; emit OnAddressDisabled(arr[i]); } } /** * @notice Indicates if the address is whitelisted or not. * @param addr The address to evaluate. * @return Returns true if the address is whitelisted. */ function isWhitelistedAddress (address addr) external view override returns (bool) { return _whitelistedAddresses[addr]; } } /** * @title Contract for managing time-locked function calls. */ contract TimelockedCall is ITimelockedCall, AddressWhitelist { struct TimelockedCallInfo { uint256 targetEpoch; // The unix epoch at which the hash can be consumed address createdBy; // The address of the scheduler address consumerAddress; // The address of the consumer } /// @notice The schedulers authorized for a given sender. (sender => scheduler => enabled/disabled) mapping (address => mapping(address => bool)) private whitelistedSchedulers; /// @notice The time-lock info of a given hash. mapping (bytes32 => TimelockedCallInfo) public queue; /// @notice The time-lock duration of every consumer address. mapping (address => uint256) public timeLockDuration; /// @notice Triggers when a hash is scheduled for the address specified. event HashScheduled(bytes32 h, address consumerAddress); /// @notice Triggers when a hash is consumed by the address specified. event HashConsumed(bytes32 h, address consumerAddress); /// @notice Triggers when a new scheduler is enabled for the consumer address specified. event SchedulerEnabled(address consumerAddress, address schedulerAddress); /// @notice Triggers when an existing scheduler is disabled for the consumer address specified. event SchedulerDisabled(address consumerAddress, address schedulerAddress); constructor(address ownerAddr) AddressWhitelist(ownerAddr) { } modifier ifSenderWhitelisted() { require(_whitelistedAddresses[msg.sender], "Unauthorized sender"); _; } modifier ifTimeLockConfigured() { require(timeLockDuration[msg.sender] > 0, "Not configured"); _; } /** * @notice Sets the initial scheduler and time-lock duration for the current message sender. * @param addr The address of the initial scheduler. You can add more addresses later. * @param newTimeLockDuration The duration of the time-lock for the current message sender. */ function initScheduler(address addr, uint256 newTimeLockDuration) external override nonReentrant ifSenderWhitelisted { require(addr != address(0), "Address required"); require(newTimeLockDuration > 0, "Duration required"); require(timeLockDuration[msg.sender] == 0, "Already initialized"); whitelistedSchedulers[msg.sender][addr] = true; timeLockDuration[msg.sender] = newTimeLockDuration; emit SchedulerEnabled(msg.sender, addr); } /** * @notice Authorizes the address specified to schedule calls. The calls will be consumed by the current message sender. * @param addr Specifies the address of the scheduler to authorize. */ function enableScheduler(address addr) external override nonReentrant ifTimeLockConfigured { _enableScheduler(addr); } /** * @notice Revokes the address specified from scheduling calls for the current message sender. * @param addr Specifies the address of the scheduler to revoke. */ function disableScheduler(address addr) external override nonReentrant ifTimeLockConfigured { _disableScheduler(addr); } /** * @notice Schedules a hash to be consumed by the address specified. * @param h Specifies the hash. * @param consumerAddr Specifies the address of the consumer. */ function schedule(bytes32 h, address consumerAddr) external override nonReentrant { require(h != bytes32(0), "Hash required"); require(whitelistedSchedulers[consumerAddr][msg.sender], "Unauthorized sender"); require(timeLockDuration[consumerAddr] > 0, "Not configured"); require(queue[h].targetEpoch == 0, "Already enqueued"); queue[h] = TimelockedCallInfo({ createdBy: msg.sender, consumerAddress: consumerAddr, targetEpoch: block.timestamp + timeLockDuration[consumerAddr] }); emit HashScheduled(h, consumerAddr); } /** * @notice Consumes the hash specified. * @param h Specifies the hash. */ function consume(bytes32 h) external override nonReentrant ifTimeLockConfigured { _consume(h); } /** * @notice Consumes the hash specified. The hash represents the transferOwnership function. * @param h Specifies the hash. * @param prevOwnerAddr The current owner of the contract at hand. * @param newOwnerAddr The address of the new owner. */ function consumeOwnership( bytes32 h, address prevOwnerAddr, address newOwnerAddr ) external override nonReentrant ifTimeLockConfigured { _disableScheduler(prevOwnerAddr); _consume(h); _enableScheduler(newOwnerAddr); } function _consume(bytes32 h) internal { require(queue[h].targetEpoch > 0, "Hash not enqueued"); require(msg.sender == queue[h].consumerAddress, "Unauthorized consumer"); require(block.timestamp > queue[h].targetEpoch, "Timelock in place"); delete queue[h]; emit HashConsumed(h, msg.sender); } function _enableScheduler(address addr) internal { require(addr != address(0), "Address required"); require(!whitelistedSchedulers[msg.sender][addr], "Already enabled"); whitelistedSchedulers[msg.sender][addr] = true; emit SchedulerEnabled(msg.sender, addr); } function _disableScheduler(address addr) internal { require(addr != address(0), "Address required"); require(whitelistedSchedulers[msg.sender][addr], "Already disabled"); whitelistedSchedulers[msg.sender][addr] = false; emit SchedulerDisabled(msg.sender, addr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"ownerAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OwnerOnly","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"h","type":"bytes32"},{"indexed":false,"internalType":"address","name":"consumerAddress","type":"address"}],"name":"HashConsumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"h","type":"bytes32"},{"indexed":false,"internalType":"address","name":"consumerAddress","type":"address"}],"name":"HashScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"OnAddressDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"OnAddressEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"consumerAddress","type":"address"},{"indexed":false,"internalType":"address","name":"schedulerAddress","type":"address"}],"name":"SchedulerDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"consumerAddress","type":"address"},{"indexed":false,"internalType":"address","name":"schedulerAddress","type":"address"}],"name":"SchedulerEnabled","type":"event"},{"inputs":[{"internalType":"bytes32","name":"h","type":"bytes32"}],"name":"consume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"h","type":"bytes32"},{"internalType":"address","name":"prevOwnerAddr","type":"address"},{"internalType":"address","name":"newOwnerAddr","type":"address"}],"name":"consumeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"disableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"arr","type":"address[]"}],"name":"disableAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"disableScheduler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"enableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"arr","type":"address[]"}],"name":"enableAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"enableScheduler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"newTimeLockDuration","type":"uint256"}],"name":"initScheduler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelistedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queue","outputs":[{"internalType":"uint256","name":"targetEpoch","type":"uint256"},{"internalType":"address","name":"createdBy","type":"address"},{"internalType":"address","name":"consumerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"h","type":"bytes32"},{"internalType":"address","name":"consumerAddr","type":"address"}],"name":"schedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"timeLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80639eefdd8711610093578063f6fd7c8d11610063578063f6fd7c8d14610248578063f832e2151461025b578063f914d17814610288578063fcc91b341461029b575f80fd5b80639eefdd87146101fc578063af6f8c1b1461020f578063dd331c2e14610222578063f2fde38b14610235575f80fd5b80636bf85c43116100ce5780636bf85c431461015c57806377dfbea21461016f5780637c10dea6146101825780638da5cb5b146101e1575f80fd5b8063044b42e1146100f45780635036258b146101095780635fae05761461011c575b5f80fd5b61010761010236600461106d565b6102ae565b005b61010761011736600461106d565b6102ff565b61014761012a36600461106d565b6001600160a01b03165f9081526002602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61010761016a36600461108d565b6103c6565b61010761017d3660046110fe565b6105e4565b6101bc610190366004611128565b60046020525f908152604090208054600182015460029092015490916001600160a01b03908116911683565b604080519384526001600160a01b039283166020850152911690820152606001610153565b6001546040516001600160a01b039091168152602001610153565b61010761020a36600461106d565b6107f3565b61010761021d366004611128565b6108b1565b61010761023036600461113f565b6108ed565b61010761024336600461106d565b610a75565b61010761025636600461106d565b610ab1565b61027a61026936600461106d565b60056020525f908152604090205481565b604051908152602001610153565b610107610296366004611167565b610aed565b6101076102a936600461108d565b610b49565b6102b6610ca5565b335f908152600560205260409020546102ea5760405162461bcd60e51b81526004016102e1906111a0565b60405180910390fd5b6102f381610cfc565b6102fc60015f55565b50565b610307610ca5565b6001546001600160a01b0316331461033257604051630b2db9b760e31b815260040160405180910390fd5b6001600160a01b0381165f9081526002602052604090205460ff166103695760405162461bcd60e51b81526004016102e1906111c8565b6001600160a01b0381165f81815260026020908152604091829020805460ff1916905590519182527f817a22f8606c1982bfadd76a8d2f2356335b22f6731f0d5cdfdef6f033b14dc391015b60405180910390a16102fc60015f55565b6103ce610ca5565b6001546001600160a01b031633146103f957604051630b2db9b760e31b815260040160405180910390fd5b8061043b5760405162461bcd60e51b81526020600482015260126024820152711059191c995cdcd95cc81c995c5d5a5c995960721b60448201526064016102e1565b5f5b818110156105d6575f838383818110610458576104586111f2565b905060200201602081019061046d919061106d565b6001600160a01b0316036104b55760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016102e1565b60025f8484848181106104ca576104ca6111f2565b90506020020160208101906104df919061106d565b6001600160a01b0316815260208101919091526040015f205460ff16156105185760405162461bcd60e51b81526004016102e190611206565b600160025f85858581811061052f5761052f6111f2565b9050602002016020810190610544919061106d565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f36eb734aedf7abf48fbef350f1aa23aa2cf37b6ea7d7fc668e15dca0e9bb72af83838381811061059e5761059e6111f2565b90506020020160208101906105b3919061106d565b6040516001600160a01b03909116815260200160405180910390a160010161043d565b506105e060015f55565b5050565b6105ec610ca5565b816106295760405162461bcd60e51b815260206004820152600d60248201526c12185cda081c995c5d5a5c9959609a1b60448201526064016102e1565b6001600160a01b0381165f90815260036020908152604080832033845290915290205460ff166106915760405162461bcd60e51b81526020600482015260136024820152722ab730baba3437b934bd32b21039b2b73232b960691b60448201526064016102e1565b6001600160a01b0381165f908152600560205260409020546106c55760405162461bcd60e51b81526004016102e1906111a0565b5f82815260046020526040902054156107135760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195b9c5d595d595960821b60448201526064016102e1565b604080516060810182526001600160a01b0383165f908152600560205291909120548190610741904261122f565b8152336020808301919091526001600160a01b038481166040938401525f8681526004835283902084518155918401516001830180549183166001600160a01b03199283161790559383015160029092018054929091169190931617909155517f6ef595d41bb19bf4009067ebfca1e965c782641ffd735166641d1832d9955ca5906107e290849084909182526001600160a01b0316602082015260400190565b60405180910390a16105e060015f55565b6107fb610ca5565b6001546001600160a01b0316331461082657604051630b2db9b760e31b815260040160405180910390fd5b6001600160a01b0381165f9081526002602052604090205460ff161561085e5760405162461bcd60e51b81526004016102e190611206565b6001600160a01b0381165f81815260026020908152604091829020805460ff1916600117905590519182527f36eb734aedf7abf48fbef350f1aa23aa2cf37b6ea7d7fc668e15dca0e9bb72af91016103b5565b6108b9610ca5565b335f908152600560205260409020546108e45760405162461bcd60e51b81526004016102e1906111a0565b6102f381610dd0565b6108f5610ca5565b335f9081526002602052604090205460ff166109495760405162461bcd60e51b81526020600482015260136024820152722ab730baba3437b934bd32b21039b2b73232b960691b60448201526064016102e1565b6001600160a01b03821661096f5760405162461bcd60e51b81526004016102e190611254565b5f81116109b25760405162461bcd60e51b8152602060048201526011602482015270111d5c985d1a5bdb881c995c5d5a5c9959607a1b60448201526064016102e1565b335f9081526005602052604090205415610a045760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016102e1565b335f8181526003602090815260408083206001600160a01b038716808552908352818420805460ff1916600117905584845260058352928190208590558051938452908301919091527f2e1532fab4575bbd4b71ca99084eba74c2dc594c534a46ea4d8271ba87686dbb91016107e2565b610a7d610ca5565b6001546001600160a01b03163314610aa857604051630b2db9b760e31b815260040160405180910390fd5b6102f381610f38565b610ab9610ca5565b335f90815260056020526040902054610ae45760405162461bcd60e51b81526004016102e1906111a0565b6102f381610f89565b610af5610ca5565b335f90815260056020526040902054610b205760405162461bcd60e51b81526004016102e1906111a0565b610b2982610f89565b610b3283610dd0565b610b3b81610cfc565b610b4460015f55565b505050565b610b51610ca5565b6001546001600160a01b03163314610b7c57604051630b2db9b760e31b815260040160405180910390fd5b5f5b818110156105d65760025f848484818110610b9b57610b9b6111f2565b9050602002016020810190610bb0919061106d565b6001600160a01b0316815260208101919091526040015f205460ff16610be85760405162461bcd60e51b81526004016102e1906111c8565b5f60025f858585818110610bfe57610bfe6111f2565b9050602002016020810190610c13919061106d565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f817a22f8606c1982bfadd76a8d2f2356335b22f6731f0d5cdfdef6f033b14dc3838383818110610c6d57610c6d6111f2565b9050602002016020810190610c82919061106d565b6040516001600160a01b03909116815260200160405180910390a1600101610b7e565b60025f5403610cf65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016102e1565b60025f55565b6001600160a01b038116610d225760405162461bcd60e51b81526004016102e190611254565b335f9081526003602090815260408083206001600160a01b038516845290915290205460ff1615610d655760405162461bcd60e51b81526004016102e190611206565b335f8181526003602090815260408083206001600160a01b03861680855290835292819020805460ff191660011790558051938452908301919091527f2e1532fab4575bbd4b71ca99084eba74c2dc594c534a46ea4d8271ba87686dbb91015b60405180910390a150565b5f81815260046020526040902054610e1e5760405162461bcd60e51b815260206004820152601160248201527012185cda081b9bdd08195b9c5d595d5959607a1b60448201526064016102e1565b5f818152600460205260409020600201546001600160a01b03163314610e7e5760405162461bcd60e51b81526020600482015260156024820152742ab730baba3437b934bd32b21031b7b739bab6b2b960591b60448201526064016102e1565b5f818152600460205260409020544211610ece5760405162461bcd60e51b815260206004820152601160248201527054696d656c6f636b20696e20706c61636560781b60448201526064016102e1565b5f8181526004602090815260408083209283556001830180546001600160a01b031990811690915560029093018054909316909255815183815233918101919091527fc0c97b5bfc2b0d319a6dadd3efddd19273d76957d4cf2c1f72697f8b589dea059101610dc5565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038116610faf5760405162461bcd60e51b81526004016102e190611254565b335f9081526003602090815260408083206001600160a01b038516845290915290205460ff16610ff15760405162461bcd60e51b81526004016102e1906111c8565b335f8181526003602090815260408083206001600160a01b03861680855290835292819020805460ff191690558051938452908301919091527f07afcfd70ee49c21e69bef23484ab1dfaba225d7d1c87fcbad238e86590972879101610dc5565b80356001600160a01b0381168114611068575f80fd5b919050565b5f6020828403121561107d575f80fd5b61108682611052565b9392505050565b5f806020838503121561109e575f80fd5b823567ffffffffffffffff8111156110b4575f80fd5b8301601f810185136110c4575f80fd5b803567ffffffffffffffff8111156110da575f80fd5b8560208260051b84010111156110ee575f80fd5b6020919091019590945092505050565b5f806040838503121561110f575f80fd5b8235915061111f60208401611052565b90509250929050565b5f60208284031215611138575f80fd5b5035919050565b5f8060408385031215611150575f80fd5b61115983611052565b946020939093013593505050565b5f805f60608486031215611179575f80fd5b8335925061118960208501611052565b915061119760408501611052565b90509250925092565b6020808252600e908201526d139bdd0818dbdb999a59dd5c995960921b604082015260600190565b60208082526010908201526f105b1c9958591e48191a5cd8589b195960821b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252600f908201526e105b1c9958591e48195b98589b1959608a1b604082015260600190565b8082018082111561124e57634e487b7160e01b5f52601160045260245ffd5b92915050565b60208082526010908201526f1059191c995cdcc81c995c5d5a5c995960821b60408201526060019056fea2646970667358221220b502bf6b4f608850a057596a716afd3824e208c5cf9e846087f8e6e2c3c5133664736f6c634300081a0033
Deployed Bytecode Sourcemap
7621:5834:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10385:132;;;;;;:::i;:::-;;:::i;:::-;;6521:240;;;;;;:::i;:::-;;:::i;7405:136::-;;;;;;:::i;:::-;-1:-1:-1;;;;;7506:27:0;7482:4;7506:27;;;:21;:27;;;;;;;;;7405:136;;;;548:14:1;;541:22;523:41;;511:2;496:18;7405:136:0;;;;;;;;5957:447;;;;;;:::i;:::-;;:::i;11051:636::-;;;;;;:::i;:::-;;:::i;8190:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8190:52:0;;;;;;;;;;;1928:25:1;;;-1:-1:-1;;;;;1989:32:1;;;1984:2;1969:18;;1962:60;2058:32;;2038:18;;;2031:60;1916:2;1901:18;8190:52:0;1726:371:1;5042:89:0;5117:6;;5042:89;;-1:-1:-1;;;;;5117:6:0;;;2248:51:1;;2236:2;2221:18;5042:89:0;2102:203:1;5599:237:0;;;;;;:::i;:::-;;:::i;11795:110::-;;;;;;:::i;:::-;;:::i;9665:495::-;;;;;;:::i;:::-;;:::i;4777:132::-;;;;;;:::i;:::-;;:::i;10713:134::-;;;;;;:::i;:::-;;:::i;8318:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2715:25:1;;;2703:2;2688:18;8318:52:0;2569:177:1;12195:282:0;;;;;;:::i;:::-;;:::i;6881:329::-;;;;;;:::i;:::-;;:::i;10385:132::-;2693:21;:19;:21::i;:::-;9298:10:::1;9312:1;9281:28:::0;;;:16:::1;:28;::::0;;;;;9273:59:::1;;;;-1:-1:-1::0;;;9273:59:0::1;;;;;;;:::i;:::-;;;;;;;;;10487:22:::2;10504:4;10487:16;:22::i;:::-;2737:20:::0;2171:1;3299:17;:43;3116:234;2737:20;10385:132;:::o;6521:240::-;2693:21;:19;:21::i;:::-;4187:6:::1;::::0;-1:-1:-1;;;;;4187:6:0::1;4173:10;:20;4169:44;;4202:11;;-1:-1:-1::0;;;4202:11:0::1;;;;;;;;;;;4169:44;-1:-1:-1::0;;;;;6620:27:0;::::2;;::::0;;;:21:::2;:27;::::0;;;;;::::2;;6612:56;;;;-1:-1:-1::0;;;6612:56:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6679:27:0;::::2;6709:5;6679:27:::0;;;:21:::2;:27;::::0;;;;;;;;:35;;-1:-1:-1;;6679:35:0::2;::::0;;6730:23;;2248:51:1;;;6730:23:0::2;::::0;2221:18:1;6730:23:0::2;;;;;;;;2737:20:::0;2171:1;3299:17;:43;3116:234;5957:447;2693:21;:19;:21::i;:::-;4187:6:::1;::::0;-1:-1:-1;;;;;4187:6:0::1;4173:10;:20;4169:44;;4202:11;;-1:-1:-1::0;;;4202:11:0::1;;;;;;;;;;;4169:44;6067:14:::0;6059:45:::2;;;::::0;-1:-1:-1;;;6059:45:0;;4020:2:1;6059:45:0::2;::::0;::::2;4002:21:1::0;4059:2;4039:18;;;4032:30;-1:-1:-1;;;4078:18:1;;;4071:48;4136:18;;6059:45:0::2;3818:342:1::0;6059:45:0::2;6122:9;6117:280;6133:14:::0;;::::2;6117:280;;;6195:1;6177:3:::0;;6181:1;6177:6;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6177:20:0::2;::::0;6169:48:::2;;;::::0;-1:-1:-1;;;6169:48:0;;4499:2:1;6169:48:0::2;::::0;::::2;4481:21:1::0;4538:2;4518:18;;;4511:30;-1:-1:-1;;;4557:18:1;;;4550:45;4612:18;;6169:48:0::2;4297:339:1::0;6169:48:0::2;6241:21;:29;6263:3;;6267:1;6263:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6241:29:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;6241:29:0;;::::2;;6240:30;6232:58;;;;-1:-1:-1::0;;;6232:58:0::2;;;;;;;:::i;:::-;6337:4;6305:21;:29;6327:3;;6331:1;6327:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6305:29:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;6305:29:0;:36;;-1:-1:-1;;6305:36:0::2;::::0;::::2;;::::0;;;::::2;::::0;;6361:24:::2;6378:3:::0;;6382:1;6378:6;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6361:24;::::0;-1:-1:-1;;;;;2266:32:1;;;2248:51;;2236:2;2221:18;6361:24:0::2;;;;;;;6149:3;;6117:280;;;;2737:20:::0;2171:1;3299:17;:43;3116:234;2737:20;5957:447;;:::o;11051:636::-;2693:21;:19;:21::i;:::-;11152:1;11144:41:::1;;;::::0;-1:-1:-1;;;11144:41:0;;5187:2:1;11144:41:0::1;::::0;::::1;5169:21:1::0;5226:2;5206:18;;;5199:30;-1:-1:-1;;;5245:18:1;;;5238:43;5298:18;;11144:41:0::1;4985:337:1::0;11144:41:0::1;-1:-1:-1::0;;;;;11204:35:0;::::1;;::::0;;;:21:::1;:35;::::0;;;;;;;11240:10:::1;11204:47:::0;;;;;;;;::::1;;11196:79;;;::::0;-1:-1:-1;;;11196:79:0;;5529:2:1;11196:79:0::1;::::0;::::1;5511:21:1::0;5568:2;5548:18;;;5541:30;-1:-1:-1;;;5587:18:1;;;5580:49;5646:18;;11196:79:0::1;5327:343:1::0;11196:79:0::1;-1:-1:-1::0;;;;;11294:30:0;::::1;11327:1;11294:30:::0;;;:16:::1;:30;::::0;;;;;11286:61:::1;;;;-1:-1:-1::0;;;11286:61:0::1;;;;;;;:::i;:::-;11366:8;::::0;;;:5:::1;:8;::::0;;;;:20;:25;11358:54:::1;;;::::0;-1:-1:-1;;;11358:54:0;;5877:2:1;11358:54:0::1;::::0;::::1;5859:21:1::0;5916:2;5896:18;;;5889:30;-1:-1:-1;;;5935:18:1;;;5928:46;5991:18;;11358:54:0::1;5675:340:1::0;11358:54:0::1;11444:187;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;11589:30:0;::::1;-1:-1:-1::0;11589:30:0;;;:16:::1;:30;::::0;;;;;;11444:187;;11571:48:::1;::::0;:15:::1;:48;:::i;:::-;11444:187:::0;;11489:10:::1;11444:187;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;11444:187:0;;::::1;::::0;;;;;-1:-1:-1;11433:8:0;;;:5:::1;:8:::0;;;;;:198;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;11433:198:0;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;::::1;;::::0;;;11649:30;::::1;::::0;::::1;::::0;11439:1;;11531:12;;6421:25:1;;;-1:-1:-1;;;;;6482:32:1;6477:2;6462:18;;6455:60;6409:2;6394:18;;6247:274;11649:30:0::1;;;;;;;;2737:20:::0;2171:1;3299:17;:43;3116:234;5599:237;2693:21;:19;:21::i;:::-;4187:6:::1;::::0;-1:-1:-1;;;;;4187:6:0::1;4173:10;:20;4169:44;;4202:11;;-1:-1:-1::0;;;4202:11:0::1;;;;;;;;;;;4169:44;-1:-1:-1::0;;;;;5698:27:0;::::2;;::::0;;;:21:::2;:27;::::0;;;;;::::2;;5697:28;5689:56;;;;-1:-1:-1::0;;;5689:56:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5756:27:0;::::2;;::::0;;;:21:::2;:27;::::0;;;;;;;;:34;;-1:-1:-1;;5756:34:0::2;5786:4;5756:34;::::0;;5806:22;;2248:51:1;;;5806:22:0::2;::::0;2221:18:1;5806:22:0::2;2102:203:1::0;11795:110:0;2693:21;:19;:21::i;:::-;9298:10:::1;9312:1;9281:28:::0;;;:16:::1;:28;::::0;;;;;9273:59:::1;;;;-1:-1:-1::0;;;9273:59:0::1;;;;;;;:::i;:::-;11886:11:::2;11895:1;11886:8;:11::i;9665:495::-:0;2693:21;:19;:21::i;:::-;9167:10:::1;9145:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;9137:65;;;::::0;-1:-1:-1;;;9137:65:0;;5529:2:1;9137:65:0::1;::::0;::::1;5511:21:1::0;5568:2;5548:18;;;5541:30;-1:-1:-1;;;5587:18:1;;;5580:49;5646:18;;9137:65:0::1;5327:343:1::0;9137:65:0::1;-1:-1:-1::0;;;;;9801:18:0;::::2;9793:47;;;;-1:-1:-1::0;;;9793:47:0::2;;;;;;;:::i;:::-;9881:1;9859:19;:23;9851:53;;;::::0;-1:-1:-1;;;9851:53:0;;7073:2:1;9851:53:0::2;::::0;::::2;7055:21:1::0;7112:2;7092:18;;;7085:30;-1:-1:-1;;;7131:18:1;;;7124:47;7188:18;;9851:53:0::2;6871:341:1::0;9851:53:0::2;9940:10;9923:28;::::0;;;:16:::2;:28;::::0;;;;;:33;9915:65:::2;;;::::0;-1:-1:-1;;;9915:65:0;;7419:2:1;9915:65:0::2;::::0;::::2;7401:21:1::0;7458:2;7438:18;;;7431:30;-1:-1:-1;;;7477:18:1;;;7470:49;7536:18;;9915:65:0::2;7217:343:1::0;9915:65:0::2;10015:10;9993:33;::::0;;;:21:::2;:33;::::0;;;;;;;-1:-1:-1;;;;;9993:39:0;::::2;::::0;;;;;;;;;:46;;-1:-1:-1;;9993:46:0::2;10035:4;9993:46;::::0;;10050:28;;;:16:::2;:28:::0;;;;;;:50;;;10118:34;;7739:51:1;;;7806:18;;;7799:60;;;;10118:34:0::2;::::0;7712:18:1;10118:34:0::2;7565:300:1::0;4777:132:0;2693:21;:19;:21::i;:::-;4187:6:::1;::::0;-1:-1:-1;;;;;4187:6:0::1;4173:10;:20;4169:44;;4202:11;;-1:-1:-1::0;;;4202:11:0::1;;;;;;;;;;;4169:44;4873:28:::2;4892:8;4873:18;:28::i;10713:134::-:0;2693:21;:19;:21::i;:::-;9298:10:::1;9312:1;9281:28:::0;;;:16:::1;:28;::::0;;;;;9273:59:::1;;;;-1:-1:-1::0;;;9273:59:0::1;;;;;;;:::i;:::-;10816:23:::2;10834:4;10816:17;:23::i;12195:282::-:0;2693:21;:19;:21::i;:::-;9298:10:::1;9312:1;9281:28:::0;;;:16:::1;:28;::::0;;;;;9273:59:::1;;;;-1:-1:-1::0;;;9273:59:0::1;;;;;;;:::i;:::-;12374:32:::2;12392:13;12374:17;:32::i;:::-;12417:11;12426:1;12417:8;:11::i;:::-;12439:30;12456:12;12439:16;:30::i;:::-;2737:20:::0;2171:1;3299:17;:43;3116:234;2737:20;12195:282;;;:::o;6881:329::-;2693:21;:19;:21::i;:::-;4187:6:::1;::::0;-1:-1:-1;;;;;4187:6:0::1;4173:10;:20;4169:44;;4202:11;;-1:-1:-1::0;;;4202:11:0::1;;;;;;;;;;;4169:44;6989:9:::2;6984:219;7000:14:::0;;::::2;6984:219;;;7044:21;:29;7066:3;;7070:1;7066:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7044:29:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;7044:29:0;;::::2;;7036:58;;;;-1:-1:-1::0;;;7036:58:0::2;;;;;;;:::i;:::-;7141:5;7109:21;:29;7131:3;;7135:1;7131:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7109:29:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;7109:29:0;:37;;-1:-1:-1;;7109:37:0::2;::::0;::::2;;::::0;;;::::2;::::0;;7166:25:::2;7184:3:::0;;7188:1;7184:6;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7166:25;::::0;-1:-1:-1;;;;;2266:32:1;;;2248:51;;2236:2;2221:18;7166:25:0::2;;;;;;;7016:3;;6984:219;;2773:335:::0;2227:1;2907:17;;:40;2899:84;;;;-1:-1:-1;;;2899:84:0;;8072:2:1;2899:84:0;;;8054:21:1;8111:2;8091:18;;;8084:30;8150:33;8130:18;;;8123:61;8201:18;;2899:84:0;7870:355:1;2899:84:0;2227:1;3061:17;:39;2773:335::o;12839:301::-;-1:-1:-1;;;;;12907:18:0;;12899:47;;;;-1:-1:-1;;;12899:47:0;;;;;;;:::i;:::-;12988:10;12966:33;;;;:21;:33;;;;;;;;-1:-1:-1;;;;;12966:39:0;;;;;;;;;;;;12965:40;12957:68;;;;-1:-1:-1;;;12957:68:0;;;;;;;:::i;:::-;13058:10;13036:33;;;;:21;:33;;;;;;;;-1:-1:-1;;;;;13036:39:0;;;;;;;;;;;;:46;;-1:-1:-1;;13036:46:0;13078:4;13036:46;;;13098:34;;7739:51:1;;;7806:18;;;7799:60;;;;13098:34:0;;7712:18:1;13098:34:0;;;;;;;;12839:301;:::o;12485:346::-;12565:1;12542:8;;;:5;:8;;;;;:20;12534:54;;;;-1:-1:-1;;;12534:54:0;;8432:2:1;12534:54:0;;;8414:21:1;8471:2;8451:18;;;8444:30;-1:-1:-1;;;8490:18:1;;;8483:47;8547:18;;12534:54:0;8230:341:1;12534:54:0;12621:8;;;;:5;:8;;;;;:24;;;-1:-1:-1;;;;;12621:24:0;12607:10;:38;12599:72;;;;-1:-1:-1;;;12599:72:0;;8778:2:1;12599:72:0;;;8760:21:1;8817:2;8797:18;;;8790:30;-1:-1:-1;;;8836:18:1;;;8829:51;8897:18;;12599:72:0;8576:345:1;12599:72:0;12708:8;;;;:5;:8;;;;;:20;12690:15;:38;12682:68;;;;-1:-1:-1;;;12682:68:0;;9128:2:1;12682:68:0;;;9110:21:1;9167:2;9147:18;;;9140:30;-1:-1:-1;;;9186:18:1;;;9179:47;9243:18;;12682:68:0;8926:341:1;12682:68:0;12770:8;;;;:5;:8;;;;;;;;12763:15;;;;;;;;-1:-1:-1;;;;;;12763:15:0;;;;;;;;;;;;;;;;;;12796:27;;6421:25:1;;;12812:10:0;6462:18:1;;;6455:60;;;;12796:27:0;;6394:18:1;12796:27:0;6247:274:1;4241:191:0;4334:6;;;-1:-1:-1;;;;;4351:17:0;;;-1:-1:-1;;;;;;4351:17:0;;;;;;;4384:40;;4334:6;;;4351:17;4334:6;;4384:40;;4315:16;;4384:40;4304:128;4241:191;:::o;13148:304::-;-1:-1:-1;;;;;13217:18:0;;13209:47;;;;-1:-1:-1;;;13209:47:0;;;;;;;:::i;:::-;13297:10;13275:33;;;;:21;:33;;;;;;;;-1:-1:-1;;;;;13275:39:0;;;;;;;;;;;;13267:68;;;;-1:-1:-1;;;13267:68:0;;;;;;;:::i;:::-;13368:10;13388:5;13346:33;;;:21;:33;;;;;;;;-1:-1:-1;;;;;13346:39:0;;;;;;;;;;;;:47;;-1:-1:-1;;13346:47:0;;;13409:35;;7739:51:1;;;7806:18;;;7799:60;;;;13409:35:0;;7712:18:1;13409:35:0;7565:300:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;575:610::-;661:6;669;722:2;710:9;701:7;697:23;693:32;690:52;;;738:1;735;728:12;690:52;778:9;765:23;811:18;803:6;800:30;797:50;;;843:1;840;833:12;797:50;866:22;;919:4;911:13;;907:27;-1:-1:-1;897:55:1;;948:1;945;938:12;897:55;988:2;975:16;1014:18;1006:6;1003:30;1000:50;;;1046:1;1043;1036:12;1000:50;1099:7;1094:2;1084:6;1081:1;1077:14;1073:2;1069:23;1065:32;1062:45;1059:65;;;1120:1;1117;1110:12;1059:65;1151:2;1143:11;;;;;1173:6;;-1:-1:-1;575:610:1;-1:-1:-1;;;575:610:1:o;1190:300::-;1258:6;1266;1319:2;1307:9;1298:7;1294:23;1290:32;1287:52;;;1335:1;1332;1325:12;1287:52;1380:23;;;-1:-1:-1;1446:38:1;1480:2;1465:18;;1446:38;:::i;:::-;1436:48;;1190:300;;;;;:::o;1495:226::-;1554:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:52;;;1623:1;1620;1613:12;1575:52;-1:-1:-1;1668:23:1;;1495:226;-1:-1:-1;1495:226:1:o;2310:254::-;2378:6;2386;2439:2;2427:9;2418:7;2414:23;2410:32;2407:52;;;2455:1;2452;2445:12;2407:52;2478:29;2497:9;2478:29;:::i;:::-;2468:39;2554:2;2539:18;;;;2526:32;;-1:-1:-1;;;2310:254:1:o;2751:374::-;2828:6;2836;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;2958:23;;;-1:-1:-1;3024:38:1;3058:2;3043:18;;3024:38;:::i;:::-;3014:48;;3081:38;3115:2;3104:9;3100:18;3081:38;:::i;:::-;3071:48;;2751:374;;;;;:::o;3130:338::-;3332:2;3314:21;;;3371:2;3351:18;;;3344:30;-1:-1:-1;;;3405:2:1;3390:18;;3383:44;3459:2;3444:18;;3130:338::o;3473:340::-;3675:2;3657:21;;;3714:2;3694:18;;;3687:30;-1:-1:-1;;;3748:2:1;3733:18;;3726:46;3804:2;3789:18;;3473:340::o;4165:127::-;4226:10;4221:3;4217:20;4214:1;4207:31;4257:4;4254:1;4247:15;4281:4;4278:1;4271:15;4641:339;4843:2;4825:21;;;4882:2;4862:18;;;4855:30;-1:-1:-1;;;4916:2:1;4901:18;;4894:45;4971:2;4956:18;;4641:339::o;6020:222::-;6085:9;;;6106:10;;;6103:133;;;6158:10;6153:3;6149:20;6146:1;6139:31;6193:4;6190:1;6183:15;6221:4;6218:1;6211:15;6103:133;6020:222;;;;:::o;6526:340::-;6728:2;6710:21;;;6767:2;6747:18;;;6740:30;-1:-1:-1;;;6801:2:1;6786:18;;6779:46;6857:2;6842:18;;6526:340::o
Swarm Source
ipfs://b502bf6b4f608850a057596a716afd3824e208c5cf9e846087f8e6e2c3c51336
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.