ETH Price: $1,971.27 (-0.15%)

Contract

0xe79A30d2a2134fcceCBbfB9A79F39E6AB1637B3f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60806040244410642026-02-12 13:41:5923 days ago1770903719  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AccessControlFacetTimelockable

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, MIT license
// 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;
  }
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

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"}]

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.