Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 24441064 | 23 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
AccessControlFacetTimelockable
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {LibTimelockable} from "../../../libraries/extensions/timelock/LibTimelockable.sol";
import {AccessControlFacet} from "../../AccessControlFacet.sol";
contract AccessControlFacetTimelockable is AccessControlFacet {
constructor() {}
/**
* @inheritdoc AccessControlFacet
*
* @dev MUST revert if not within timelock execution window
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual override returns (bool success_) {
bytes4 selector = bytes4(msg.data[:4]);
bytes calldata data = msg.data[4:];
LibTimelockable._executeTransaction(selector, data, msg.sender);
success_ = super.renounceRole(role, callerConfirmation);
}
/**
* @inheritdoc AccessControlFacet
*
* @dev MUST revert if not within timelock execution window
*/
function grantRole(bytes32 role, address account) public virtual override returns (bool success_) {
bytes4 selector = bytes4(msg.data[:4]);
bytes calldata data = msg.data[4:];
LibTimelockable._executeTransaction(selector, data, msg.sender);
success_ = super.grantRole(role, account);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {IAccessControl} from "../interfaces/IAccessControl.sol";
import {LibAccessControl} from "../libraries/LibAccessControl.sol";
contract AccessControlFacet is IAccessControl {
constructor() {}
modifier onlyRole(bytes32 role) {
LibAccessControl._checkRole(role, msg.sender);
_;
}
/**
* @inheritdoc IAccessControl
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool hasRole_) {
return LibAccessControl._hasRole(role, account);
}
/**
* @inheritdoc IAccessControl
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32 role_) {
return LibAccessControl._getRoleAdmin(role);
}
/**
* @inheritdoc IAccessControl
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual returns (bool success_) {
require(callerConfirmation == msg.sender, "FACT0404");
return LibAccessControl._revokeRole(role, callerConfirmation);
}
/**
* @inheritdoc IAccessControl
*/
function revokeRole(
bytes32 role,
address account
) public virtual onlyRole(getRoleAdmin(role)) returns (bool success_) {
return LibAccessControl._revokeRole(role, account);
}
/**
* @inheritdoc IAccessControl
*/
function grantRole(
bytes32 role,
address account
) public virtual onlyRole(getRoleAdmin(role)) returns (bool success_) {
return LibAccessControl._grantRole(role, account);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.17;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @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 returns (bool hasRole_);
/**
* @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 returns (bytes32 role_);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* If `account` had not been already granted `role`, return true, else false.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external returns (bool success_);
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* If `account` had been already granted `role`, return true, else false.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external returns (bool success_);
/**
* @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.
*
* If calling account had been already granted `role`, return true, else false.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external returns (bool success_);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
library LibTimelockable {
bytes32 private constant TIMELOCKABLE_STORAGE_POSITION = keccak256("fact.timelockable.storage");
uint256 private constant MINIMUM_TIMELOCK_DELAY = 12 minutes;
uint256 private constant MAXIMUM_TIMELOCK_DELAY = 24 hours;
uint256 private constant GRACE_PERIOD = 24 hours;
struct TimelockStorage {
mapping(bytes32 => uint256) _queuedTransactions;
uint256 _timelockDelay;
}
event TimelockDelaySet(address indexed caller_, uint256 oldDelay_, uint256 newDelay_);
event TransactionQueued(bytes4 indexed selector_, bytes data_, address indexed caller_, uint256 eta_);
event TransactionCancelled(bytes4 indexed selector_, bytes data_, address indexed caller_, uint256 eta_);
event TransactionRevoked(bytes4 indexed selector_, bytes data_, address indexed caller_, uint256 eta_);
event TransactionExecuted(bytes4 indexed selector_, bytes data_, address indexed caller_, uint256 eta_);
function ref() internal pure returns (TimelockStorage storage s) {
bytes32 position = TIMELOCKABLE_STORAGE_POSITION;
assembly {
s.slot := position
}
}
function _setTimelockDelay(uint256 delay_, address caller_) internal returns (bool success_) {
require((delay_ >= MINIMUM_TIMELOCK_DELAY) && (MAXIMUM_TIMELOCK_DELAY >= delay_), "FACT1000");
uint256 oldDelay = ref()._timelockDelay;
ref()._timelockDelay = delay_;
emit TimelockDelaySet(caller_, oldDelay, delay_);
return true;
}
function _queueTransaction(bytes4 selector_, bytes calldata data_, address caller_) internal returns (bool success_) {
uint256 eta = block.timestamp + ref()._timelockDelay;
bytes32 transactionID = _getTransactionID(selector_, data_, caller_);
require(ref()._queuedTransactions[transactionID] == 0, "FACT1001");
ref()._queuedTransactions[transactionID] = eta;
emit TransactionQueued(selector_, data_, caller_, eta);
return true;
}
function _cancelTransaction(
bytes4 selector_,
bytes calldata data_,
address caller_
) internal returns (bool success_) {
bytes32 transactionID = _getTransactionID(selector_, data_, caller_);
require(ref()._queuedTransactions[transactionID] != 0, "FACT1002");
uint256 eta = ref()._queuedTransactions[transactionID];
_clearQueuedTransaction(transactionID);
emit TransactionCancelled(selector_, data_, caller_, eta);
return true;
}
function _revokeTransaction(
bytes4 selector_,
bytes calldata data_,
address caller_
) internal returns (bool success_) {
bytes32 transactionID = _getTransactionID(selector_, data_, caller_);
require(ref()._queuedTransactions[transactionID] != 0, "FACT1003");
uint256 eta = ref()._queuedTransactions[transactionID];
_clearQueuedTransaction(transactionID);
emit TransactionRevoked(selector_, data_, caller_, eta);
return true;
}
function _executeTransaction(
bytes4 selector_,
bytes calldata data_,
address caller_
) internal returns (bool success_) {
bytes32 transactionID = _getTransactionID(selector_, data_, caller_);
require(_isExecutable(selector_, data_, caller_), "FACT1004");
uint256 eta = ref()._queuedTransactions[transactionID];
_clearQueuedTransaction(transactionID);
emit TransactionExecuted(selector_, data_, caller_, eta);
return true;
}
function _executableAt(bytes4 selector_, bytes calldata data_, address caller_) internal view returns (uint256 eta_) {
bytes32 transactionID = _getTransactionID(selector_, data_, caller_);
return ref()._queuedTransactions[transactionID];
}
function _isExecutable(
bytes4 selector_,
bytes calldata data_,
address caller_
) internal view returns (bool callable_) {
bytes32 transactionID = _getTransactionID(selector_, data_, caller_);
uint256 eta = ref()._queuedTransactions[transactionID];
callable_ = (eta != 0 && block.timestamp >= eta && block.timestamp <= eta + GRACE_PERIOD);
}
function _getTransactionID(
bytes4 selector_,
bytes calldata data_,
address caller_
) internal pure returns (bytes32 transactionID_) {
transactionID_ = keccak256(abi.encodePacked(selector_, data_, caller_));
}
function _clearQueuedTransaction(bytes32 transactionID) internal {
delete ref()._queuedTransactions[transactionID];
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
library LibAccessControl {
bytes32 private constant ACCESS_STORAGE_POSITION = keccak256("fact.accesscontrol.storage");
bytes32 private constant DEFAULT_ADMIN_ROLE = 0x00;
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
struct RoleData {
mapping(address => bool) hasRole;
bytes32 adminRole;
}
struct AccessControlStorage {
mapping(bytes32 => RoleData) _roles;
}
function ref() internal pure returns (AccessControlStorage storage s) {
bytes32 position = ACCESS_STORAGE_POSITION;
assembly {
s.slot := position
}
}
function _hasRole(bytes32 role, address account) internal view returns (bool) {
return ref()._roles[role].hasRole[account];
}
function _getRoleAdmin(bytes32 role) internal view returns (bytes32) {
return ref()._roles[role].adminRole;
}
function _grantRole(bytes32 role, address account) internal returns (bool) {
if (!_hasRole(role, account)) {
ref()._roles[role].hasRole[account] = true;
emit RoleGranted(role, account, msg.sender);
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account) internal returns (bool) {
if (_hasRole(role, account)) {
ref()._roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, msg.sender);
return true;
} else {
return false;
}
}
function _checkRole(bytes32 role, address account) internal view {
require(_hasRole(role, account), "FACT0403");
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal {
bytes32 previousAdminRole = _getRoleAdmin(role);
ref()._roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _getDefaultAdminRole() internal pure returns (bytes32) {
return DEFAULT_ADMIN_ROLE;
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":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":true,"internalType":"bytes4","name":"selector_","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"data_","type":"bytes"},{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":false,"internalType":"uint256","name":"eta_","type":"uint256"}],"name":"TransactionExecuted","type":"event"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"role_","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052348015600f57600080fd5b50610db78061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063248a9ca31461005c5780632f2ff15d1461008c57806336568abe146100bc57806391d14854146100ec578063d547741f1461011c575b600080fd5b61007660048036038101906100719190610839565b61014c565b6040516100839190610875565b60405180910390f35b6100a660048036038101906100a191906108ee565b61015e565b6040516100b39190610949565b60405180910390f35b6100d660048036038101906100d191906108ee565b6101bf565b6040516100e39190610949565b60405180910390f35b610106600480360381019061010191906108ee565b610220565b6040516101139190610949565b60405180910390f35b610136600480360381019061013191906108ee565b610234565b6040516101439190610949565b60405180910390f35b60006101578261025c565b9050919050565b6000806000366000906004926101769392919061096e565b9061018191906109ed565b9050366000803660049080926101999392919061096e565b915091506101a983838333610285565b506101b4868661038b565b935050505092915050565b6000806000366000906004926101d79392919061096e565b906101e291906109ed565b9050366000803660049080926101fa9392919061096e565b9150915061020a83838333610285565b5061021586866103b3565b935050505092915050565b600061022c8383610435565b905092915050565b600061023f8361014c565b61024981336104a9565b61025384846104f6565b91505092915050565b60006102666105eb565b6000016000838152602001908152602001600020600101549050919050565b60008061029486868686610618565b90506102a286868686610651565b6102e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d890610aa9565b60405180910390fd5b60006102eb6106ba565b600001600083815260200190815260200160002054905061030b826106e7565b8373ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f94d53a32a30b76c094d6a0636d7753625b925ea894d293fc42deb0ff4caa639f88888560405161037593929190610b40565b60405180910390a3600192505050949350505050565b60006103968361014c565b6103a081336104a9565b6103aa848461070a565b91505092915050565b60003373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041a90610bbe565b60405180910390fd5b61042d83836104f6565b905092915050565b600061043f6105eb565b600001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6104b38282610435565b6104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e990610c2a565b60405180910390fd5b5050565b60006105028383610435565b156105e05760006105116105eb565b600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506105e5565b600090505b92915050565b6000807fc627ff71927ca886b583b0076a3b65d81e973310cb7b44132f137d69378476c090508091505090565b6000848484846040516020016106319493929190610ce3565b604051602081830303815290604052805190602001209050949350505050565b60008061066086868686610618565b9050600061066c6106ba565b6000016000838152602001908152602001600020549050600081141580156106945750804210155b80156106ae575062015180816106aa9190610d4d565b4211155b92505050949350505050565b6000807fd86a106635f119ebac00673ab68a2e63966d6bbe233a2405ec36bdc96a8a265a90508091505090565b6106ef6106ba565b60000160008281526020019081526020016000206000905550565b60006107168383610435565b6107f35760016107246105eb565b600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506107f8565b600090505b92915050565b600080fd5b6000819050919050565b61081681610803565b811461082157600080fd5b50565b6000813590506108338161080d565b92915050565b60006020828403121561084f5761084e6107fe565b5b600061085d84828501610824565b91505092915050565b61086f81610803565b82525050565b600060208201905061088a6000830184610866565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108bb82610890565b9050919050565b6108cb816108b0565b81146108d657600080fd5b50565b6000813590506108e8816108c2565b92915050565b60008060408385031215610905576109046107fe565b5b600061091385828601610824565b9250506020610924858286016108d9565b9150509250929050565b60008115159050919050565b6109438161092e565b82525050565b600060208201905061095e600083018461093a565b92915050565b600080fd5b600080fd5b6000808585111561098257610981610964565b5b8386111561099357610992610969565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600082821b905092915050565b60006109f983836109a9565b82610a0481356109b4565b92506004821015610a4457610a3f7fffffffff00000000000000000000000000000000000000000000000000000000836004036008026109e0565b831692505b505092915050565b600082825260208201905092915050565b7f4641435431303034000000000000000000000000000000000000000000000000600082015250565b6000610a93600883610a4c565b9150610a9e82610a5d565b602082019050919050565b60006020820190508181036000830152610ac281610a86565b9050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000610b068385610ac9565b9350610b13838584610ada565b610b1c83610ae9565b840190509392505050565b6000819050919050565b610b3a81610b27565b82525050565b60006040820190508181036000830152610b5b818587610afa565b9050610b6a6020830184610b31565b949350505050565b7f4641435430343034000000000000000000000000000000000000000000000000600082015250565b6000610ba8600883610a4c565b9150610bb382610b72565b602082019050919050565b60006020820190508181036000830152610bd781610b9b565b9050919050565b7f4641435430343033000000000000000000000000000000000000000000000000600082015250565b6000610c14600883610a4c565b9150610c1f82610bde565b602082019050919050565b60006020820190508181036000830152610c4381610c07565b9050919050565b6000819050919050565b610c65610c60826109b4565b610c4a565b82525050565b600081905092915050565b6000610c828385610c6b565b9350610c8f838584610ada565b82840190509392505050565b60008160601b9050919050565b6000610cb382610c9b565b9050919050565b6000610cc582610ca8565b9050919050565b610cdd610cd8826108b0565b610cba565b82525050565b6000610cef8287610c54565b600482019150610d00828587610c76565b9150610d0c8284610ccc565b60148201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610d5882610b27565b9150610d6383610b27565b9250828201905080821115610d7b57610d7a610d1e565b5b9291505056fea26469706673582212201b0574a402f172f8754db8da61c794ef58b99cf227800f28dd5ccdb8a5f18f1864736f6c634300081a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063248a9ca31461005c5780632f2ff15d1461008c57806336568abe146100bc57806391d14854146100ec578063d547741f1461011c575b600080fd5b61007660048036038101906100719190610839565b61014c565b6040516100839190610875565b60405180910390f35b6100a660048036038101906100a191906108ee565b61015e565b6040516100b39190610949565b60405180910390f35b6100d660048036038101906100d191906108ee565b6101bf565b6040516100e39190610949565b60405180910390f35b610106600480360381019061010191906108ee565b610220565b6040516101139190610949565b60405180910390f35b610136600480360381019061013191906108ee565b610234565b6040516101439190610949565b60405180910390f35b60006101578261025c565b9050919050565b6000806000366000906004926101769392919061096e565b9061018191906109ed565b9050366000803660049080926101999392919061096e565b915091506101a983838333610285565b506101b4868661038b565b935050505092915050565b6000806000366000906004926101d79392919061096e565b906101e291906109ed565b9050366000803660049080926101fa9392919061096e565b9150915061020a83838333610285565b5061021586866103b3565b935050505092915050565b600061022c8383610435565b905092915050565b600061023f8361014c565b61024981336104a9565b61025384846104f6565b91505092915050565b60006102666105eb565b6000016000838152602001908152602001600020600101549050919050565b60008061029486868686610618565b90506102a286868686610651565b6102e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d890610aa9565b60405180910390fd5b60006102eb6106ba565b600001600083815260200190815260200160002054905061030b826106e7565b8373ffffffffffffffffffffffffffffffffffffffff16877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f94d53a32a30b76c094d6a0636d7753625b925ea894d293fc42deb0ff4caa639f88888560405161037593929190610b40565b60405180910390a3600192505050949350505050565b60006103968361014c565b6103a081336104a9565b6103aa848461070a565b91505092915050565b60003373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041a90610bbe565b60405180910390fd5b61042d83836104f6565b905092915050565b600061043f6105eb565b600001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6104b38282610435565b6104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e990610c2a565b60405180910390fd5b5050565b60006105028383610435565b156105e05760006105116105eb565b600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506105e5565b600090505b92915050565b6000807fc627ff71927ca886b583b0076a3b65d81e973310cb7b44132f137d69378476c090508091505090565b6000848484846040516020016106319493929190610ce3565b604051602081830303815290604052805190602001209050949350505050565b60008061066086868686610618565b9050600061066c6106ba565b6000016000838152602001908152602001600020549050600081141580156106945750804210155b80156106ae575062015180816106aa9190610d4d565b4211155b92505050949350505050565b6000807fd86a106635f119ebac00673ab68a2e63966d6bbe233a2405ec36bdc96a8a265a90508091505090565b6106ef6106ba565b60000160008281526020019081526020016000206000905550565b60006107168383610435565b6107f35760016107246105eb565b600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506107f8565b600090505b92915050565b600080fd5b6000819050919050565b61081681610803565b811461082157600080fd5b50565b6000813590506108338161080d565b92915050565b60006020828403121561084f5761084e6107fe565b5b600061085d84828501610824565b91505092915050565b61086f81610803565b82525050565b600060208201905061088a6000830184610866565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108bb82610890565b9050919050565b6108cb816108b0565b81146108d657600080fd5b50565b6000813590506108e8816108c2565b92915050565b60008060408385031215610905576109046107fe565b5b600061091385828601610824565b9250506020610924858286016108d9565b9150509250929050565b60008115159050919050565b6109438161092e565b82525050565b600060208201905061095e600083018461093a565b92915050565b600080fd5b600080fd5b6000808585111561098257610981610964565b5b8386111561099357610992610969565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600082821b905092915050565b60006109f983836109a9565b82610a0481356109b4565b92506004821015610a4457610a3f7fffffffff00000000000000000000000000000000000000000000000000000000836004036008026109e0565b831692505b505092915050565b600082825260208201905092915050565b7f4641435431303034000000000000000000000000000000000000000000000000600082015250565b6000610a93600883610a4c565b9150610a9e82610a5d565b602082019050919050565b60006020820190508181036000830152610ac281610a86565b9050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000610b068385610ac9565b9350610b13838584610ada565b610b1c83610ae9565b840190509392505050565b6000819050919050565b610b3a81610b27565b82525050565b60006040820190508181036000830152610b5b818587610afa565b9050610b6a6020830184610b31565b949350505050565b7f4641435430343034000000000000000000000000000000000000000000000000600082015250565b6000610ba8600883610a4c565b9150610bb382610b72565b602082019050919050565b60006020820190508181036000830152610bd781610b9b565b9050919050565b7f4641435430343033000000000000000000000000000000000000000000000000600082015250565b6000610c14600883610a4c565b9150610c1f82610bde565b602082019050919050565b60006020820190508181036000830152610c4381610c07565b9050919050565b6000819050919050565b610c65610c60826109b4565b610c4a565b82525050565b600081905092915050565b6000610c828385610c6b565b9350610c8f838584610ada565b82840190509392505050565b60008160601b9050919050565b6000610cb382610c9b565b9050919050565b6000610cc582610ca8565b9050919050565b610cdd610cd8826108b0565b610cba565b82525050565b6000610cef8287610c54565b600482019150610d00828587610c76565b9150610d0c8284610ccc565b60148201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610d5882610b27565b9150610d6383610b27565b9250828201905080821115610d7b57610d7a610d1e565b5b9291505056fea26469706673582212201b0574a402f172f8754db8da61c794ef58b99cf227800f28dd5ccdb8a5f18f1864736f6c634300081a0033
Deployed Bytecode Sourcemap
215:956:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;603:134:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;866:303:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;416:331;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;405:150:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1067:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;603:134;668:13;696:36;727:4;696:30;:36::i;:::-;689:43;;603:134;;;:::o;866:303:1:-;949:13;970:15;995:8;;:12;;1005:1;995:12;;;;;;;:::i;:::-;988:20;;;;;:::i;:::-;970:38;;1014:19;;1036:8;;1045:1;1036:12;;;;;;;;;:::i;:::-;1014:34;;;;1054:63;1090:8;1100:4;;1106:10;1054:35;:63::i;:::-;;1134:30;1150:4;1156:7;1134:15;:30::i;:::-;1123:41;;964:205;;;866:303;;;;:::o;416:331::-;513:13;534:15;559:8;;:12;;569:1;559:12;;;;;;;:::i;:::-;552:20;;;;;:::i;:::-;534:38;;578:19;;600:8;;609:1;600:12;;;;;;;;;:::i;:::-;578:34;;;;618:63;654:8;664:4;;670:10;618:35;:63::i;:::-;;698:44;717:4;723:18;698;:44::i;:::-;687:55;;528:219;;;416:331;;;;:::o;405:150:0:-;482:13;510:40;536:4;542:7;510:25;:40::i;:::-;503:47;;405:150;;;;:::o;1067:192::-;1183:13;1154:18;1167:4;1154:12;:18::i;:::-;300:45;328:4;334:10;300:27;:45::i;:::-;1211:43:::1;1240:4;1246:7;1211:28;:43::i;:::-;1204:50;;1067:192:::0;;;;;:::o;1008:115:3:-;1068:7;1090:5;:3;:5::i;:::-;:12;;:18;1103:4;1090:18;;;;;;;;;;;:28;;;1083:35;;1008:115;;;:::o;2931:465:4:-;3051:13;3072:21;3096:44;3114:9;3125:5;;3132:7;3096:17;:44::i;:::-;3072:68;;3154:40;3168:9;3179:5;;3186:7;3154:13;:40::i;:::-;3146:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3214:11;3228:5;:3;:5::i;:::-;:25;;:40;3254:13;3228:40;;;;;;;;;;;;3214:54;;3274:38;3298:13;3274:23;:38::i;:::-;3361:7;3323:51;;3343:9;3323:51;;;;3354:5;;3370:3;3323:51;;;;;;;;:::i;:::-;;;;;;;;3387:4;3380:11;;;;2931:465;;;;;;:::o;1307:190:0:-;1422:13;1393:18;1406:4;1393:12;:18::i;:::-;300:45;328:4;334:10;300:27;:45::i;:::-;1450:42:::1;1478:4;1484:7;1450:27;:42::i;:::-;1443:49;;1307:190:::0;;;;;:::o;785:234::-;873:13;924:10;902:32;;:18;:32;;;894:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;960:54;989:4;995:18;960:28;:54::i;:::-;953:61;;785:234;;;;:::o;873:131:3:-;945:4;964:5;:3;:5::i;:::-;:12;;:18;977:4;964:18;;;;;;;;;;;:26;;:35;991:7;964:35;;;;;;;;;;;;;;;;;;;;;;;;;957:42;;873:131;;;;:::o;1686:120::-;1765:23;1774:4;1780:7;1765:8;:23::i;:::-;1757:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1686:120;;:::o;1406:276::-;1476:4;1492:23;1501:4;1507:7;1492:8;:23::i;:::-;1488:190;;;1563:5;1525;:3;:5::i;:::-;:12;;:18;1538:4;1525:18;;;;;;;;;;;:26;;:35;1552:7;1525:35;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;1608:10;1581:38;;1599:7;1581:38;;1593:4;1581:38;;;;;;;;;;1634:4;1627:11;;;;1488:190;1666:5;1659:12;;1406:276;;;;;:::o;700:169::-;738:30;776:16;138:39;776:42;;851:8;841:18;;833:32;700:169;:::o;4026:229:4:-;4149:22;4223:9;4234:5;;4241:7;4206:43;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4196:54;;;;;;4179:71;;4026:229;;;;;;:::o;3653:369::-;3772:14;3794:21;3818:44;3836:9;3847:5;;3854:7;3818:17;:44::i;:::-;3794:68;;3868:11;3882:5;:3;:5::i;:::-;:25;;:40;3908:13;3882:40;;;;;;;;;;;;3868:54;;3948:1;3941:3;:8;;:34;;;;;3972:3;3953:15;:22;;3941:34;:75;;;;;354:8;3998:3;:18;;;;:::i;:::-;3979:15;:37;;3941:75;3928:89;;3788:234;;3653:369;;;;;;:::o;1000:170::-;1038:25;1071:16;143:38;1071:48;;1152:8;1142:18;;1134:32;1000:170;:::o;4259:123::-;4337:5;:3;:5::i;:::-;:25;;:40;4363:13;4337:40;;;;;;;;;;;4330:47;;;4259:123;:::o;1127:275:3:-;1196:4;1213:23;1222:4;1228:7;1213:8;:23::i;:::-;1208:190;;1284:4;1246:5;:3;:5::i;:::-;:12;;:18;1259:4;1246:18;;;;;;;;;;;:26;;:35;1273:7;1246:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;1328:10;1301:38;;1319:7;1301:38;;1313:4;1301:38;;;;;;;;;;1354:4;1347:11;;;;1208:190;1386:5;1379:12;;1127:275;;;;;:::o;88:117:5:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:96::-;1546:7;1575:24;1593:5;1575:24;:::i;:::-;1564:35;;1509:96;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:474::-;1952:6;1960;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:53;2205:7;2196:6;2185:9;2181:22;2160:53;:::i;:::-;2150:63;;2106:117;2262:2;2288:53;2333:7;2324:6;2313:9;2309:22;2288:53;:::i;:::-;2278:63;;2233:118;1884:474;;;;;:::o;2364:90::-;2398:7;2441:5;2434:13;2427:21;2416:32;;2364:90;;;:::o;2460:109::-;2541:21;2556:5;2541:21;:::i;:::-;2536:3;2529:34;2460:109;;:::o;2575:210::-;2662:4;2700:2;2689:9;2685:18;2677:26;;2713:65;2775:1;2764:9;2760:17;2751:6;2713:65;:::i;:::-;2575:210;;;;:::o;2791:117::-;2900:1;2897;2890:12;2914:117;3023:1;3020;3013:12;3037:469;3142:9;3153;3191:8;3179:10;3176:24;3173:111;;;3203:79;;:::i;:::-;3173:111;3309:6;3299:8;3296:20;3293:107;;;3319:79;;:::i;:::-;3293:107;3450:1;3438:10;3434:18;3426:6;3422:31;3409:44;;3489:10;3479:8;3475:25;3462:38;;3037:469;;;;;;;:::o;3512:96::-;3570:6;3598:3;3588:13;;3512:96;;;;:::o;3706:149::-;3742:7;3782:66;3775:5;3771:78;3760:89;;3706:149;;;:::o;3861:107::-;3905:8;3955:5;3949:4;3945:16;3924:37;;3861:107;;;;:::o;3974:548::-;4064:5;4095:45;4136:3;4129:5;4095:45;:::i;:::-;4165:5;4189:40;4219:8;4206:22;4189:40;:::i;:::-;4180:49;;4253:1;4245:6;4242:13;4239:276;;;4323:168;4407:66;4377:6;4374:1;4370:14;4367:1;4363:22;4323:168;:::i;:::-;4300:5;4279:226;4270:235;;4239:276;4070:452;;3974:548;;;;:::o;4528:169::-;4612:11;4646:6;4641:3;4634:19;4686:4;4681:3;4677:14;4662:29;;4528:169;;;;:::o;4703:158::-;4843:10;4839:1;4831:6;4827:14;4820:34;4703:158;:::o;4867:365::-;5009:3;5030:66;5094:1;5089:3;5030:66;:::i;:::-;5023:73;;5105:93;5194:3;5105:93;:::i;:::-;5223:2;5218:3;5214:12;5207:19;;4867:365;;;:::o;5238:419::-;5404:4;5442:2;5431:9;5427:18;5419:26;;5491:9;5485:4;5481:20;5477:1;5466:9;5462:17;5455:47;5519:131;5645:4;5519:131;:::i;:::-;5511:139;;5238:419;;;:::o;5663:168::-;5746:11;5780:6;5775:3;5768:19;5820:4;5815:3;5811:14;5796:29;;5663:168;;;;:::o;5837:148::-;5935:6;5930:3;5925;5912:30;5976:1;5967:6;5962:3;5958:16;5951:27;5837:148;;;:::o;5991:102::-;6032:6;6083:2;6079:7;6074:2;6067:5;6063:14;6059:28;6049:38;;5991:102;;;:::o;6121:314::-;6217:3;6238:70;6301:6;6296:3;6238:70;:::i;:::-;6231:77;;6318:56;6367:6;6362:3;6355:5;6318:56;:::i;:::-;6399:29;6421:6;6399:29;:::i;:::-;6394:3;6390:39;6383:46;;6121:314;;;;;:::o;6441:77::-;6478:7;6507:5;6496:16;;6441:77;;;:::o;6524:118::-;6611:24;6629:5;6611:24;:::i;:::-;6606:3;6599:37;6524:118;;:::o;6648:439::-;6797:4;6835:2;6824:9;6820:18;6812:26;;6884:9;6878:4;6874:20;6870:1;6859:9;6855:17;6848:47;6912:86;6993:4;6984:6;6976;6912:86;:::i;:::-;6904:94;;7008:72;7076:2;7065:9;7061:18;7052:6;7008:72;:::i;:::-;6648:439;;;;;;:::o;7093:158::-;7233:10;7229:1;7221:6;7217:14;7210:34;7093:158;:::o;7257:365::-;7399:3;7420:66;7484:1;7479:3;7420:66;:::i;:::-;7413:73;;7495:93;7584:3;7495:93;:::i;:::-;7613:2;7608:3;7604:12;7597:19;;7257:365;;;:::o;7628:419::-;7794:4;7832:2;7821:9;7817:18;7809:26;;7881:9;7875:4;7871:20;7867:1;7856:9;7852:17;7845:47;7909:131;8035:4;7909:131;:::i;:::-;7901:139;;7628:419;;;:::o;8053:158::-;8193:10;8189:1;8181:6;8177:14;8170:34;8053:158;:::o;8217:365::-;8359:3;8380:66;8444:1;8439:3;8380:66;:::i;:::-;8373:73;;8455:93;8544:3;8455:93;:::i;:::-;8573:2;8568:3;8564:12;8557:19;;8217:365;;;:::o;8588:419::-;8754:4;8792:2;8781:9;8777:18;8769:26;;8841:9;8835:4;8831:20;8827:1;8816:9;8812:17;8805:47;8869:131;8995:4;8869:131;:::i;:::-;8861:139;;8588:419;;;:::o;9013:78::-;9051:7;9080:5;9069:16;;9013:78;;;:::o;9097:153::-;9200:43;9219:23;9236:5;9219:23;:::i;:::-;9200:43;:::i;:::-;9195:3;9188:56;9097:153;;:::o;9256:147::-;9357:11;9394:3;9379:18;;9256:147;;;;:::o;9431:327::-;9545:3;9566:88;9647:6;9642:3;9566:88;:::i;:::-;9559:95;;9664:56;9713:6;9708:3;9701:5;9664:56;:::i;:::-;9745:6;9740:3;9736:16;9729:23;;9431:327;;;;;:::o;9764:94::-;9797:8;9845:5;9841:2;9837:14;9816:35;;9764:94;;;:::o;9864:::-;9903:7;9932:20;9946:5;9932:20;:::i;:::-;9921:31;;9864:94;;;:::o;9964:100::-;10003:7;10032:26;10052:5;10032:26;:::i;:::-;10021:37;;9964:100;;;:::o;10070:157::-;10175:45;10195:24;10213:5;10195:24;:::i;:::-;10175:45;:::i;:::-;10170:3;10163:58;10070:157;;:::o;10233:568::-;10427:3;10442:73;10511:3;10502:6;10442:73;:::i;:::-;10540:1;10535:3;10531:11;10524:18;;10559:103;10658:3;10649:6;10641;10559:103;:::i;:::-;10552:110;;10672:75;10743:3;10734:6;10672:75;:::i;:::-;10772:2;10767:3;10763:12;10756:19;;10792:3;10785:10;;10233:568;;;;;;;:::o;10807:180::-;10855:77;10852:1;10845:88;10952:4;10949:1;10942:15;10976:4;10973:1;10966:15;10993:191;11033:3;11052:20;11070:1;11052:20;:::i;:::-;11047:25;;11086:20;11104:1;11086:20;:::i;:::-;11081:25;;11129:1;11126;11122:9;11115:16;;11150:3;11147:1;11144:10;11141:36;;;11157:18;;:::i;:::-;11141:36;10993:191;;;;:::o
Swarm Source
ipfs://1b0574a402f172f8754db8da61c794ef58b99cf227800f28dd5ccdb8a5f18f18
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.