ETH Price: $2,863.88 (-2.55%)
 

Overview

Max Total Supply

7,000,000,000 ESX

Holders

23,004 (0.00%)

Market

Price

$0.0029 @ 0.000001 ETH (+2.36%)

Onchain Market Cap

$20,191,920.00

Circulating Supply Market Cap

$3,557,879.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
82,076.86774 ESX

Value
$236.76 ( ~0.0826709777877252 ETH) [0.0012%]
0xf76e742111be7083168c70a9e2dec52d4a9a018b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

RWA protocol & L1 blockchain for real estate. Backed by the co-founder of USDT.

Market

Volume (24H):$4,642,866.00
Market Capitalization:$3,557,879.00
Circulating Supply:1,234,381,743.00 ESX
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
EstateX

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/governance/TimelockController.sol";

contract EstateX is ERC20, Ownable {
    uint256 public deploymentTime;
    uint256 private constant BASE_TOTAL_SUPPLY = 7_000_000_000; // Hardcoded total supply: 7,000,000,000 tokens
    uint256 private ESX_TOTAL_SUPPLY;
    TimelockController public timelock;

    struct Allocation {
        address[] wallets;
        uint256 totalBalance;
    }

    modifier onlyTimelock() {
        require(msg.sender == address(timelock), "Only timelock can execute this function.");
        _;
    }

    /**
     * @notice Constructor
     * @param creator - The wallet that receives the remaining tokens and becomes the owner
     * @param devOps - Allocation for Development & Operations
     * @param team - Allocation for the Team
     * @param strategicReserve - Allocation for Strategic Reserve
     * @param marketing - Allocation for Marketing
     * @param staking - Allocation for Staking
     * @param charity - Allocation for Charity
     * @param timelockAddress - The address of the externally deployed EstateXTimelock contract
     */
    constructor(address creator, Allocation memory devOps, Allocation memory team, Allocation memory strategicReserve, Allocation memory marketing, Allocation memory staking, Allocation memory charity, address timelockAddress) ERC20("EstateX", "ESX") Ownable(creator) {
        require(timelockAddress != address(0), "Timelock address must be non-zero.");
        timelock = TimelockController(payable(timelockAddress));

        // Wallet array and address checks for allocations
        // Wallet arrays cannot be empty and addresses must be non-zero
        // Development and Operations Wallet Checks
        require(devOps.wallets.length > 0, "DevOps wallet array cannot be empty.");
        for(uint256 i = 0; i < devOps.wallets.length; i++) {
            require(devOps.wallets[i] != address(0), "DevOps recipient must be non-zero.");
        }
        // Team Wallet Checks
        require(team.wallets.length > 0, "Team wallet array cannot be empty.");
        for(uint256 i = 0; i < team.wallets.length; i++) {
            require(team.wallets[i] != address(0), "Team recipient must be non-zero.");
        }
        // Strategic Reserve Wallet Checks
        require(strategicReserve.wallets.length > 0, "Strategic Reserve wallet array cannot be empty.");
        for(uint256 i = 0; i < strategicReserve.wallets.length; i++) {
            require(strategicReserve.wallets[i] != address(0), "Strategic Reserve recipient must be non-zero.");
        }
        // Marketing Wallet Checks
        require(marketing.wallets.length > 0, "Marketing wallet array cannot be empty.");
        for(uint256 i = 0; i < marketing.wallets.length; i++) {
            require(marketing.wallets[i] != address(0), "Marketing recipient must be non-zero.");
        }
        // Staking Wallet Checks
        require(staking.wallets.length > 0, "Staking wallet array cannot be empty.");
        for(uint256 i = 0; i < staking.wallets.length; i++) {
            require(staking.wallets[i] != address(0), "Staking recipient must be non-zero.");
        }
        // Charity Wallet Checks
        require(charity.wallets.length > 0, "Charity wallet array cannot be empty.");
        for(uint256 i = 0; i < charity.wallets.length; i++) {
            require(charity.wallets[i] != address(0), "Charity recipient must be non-zero.");
        }

        // Decimalize total supply and allocations (decimals = 9)
        ESX_TOTAL_SUPPLY = BASE_TOTAL_SUPPLY * (10 ** decimals());
        devOps.totalBalance = devOps.totalBalance * (10 ** decimals());
        team.totalBalance = team.totalBalance * (10 ** decimals());
        strategicReserve.totalBalance = strategicReserve.totalBalance * (10 ** decimals());
        marketing.totalBalance = marketing.totalBalance * (10 ** decimals());
        staking.totalBalance = staking.totalBalance * (10 ** decimals());
        charity.totalBalance = charity.totalBalance * (10 ** decimals());

        // Verifying allocation proportionment
        // Fund allocations must be evenly divisible by number of wallets
        require(devOps.totalBalance % devOps.wallets.length == 0, "DevOps total balance must be evenly divisible by number of declared DevOps wallets.");
        require(team.totalBalance % team.wallets.length == 0, "Team total balance must be evenly divisible by number of declared Team wallets.");
        require(strategicReserve.totalBalance % strategicReserve.wallets.length == 0, "Strategic Reserve total balance must be evenly divisible by number of declared Strategic Reserve wallets.");
        require(marketing.totalBalance % marketing.wallets.length == 0, "Marketing total balance must be evenly divisible  by number of declared Marketing wallets.");
        require(staking.totalBalance % staking.wallets.length == 0, "Staking total balance must be evenly divisible by number of declared Staking wallets.");
        require(charity.totalBalance % charity.wallets.length == 0, "Charity total balance must be evenly divisible by number of declared Charity wallets.");

        // Allocation constraints
        require(devOps.totalBalance >= ESX_TOTAL_SUPPLY * 3 / 100 && devOps.totalBalance <= ESX_TOTAL_SUPPLY * 5 / 100, "DevOps must receive between 3% to 5% of total tokens.");
        require(team.totalBalance >= ESX_TOTAL_SUPPLY * 10 / 100 && team.totalBalance <= ESX_TOTAL_SUPPLY * 15 / 100, "Team must receive between 10% to 15% of total tokens.");
        require(strategicReserve.totalBalance >= ESX_TOTAL_SUPPLY * 5 / 100 && strategicReserve.totalBalance <= ESX_TOTAL_SUPPLY * 8 / 100, "Strategic Reserve must receive between 5% to 8% of total tokens.");
        require(marketing.totalBalance >= ESX_TOTAL_SUPPLY * 8 / 100 && marketing.totalBalance <= ESX_TOTAL_SUPPLY * 10 / 100, "Marketing must receive between 8% to 10% of total tokens.");
        require(staking.totalBalance >= ESX_TOTAL_SUPPLY * 20 / 100 && staking.totalBalance <= ESX_TOTAL_SUPPLY * 30 / 100, "Staking must receive between 20% to 30% of total tokens.");
        require(charity.totalBalance >= ESX_TOTAL_SUPPLY * 1 / 100 && charity.totalBalance <= ESX_TOTAL_SUPPLY * 2 / 100, "Charity must receive between 1% to 2% of total tokens.");

        // Allocate remaining tokens to the primary wallet
        uint256 balancePrimary = ESX_TOTAL_SUPPLY - devOps.totalBalance - team.totalBalance - strategicReserve.totalBalance - marketing.totalBalance - staking.totalBalance - charity.totalBalance;

        // Mint tokens to the primary wallet
        _mint(creator, balancePrimary);

        // Mint tokens to allocations
        uint256 perWallet;

        // Evenly distribute tokens to Development and Operations Wallets        
        perWallet = devOps.totalBalance / devOps.wallets.length;
        for(uint256 i = 0; i < devOps.wallets.length; i++) {
            _mint(devOps.wallets[i], perWallet);
        }

        // Evenly distribute tokens to Team Wallets
        perWallet = team.totalBalance / team.wallets.length;
        for(uint256 i = 0; i < team.wallets.length; i++) {
            _mint(team.wallets[i], perWallet);
        }

        // Evenly distribute tokens to Strategic Reserve Wallets
        perWallet = strategicReserve.totalBalance / strategicReserve.wallets.length;
        for(uint256 i = 0; i < strategicReserve.wallets.length; i++) {
            _mint(strategicReserve.wallets[i], perWallet);
        }

        // Evenly distribute tokens to Marketing Wallets
        perWallet = marketing.totalBalance / marketing.wallets.length;
        for(uint256 i = 0; i < marketing.wallets.length; i++) {
            _mint(marketing.wallets[i], perWallet);
        }

        // Evenly distribute tokens to Staking Wallets
        perWallet = staking.totalBalance / staking.wallets.length;
        for(uint256 i = 0; i < staking.wallets.length; i++) {
            _mint(staking.wallets[i], perWallet);
        }

        // Evenly distribute tokens to Charity Wallets
        perWallet = charity.totalBalance / charity.wallets.length;
        for(uint256 i = 0; i < charity.wallets.length; i++) {
            _mint(charity.wallets[i], perWallet);
        }

        // Record deployment time
        deploymentTime = block.timestamp;
    }

    function decimals() public view virtual override returns(uint8) {
        return 9;
    }

    function executeBurn(address account, uint256 amount) external onlyTimelock {
        _burn(account, amount);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;

import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC-165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (governance/TimelockController.sol)

pragma solidity ^0.8.20;

import {AccessControl} from "../access/AccessControl.sol";
import {ERC721Holder} from "../token/ERC721/utils/ERC721Holder.sol";
import {ERC1155Holder} from "../token/ERC1155/utils/ERC1155Holder.sol";
import {Address} from "../utils/Address.sol";

/**
 * @dev Contract module which acts as a timelocked controller. When set as the
 * owner of an `Ownable` smart contract, it enforces a timelock on all
 * `onlyOwner` maintenance operations. This gives time for users of the
 * controlled contract to exit before a potentially dangerous maintenance
 * operation is applied.
 *
 * By default, this contract is self administered, meaning administration tasks
 * have to go through the timelock process. The proposer (resp executor) role
 * is in charge of proposing (resp executing) operations. A common use case is
 * to position this {TimelockController} as the owner of a smart contract, with
 * a multisig or a DAO as the sole proposer.
 */
contract TimelockController is AccessControl, ERC721Holder, ERC1155Holder {
    bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE");
    bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE");
    bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE");
    uint256 internal constant _DONE_TIMESTAMP = uint256(1);

    mapping(bytes32 id => uint256) private _timestamps;
    uint256 private _minDelay;

    enum OperationState {
        Unset,
        Waiting,
        Ready,
        Done
    }

    /**
     * @dev Mismatch between the parameters length for an operation call.
     */
    error TimelockInvalidOperationLength(uint256 targets, uint256 payloads, uint256 values);

    /**
     * @dev The schedule operation doesn't meet the minimum delay.
     */
    error TimelockInsufficientDelay(uint256 delay, uint256 minDelay);

    /**
     * @dev The current state of an operation is not as required.
     * The `expectedStates` is a bitmap with the bits enabled for each OperationState enum position
     * counting from right to left.
     *
     * See {_encodeStateBitmap}.
     */
    error TimelockUnexpectedOperationState(bytes32 operationId, bytes32 expectedStates);

    /**
     * @dev The predecessor to an operation not yet done.
     */
    error TimelockUnexecutedPredecessor(bytes32 predecessorId);

    /**
     * @dev The caller account is not authorized.
     */
    error TimelockUnauthorizedCaller(address caller);

    /**
     * @dev Emitted when a call is scheduled as part of operation `id`.
     */
    event CallScheduled(
        bytes32 indexed id,
        uint256 indexed index,
        address target,
        uint256 value,
        bytes data,
        bytes32 predecessor,
        uint256 delay
    );

    /**
     * @dev Emitted when a call is performed as part of operation `id`.
     */
    event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);

    /**
     * @dev Emitted when new proposal is scheduled with non-zero salt.
     */
    event CallSalt(bytes32 indexed id, bytes32 salt);

    /**
     * @dev Emitted when operation `id` is cancelled.
     */
    event Cancelled(bytes32 indexed id);

    /**
     * @dev Emitted when the minimum delay for future operations is modified.
     */
    event MinDelayChange(uint256 oldDuration, uint256 newDuration);

    /**
     * @dev Initializes the contract with the following parameters:
     *
     * - `minDelay`: initial minimum delay in seconds for operations
     * - `proposers`: accounts to be granted proposer and canceller roles
     * - `executors`: accounts to be granted executor role
     * - `admin`: optional account to be granted admin role; disable with zero address
     *
     * IMPORTANT: The optional admin can aid with initial configuration of roles after deployment
     * without being subject to delay, but this role should be subsequently renounced in favor of
     * administration through timelocked proposals. Previous versions of this contract would assign
     * this admin to the deployer automatically and should be renounced as well.
     */
    constructor(uint256 minDelay, address[] memory proposers, address[] memory executors, address admin) {
        // self administration
        _grantRole(DEFAULT_ADMIN_ROLE, address(this));

        // optional admin
        if (admin != address(0)) {
            _grantRole(DEFAULT_ADMIN_ROLE, admin);
        }

        // register proposers and cancellers
        for (uint256 i = 0; i < proposers.length; ++i) {
            _grantRole(PROPOSER_ROLE, proposers[i]);
            _grantRole(CANCELLER_ROLE, proposers[i]);
        }

        // register executors
        for (uint256 i = 0; i < executors.length; ++i) {
            _grantRole(EXECUTOR_ROLE, executors[i]);
        }

        _minDelay = minDelay;
        emit MinDelayChange(0, minDelay);
    }

    /**
     * @dev Modifier to make a function callable only by a certain role. In
     * addition to checking the sender's role, `address(0)` 's role is also
     * considered. Granting a role to `address(0)` is equivalent to enabling
     * this role for everyone.
     */
    modifier onlyRoleOrOpenRole(bytes32 role) {
        if (!hasRole(role, address(0))) {
            _checkRole(role, _msgSender());
        }
        _;
    }

    /**
     * @dev Contract might receive/hold ETH as part of the maintenance process.
     */
    receive() external payable {}

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(AccessControl, ERC1155Holder) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns whether an id corresponds to a registered operation. This
     * includes both Waiting, Ready, and Done operations.
     */
    function isOperation(bytes32 id) public view returns (bool) {
        return getOperationState(id) != OperationState.Unset;
    }

    /**
     * @dev Returns whether an operation is pending or not. Note that a "pending" operation may also be "ready".
     */
    function isOperationPending(bytes32 id) public view returns (bool) {
        OperationState state = getOperationState(id);
        return state == OperationState.Waiting || state == OperationState.Ready;
    }

    /**
     * @dev Returns whether an operation is ready for execution. Note that a "ready" operation is also "pending".
     */
    function isOperationReady(bytes32 id) public view returns (bool) {
        return getOperationState(id) == OperationState.Ready;
    }

    /**
     * @dev Returns whether an operation is done or not.
     */
    function isOperationDone(bytes32 id) public view returns (bool) {
        return getOperationState(id) == OperationState.Done;
    }

    /**
     * @dev Returns the timestamp at which an operation becomes ready (0 for
     * unset operations, 1 for done operations).
     */
    function getTimestamp(bytes32 id) public view virtual returns (uint256) {
        return _timestamps[id];
    }

    /**
     * @dev Returns operation state.
     */
    function getOperationState(bytes32 id) public view virtual returns (OperationState) {
        uint256 timestamp = getTimestamp(id);
        if (timestamp == 0) {
            return OperationState.Unset;
        } else if (timestamp == _DONE_TIMESTAMP) {
            return OperationState.Done;
        } else if (timestamp > block.timestamp) {
            return OperationState.Waiting;
        } else {
            return OperationState.Ready;
        }
    }

    /**
     * @dev Returns the minimum delay in seconds for an operation to become valid.
     *
     * This value can be changed by executing an operation that calls `updateDelay`.
     */
    function getMinDelay() public view virtual returns (uint256) {
        return _minDelay;
    }

    /**
     * @dev Returns the identifier of an operation containing a single
     * transaction.
     */
    function hashOperation(
        address target,
        uint256 value,
        bytes calldata data,
        bytes32 predecessor,
        bytes32 salt
    ) public pure virtual returns (bytes32) {
        return keccak256(abi.encode(target, value, data, predecessor, salt));
    }

    /**
     * @dev Returns the identifier of an operation containing a batch of
     * transactions.
     */
    function hashOperationBatch(
        address[] calldata targets,
        uint256[] calldata values,
        bytes[] calldata payloads,
        bytes32 predecessor,
        bytes32 salt
    ) public pure virtual returns (bytes32) {
        return keccak256(abi.encode(targets, values, payloads, predecessor, salt));
    }

    /**
     * @dev Schedule an operation containing a single transaction.
     *
     * Emits {CallSalt} if salt is nonzero, and {CallScheduled}.
     *
     * Requirements:
     *
     * - the caller must have the 'proposer' role.
     */
    function schedule(
        address target,
        uint256 value,
        bytes calldata data,
        bytes32 predecessor,
        bytes32 salt,
        uint256 delay
    ) public virtual onlyRole(PROPOSER_ROLE) {
        bytes32 id = hashOperation(target, value, data, predecessor, salt);
        _schedule(id, delay);
        emit CallScheduled(id, 0, target, value, data, predecessor, delay);
        if (salt != bytes32(0)) {
            emit CallSalt(id, salt);
        }
    }

    /**
     * @dev Schedule an operation containing a batch of transactions.
     *
     * Emits {CallSalt} if salt is nonzero, and one {CallScheduled} event per transaction in the batch.
     *
     * Requirements:
     *
     * - the caller must have the 'proposer' role.
     */
    function scheduleBatch(
        address[] calldata targets,
        uint256[] calldata values,
        bytes[] calldata payloads,
        bytes32 predecessor,
        bytes32 salt,
        uint256 delay
    ) public virtual onlyRole(PROPOSER_ROLE) {
        if (targets.length != values.length || targets.length != payloads.length) {
            revert TimelockInvalidOperationLength(targets.length, payloads.length, values.length);
        }

        bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);
        _schedule(id, delay);
        for (uint256 i = 0; i < targets.length; ++i) {
            emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);
        }
        if (salt != bytes32(0)) {
            emit CallSalt(id, salt);
        }
    }

    /**
     * @dev Schedule an operation that is to become valid after a given delay.
     */
    function _schedule(bytes32 id, uint256 delay) private {
        if (isOperation(id)) {
            revert TimelockUnexpectedOperationState(id, _encodeStateBitmap(OperationState.Unset));
        }
        uint256 minDelay = getMinDelay();
        if (delay < minDelay) {
            revert TimelockInsufficientDelay(delay, minDelay);
        }
        _timestamps[id] = block.timestamp + delay;
    }

    /**
     * @dev Cancel an operation.
     *
     * Requirements:
     *
     * - the caller must have the 'canceller' role.
     */
    function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {
        if (!isOperationPending(id)) {
            revert TimelockUnexpectedOperationState(
                id,
                _encodeStateBitmap(OperationState.Waiting) | _encodeStateBitmap(OperationState.Ready)
            );
        }
        delete _timestamps[id];

        emit Cancelled(id);
    }

    /**
     * @dev Execute an (ready) operation containing a single transaction.
     *
     * Emits a {CallExecuted} event.
     *
     * Requirements:
     *
     * - the caller must have the 'executor' role.
     */
    // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,
    // thus any modifications to the operation during reentrancy should be caught.
    // slither-disable-next-line reentrancy-eth
    function execute(
        address target,
        uint256 value,
        bytes calldata payload,
        bytes32 predecessor,
        bytes32 salt
    ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {
        bytes32 id = hashOperation(target, value, payload, predecessor, salt);

        _beforeCall(id, predecessor);
        _execute(target, value, payload);
        emit CallExecuted(id, 0, target, value, payload);
        _afterCall(id);
    }

    /**
     * @dev Execute an (ready) operation containing a batch of transactions.
     *
     * Emits one {CallExecuted} event per transaction in the batch.
     *
     * Requirements:
     *
     * - the caller must have the 'executor' role.
     */
    // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,
    // thus any modifications to the operation during reentrancy should be caught.
    // slither-disable-next-line reentrancy-eth
    function executeBatch(
        address[] calldata targets,
        uint256[] calldata values,
        bytes[] calldata payloads,
        bytes32 predecessor,
        bytes32 salt
    ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {
        if (targets.length != values.length || targets.length != payloads.length) {
            revert TimelockInvalidOperationLength(targets.length, payloads.length, values.length);
        }

        bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);

        _beforeCall(id, predecessor);
        for (uint256 i = 0; i < targets.length; ++i) {
            address target = targets[i];
            uint256 value = values[i];
            bytes calldata payload = payloads[i];
            _execute(target, value, payload);
            emit CallExecuted(id, i, target, value, payload);
        }
        _afterCall(id);
    }

    /**
     * @dev Execute an operation's call.
     */
    function _execute(address target, uint256 value, bytes calldata data) internal virtual {
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        Address.verifyCallResult(success, returndata);
    }

    /**
     * @dev Checks before execution of an operation's calls.
     */
    function _beforeCall(bytes32 id, bytes32 predecessor) private view {
        if (!isOperationReady(id)) {
            revert TimelockUnexpectedOperationState(id, _encodeStateBitmap(OperationState.Ready));
        }
        if (predecessor != bytes32(0) && !isOperationDone(predecessor)) {
            revert TimelockUnexecutedPredecessor(predecessor);
        }
    }

    /**
     * @dev Checks after execution of an operation's calls.
     */
    function _afterCall(bytes32 id) private {
        if (!isOperationReady(id)) {
            revert TimelockUnexpectedOperationState(id, _encodeStateBitmap(OperationState.Ready));
        }
        _timestamps[id] = _DONE_TIMESTAMP;
    }

    /**
     * @dev Changes the minimum timelock duration for future operations.
     *
     * Emits a {MinDelayChange} event.
     *
     * Requirements:
     *
     * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing
     * an operation where the timelock is the target and the data is the ABI-encoded call to this function.
     */
    function updateDelay(uint256 newDelay) external virtual {
        address sender = _msgSender();
        if (sender != address(this)) {
            revert TimelockUnauthorizedCaller(sender);
        }
        emit MinDelayChange(_minDelay, newDelay);
        _minDelay = newDelay;
    }

    /**
     * @dev Encodes a `OperationState` into a `bytes32` representation where each bit enabled corresponds to
     * the underlying position in the `OperationState` enum. For example:
     *
     * 0x000...1000
     *   ^^^^^^----- ...
     *         ^---- Done
     *          ^--- Ready
     *           ^-- Waiting
     *            ^- Unset
     */
    function _encodeStateBitmap(OperationState operationState) internal pure returns (bytes32) {
        return bytes32(1 << uint8(operationState));
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../../utils/introspection/IERC165.sol";

/**
 * @dev Interface that must be implemented by smart contracts in order to receive
 * ERC-1155 token transfers.
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC-1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC-1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.20;

import {IERC165, ERC165} from "../../../utils/introspection/ERC165.sol";
import {IERC1155Receiver} from "../IERC1155Receiver.sol";

/**
 * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC-1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 */
abstract contract ERC1155Holder is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 12 of 18 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.20;

/**
 * @title ERC-721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC-721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be
     * reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 13 of 18 : ERC721Holder.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol)

pragma solidity ^0.8.20;

import {IERC721Receiver} from "../IERC721Receiver.sol";

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or
 * {IERC721-setApprovalForAll}.
 */
abstract contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)

pragma solidity ^0.8.20;

import {Errors} from "./Errors.sol";

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }

        (bool success, bytes memory returndata) = recipient.call{value: amount}("");
        if (!success) {
            _revert(returndata);
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {Errors.FailedCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
     * of an unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {Errors.FailedCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            assembly ("memory-safe") {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert Errors.FailedCall();
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 16 of 18 : Errors.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 *
 * _Available since v5.1._
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"components":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"totalBalance","type":"uint256"}],"internalType":"struct EstateX.Allocation","name":"devOps","type":"tuple"},{"components":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"totalBalance","type":"uint256"}],"internalType":"struct EstateX.Allocation","name":"team","type":"tuple"},{"components":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"totalBalance","type":"uint256"}],"internalType":"struct EstateX.Allocation","name":"strategicReserve","type":"tuple"},{"components":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"totalBalance","type":"uint256"}],"internalType":"struct EstateX.Allocation","name":"marketing","type":"tuple"},{"components":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"totalBalance","type":"uint256"}],"internalType":"struct EstateX.Allocation","name":"staking","type":"tuple"},{"components":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"totalBalance","type":"uint256"}],"internalType":"struct EstateX.Allocation","name":"charity","type":"tuple"},{"internalType":"address","name":"timelockAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deploymentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"executeBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"contract TimelockController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200252d3803806200252d833981016040819052620000349162001716565b876040518060400160405280600781526020016608ae6e8c2e8cab60cb1b8152506040518060400160405280600381526020016208aa6b60eb1b8152508160039081620000829190620018d4565b506004620000918282620018d4565b5050506001600160a01b038116620000c457604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000cf81620013f0565b506001600160a01b038116620001335760405162461bcd60e51b815260206004820152602260248201527f54696d656c6f636b2061646472657373206d757374206265206e6f6e2d7a6572604482015261379760f11b6064820152608401620000bb565b600880546001600160a01b0319166001600160a01b038316179055865151620001ab5760405162461bcd60e51b8152602060048201526024808201527f4465764f70732077616c6c65742061727261792063616e6e6f7420626520656d604482015263383a3c9760e11b6064820152608401620000bb565b60005b8751518110156200025457875180516000919083908110620001d457620001d4620019a0565b60200260200101516001600160a01b0316036200023f5760405162461bcd60e51b815260206004820152602260248201527f4465764f707320726563697069656e74206d757374206265206e6f6e2d7a6572604482015261379760f11b6064820152608401620000bb565b806200024b81620019cc565b915050620001ae565b50855151620002b15760405162461bcd60e51b815260206004820152602260248201527f5465616d2077616c6c65742061727261792063616e6e6f7420626520656d70746044820152613c9760f11b6064820152608401620000bb565b60005b8651518110156200034f57865180516000919083908110620002da57620002da620019a0565b60200260200101516001600160a01b0316036200033a5760405162461bcd60e51b815260206004820181905260248201527f5465616d20726563697069656e74206d757374206265206e6f6e2d7a65726f2e6044820152606401620000bb565b806200034681620019cc565b915050620002b4565b50845151620003b95760405162461bcd60e51b815260206004820152602f60248201527f53747261746567696320526573657276652077616c6c6574206172726179206360448201526e30b73737ba1031329032b6b83a3c9760891b6064820152608401620000bb565b60005b8551518110156200046d57855180516000919083908110620003e257620003e2620019a0565b60200260200101516001600160a01b031603620004585760405162461bcd60e51b815260206004820152602d60248201527f537472617465676963205265736572766520726563697069656e74206d75737460448201526c103132903737b716bd32b9379760991b6064820152608401620000bb565b806200046481620019cc565b915050620003bc565b50835151620004cf5760405162461bcd60e51b815260206004820152602760248201527f4d61726b6574696e672077616c6c65742061727261792063616e6e6f742062656044820152661032b6b83a3c9760c91b6064820152608401620000bb565b60005b8451518110156200057b57845180516000919083908110620004f857620004f8620019a0565b60200260200101516001600160a01b031603620005665760405162461bcd60e51b815260206004820152602560248201527f4d61726b6574696e6720726563697069656e74206d757374206265206e6f6e2d6044820152643d32b9379760d91b6064820152608401620000bb565b806200057281620019cc565b915050620004d2565b50825151620005db5760405162461bcd60e51b815260206004820152602560248201527f5374616b696e672077616c6c65742061727261792063616e6e6f74206265206560448201526436b83a3c9760d91b6064820152608401620000bb565b60005b8351518110156200068557835180516000919083908110620006045762000604620019a0565b60200260200101516001600160a01b031603620006705760405162461bcd60e51b815260206004820152602360248201527f5374616b696e6720726563697069656e74206d757374206265206e6f6e2d7a6560448201526239379760e91b6064820152608401620000bb565b806200067c81620019cc565b915050620005de565b50815151620006e55760405162461bcd60e51b815260206004820152602560248201527f436861726974792077616c6c65742061727261792063616e6e6f74206265206560448201526436b83a3c9760d91b6064820152608401620000bb565b60005b8251518110156200078f578251805160009190839081106200070e576200070e620019a0565b60200260200101516001600160a01b0316036200077a5760405162461bcd60e51b815260206004820152602360248201527f4368617269747920726563697069656e74206d757374206265206e6f6e2d7a6560448201526239379760e91b6064820152608401620000bb565b806200078681620019cc565b915050620006e8565b506200079e6009600a62001ae7565b620007af906401a13b860062001aff565b600755620007c06009600a62001ae7565b8760200151620007d1919062001aff565b6020880152620007e46009600a62001ae7565b8660200151620007f5919062001aff565b6020870152620008086009600a62001ae7565b856020015162000819919062001aff565b60208601526200082c6009600a62001ae7565b84602001516200083d919062001aff565b6020850152620008506009600a62001ae7565b836020015162000861919062001aff565b6020840152620008746009600a62001ae7565b826020015162000885919062001aff565b60208084019190915287515190880151620008a1919062001b2f565b156200093c5760405162461bcd60e51b815260206004820152605360248201527f4465764f707320746f74616c2062616c616e6365206d7573742062652065766560448201527f6e6c7920646976697369626c65206279206e756d626572206f66206465636c6160648201527f726564204465764f70732077616c6c6574732e00000000000000000000000000608482015260a401620000bb565b855151602087015162000950919062001b2f565b15620009dd5760405162461bcd60e51b815260206004820152604f60248201527f5465616d20746f74616c2062616c616e6365206d757374206265206576656e6c60448201527f7920646976697369626c65206279206e756d626572206f66206465636c61726560648201526e32102a32b0b6903bb0b63632ba399760891b608482015260a401620000bb565b8451516020860151620009f1919062001b2f565b1562000a9e5760405162461bcd60e51b815260206004820152606960248201527f537472617465676963205265736572766520746f74616c2062616c616e63652060448201527f6d757374206265206576656e6c7920646976697369626c65206279206e756d6260648201527f6572206f66206465636c61726564205374726174656769632052657365727665608482015268103bb0b63632ba399760b91b60a482015260c401620000bb565b835151602085015162000ab2919062001b2f565b1562000b4d5760405162461bcd60e51b815260206004820152605a60248201527f4d61726b6574696e6720746f74616c2062616c616e6365206d7573742062652060448201527f6576656e6c7920646976697369626c6520206279206e756d626572206f66206460648201527f65636c61726564204d61726b6574696e672077616c6c6574732e000000000000608482015260a401620000bb565b825151602084015162000b61919062001b2f565b1562000beb5760405162461bcd60e51b815260206004820152605560248201527f5374616b696e6720746f74616c2062616c616e6365206d75737420626520657660448201526000805160206200250d83398151915260648201527f61726564205374616b696e672077616c6c6574732e0000000000000000000000608482015260a401620000bb565b815151602083015162000bff919062001b2f565b1562000c895760405162461bcd60e51b815260206004820152605560248201527f4368617269747920746f74616c2062616c616e6365206d75737420626520657660448201526000805160206200250d83398151915260648201527f6172656420436861726974792077616c6c6574732e0000000000000000000000608482015260a401620000bb565b6064600754600362000c9c919062001aff565b62000ca8919062001b46565b87602001511015801562000cde57506064600754600562000cca919062001aff565b62000cd6919062001b46565b876020015111155b62000d525760405162461bcd60e51b815260206004820152603560248201527f4465764f7073206d7573742072656365697665206265747765656e203325207460448201527f6f203525206f6620746f74616c20746f6b656e732e00000000000000000000006064820152608401620000bb565b6064600754600a62000d65919062001aff565b62000d71919062001b46565b86602001511015801562000da757506064600754600f62000d93919062001aff565b62000d9f919062001b46565b866020015111155b62000e1b5760405162461bcd60e51b815260206004820152603560248201527f5465616d206d7573742072656365697665206265747765656e2031302520746f60448201527f20313525206f6620746f74616c20746f6b656e732e00000000000000000000006064820152608401620000bb565b6064600754600562000e2e919062001aff565b62000e3a919062001b46565b85602001511015801562000e7057506064600754600862000e5c919062001aff565b62000e68919062001b46565b856020015111155b62000ee6576040805162461bcd60e51b81526020600482015260248101919091527f5374726174656769632052657365727665206d7573742072656365697665206260448201527f65747765656e20352520746f203825206f6620746f74616c20746f6b656e732e6064820152608401620000bb565b6064600754600862000ef9919062001aff565b62000f05919062001b46565b84602001511015801562000f3b57506064600754600a62000f27919062001aff565b62000f33919062001b46565b846020015111155b62000faf5760405162461bcd60e51b815260206004820152603960248201527f4d61726b6574696e67206d7573742072656365697665206265747765656e203860448201527f2520746f20313025206f6620746f74616c20746f6b656e732e000000000000006064820152608401620000bb565b6064600754601462000fc2919062001aff565b62000fce919062001b46565b8360200151101580156200100457506064600754601e62000ff0919062001aff565b62000ffc919062001b46565b836020015111155b620010785760405162461bcd60e51b815260206004820152603860248201527f5374616b696e67206d7573742072656365697665206265747765656e2032302560448201527f20746f20333025206f6620746f74616c20746f6b656e732e00000000000000006064820152608401620000bb565b606460075460016200108b919062001aff565b62001097919062001b46565b826020015110158015620010cd575060646007546002620010b9919062001aff565b620010c5919062001b46565b826020015111155b620011415760405162461bcd60e51b815260206004820152603660248201527f43686172697479206d7573742072656365697665206265747765656e2031252060448201527f746f203225206f6620746f74616c20746f6b656e732e000000000000000000006064820152608401620000bb565b600082602001518460200151866020015188602001518a602001518c6020015160075462001170919062001b5d565b6200117c919062001b5d565b62001188919062001b5d565b62001194919062001b5d565b620011a0919062001b5d565b620011ac919062001b5d565b9050620011ba898262001442565b8751516020890151600091620011d09162001b46565b905060005b8951518110156200122757620012128a600001518281518110620011fd57620011fd620019a0565b6020026020010151836200144260201b60201c565b806200121e81620019cc565b915050620011d5565b5087515160208901516200123c919062001b46565b905060005b8851518110156200127e576200126989600001518281518110620011fd57620011fd620019a0565b806200127581620019cc565b91505062001241565b50865151602088015162001293919062001b46565b905060005b875151811015620012d557620012c088600001518281518110620011fd57620011fd620019a0565b80620012cc81620019cc565b91505062001298565b508551516020870151620012ea919062001b46565b905060005b8651518110156200132c576200131787600001518281518110620011fd57620011fd620019a0565b806200132381620019cc565b915050620012ef565b50845151602086015162001341919062001b46565b905060005b85515181101562001383576200136e86600001518281518110620011fd57620011fd620019a0565b806200137a81620019cc565b91505062001346565b50835151602085015162001398919062001b46565b905060005b845151811015620013da57620013c585600001518281518110620011fd57620011fd620019a0565b80620013d181620019cc565b9150506200139d565b5050426006555062001b89975050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200146e5760405163ec442f0560e01b815260006004820152602401620000bb565b6200147c6000838362001480565b5050565b6001600160a01b038316620014af578060026000828254620014a3919062001b73565b90915550620015239050565b6001600160a01b03831660009081526020819052604090205481811015620015045760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000bb565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620015415760028054829003905562001560565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620015a691815260200190565b60405180910390a3505050565b80516001600160a01b0381168114620015cb57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200160b576200160b620015d0565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200163c576200163c620015d0565b604052919050565b6000604082840312156200165757600080fd5b62001661620015e6565b82519091506001600160401b03808211156200167c57600080fd5b818401915084601f8301126200169157600080fd5b8151602082821115620016a857620016a8620015d0565b8160051b9250620016bb81840162001611565b8281529284018101928181019088851115620016d657600080fd5b948201945b84861015620016ff57620016ef86620015b3565b82529482019490820190620016db565b808752505080860151818601525050505092915050565b600080600080600080600080610100898b0312156200173457600080fd5b6200173f89620015b3565b60208a01519098506001600160401b03808211156200175d57600080fd5b6200176b8c838d0162001644565b985060408b01519150808211156200178257600080fd5b620017908c838d0162001644565b975060608b0151915080821115620017a757600080fd5b620017b58c838d0162001644565b965060808b0151915080821115620017cc57600080fd5b620017da8c838d0162001644565b955060a08b0151915080821115620017f157600080fd5b620017ff8c838d0162001644565b945060c08b01519150808211156200181657600080fd5b50620018258b828c0162001644565b9250506200183660e08a01620015b3565b90509295985092959890939650565b600181811c908216806200185a57607f821691505b6020821081036200187b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620018cf57600081815260208120601f850160051c81016020861015620018aa5750805b601f850160051c820191505b81811015620018cb57828155600101620018b6565b5050505b505050565b81516001600160401b03811115620018f057620018f0620015d0565b620019088162001901845462001845565b8462001881565b602080601f831160018114620019405760008415620019275750858301515b600019600386901b1c1916600185901b178555620018cb565b600085815260208120601f198616915b82811015620019715788860151825594840194600190910190840162001950565b5085821015620019905787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620019e157620019e1620019b6565b5060010190565b600181815b8085111562001a2957816000190482111562001a0d5762001a0d620019b6565b8085161562001a1b57918102915b93841c9390800290620019ed565b509250929050565b60008262001a425750600162001ae1565b8162001a515750600062001ae1565b816001811462001a6a576002811462001a755762001a95565b600191505062001ae1565b60ff84111562001a895762001a89620019b6565b50506001821b62001ae1565b5060208310610133831016604e8410600b841016171562001aba575081810a62001ae1565b62001ac68383620019e8565b806000190482111562001add5762001add620019b6565b0290505b92915050565b600062001af860ff84168362001a31565b9392505050565b808202811582820484141762001ae15762001ae1620019b6565b634e487b7160e01b600052601260045260246000fd5b60008262001b415762001b4162001b19565b500690565b60008262001b585762001b5862001b19565b500490565b8181038181111562001ae15762001ae1620019b6565b8082018082111562001ae15762001ae1620019b6565b6109748062001b996000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063d33219b411610066578063d33219b4146101f5578063dd62ed3e14610208578063ecda10f514610241578063f2fde38b1461024a57600080fd5b80638da5cb5b146101a257806395d89b41146101c7578063a9059cbb146101cf578063ade43c37146101e257600080fd5b806323b872dd116100d357806323b872dd1461014d578063313ce5671461016057806370a082311461016f578063715018a61461019857600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b61010261025d565b60405161010f91906107be565b60405180910390f35b61012b610126366004610828565b6102ef565b604051901515815260200161010f565b6002545b60405190815260200161010f565b61012b61015b366004610852565b610309565b6040516009815260200161010f565b61013f61017d36600461088e565b6001600160a01b031660009081526020819052604090205490565b6101a061032d565b005b6005546001600160a01b03165b6040516001600160a01b03909116815260200161010f565b610102610341565b61012b6101dd366004610828565b610350565b6101a06101f0366004610828565b61035e565b6008546101af906001600160a01b031681565b61013f6102163660046108b0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61013f60065481565b6101a061025836600461088e565b6103dc565b60606003805461026c906108e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610298906108e3565b80156102e55780601f106102ba576101008083540402835291602001916102e5565b820191906000526020600020905b8154815290600101906020018083116102c857829003601f168201915b5050505050905090565b6000336102fd81858561041a565b60019150505b92915050565b60003361031785828561042c565b6103228585856104ab565b506001949350505050565b61033561050a565b61033f6000610537565b565b60606004805461026c906108e3565b6000336102fd8185856104ab565b6008546001600160a01b031633146103ce5760405162461bcd60e51b815260206004820152602860248201527f4f6e6c792074696d656c6f636b2063616e2065786563757465207468697320666044820152673ab731ba34b7b71760c11b60648201526084015b60405180910390fd5b6103d88282610589565b5050565b6103e461050a565b6001600160a01b03811661040e57604051631e4fbdf760e01b8152600060048201526024016103c5565b61041781610537565b50565b61042783838360016105bf565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198110156104a5578181101561049657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016103c5565b6104a5848484840360006105bf565b50505050565b6001600160a01b0383166104d557604051634b637e8f60e11b8152600060048201526024016103c5565b6001600160a01b0382166104ff5760405163ec442f0560e01b8152600060048201526024016103c5565b610427838383610694565b6005546001600160a01b0316331461033f5760405163118cdaa760e01b81523360048201526024016103c5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166105b357604051634b637e8f60e11b8152600060048201526024016103c5565b6103d882600083610694565b6001600160a01b0384166105e95760405163e602df0560e01b8152600060048201526024016103c5565b6001600160a01b03831661061357604051634a1406b160e11b8152600060048201526024016103c5565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156104a557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161068691815260200190565b60405180910390a350505050565b6001600160a01b0383166106bf5780600260008282546106b4919061091d565b909155506107319050565b6001600160a01b038316600090815260208190526040902054818110156107125760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016103c5565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661074d5760028054829003905561076c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b191815260200190565b60405180910390a3505050565b600060208083528351808285015260005b818110156107eb578581018301518582016040015282016107cf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082357600080fd5b919050565b6000806040838503121561083b57600080fd5b6108448361080c565b946020939093013593505050565b60008060006060848603121561086757600080fd5b6108708461080c565b925061087e6020850161080c565b9150604084013590509250925092565b6000602082840312156108a057600080fd5b6108a98261080c565b9392505050565b600080604083850312156108c357600080fd5b6108cc8361080c565b91506108da6020840161080c565b90509250929050565b600181811c908216806108f757607f821691505b60208210810361091757634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561030357634e487b7160e01b600052601160045260246000fdfea2646970667358221220fb2633857841a85e8f68a53a167c4c9227898af8c86395cc803f771deb5269b764736f6c63430008140033656e6c7920646976697369626c65206279206e756d626572206f66206465636c00000000000000000000000013141d2b1a1ce98b191895279db9b27014a988ff000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000440000000000000000000000000552ce105c3d3442501d4176e17b2533916972d540000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000c845880000000000000000000000000000000000000000000000000000000000000000200000000000000000000000012130a436fc9ad68a927c5e82677939b124b5e5d000000000000000000000000691a7529c67ee735d2688052facd7226d63e4db100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000036fdc240000000000000000000000000000000000000000000000000000000000000000200000000000000000000000042aa21d54cfa4cd909f41316ad37a1822b5656d600000000000000000000000072f25a4d4b51f0a7ae9ff3e044ba2bc092e7b4700000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000001c7aecf10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000826ba16365ba370293ee774921c47d40d04b426600000000000000000000000051a7ed09a4a29e1fa479508b0c469d17fcf2951c000000000000000000000000a50d5780d58c92e2df5dad8a1c503434c6be7f190000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000002528f32600000000000000000000000000000000000000000000000000000000000000020000000000000000000000008ba4a6f0787902ec046f519dcbf471719623d9ee00000000000000000000000018b9c1f2016c6efefea02048ad3de9bc20d845a50000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000005a7ad7800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000212272cc5b7caa678164e7cd5ba9355c30453cb9000000000000000000000000ab33d7705743c5251878950a9791f553f113b61e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000042c1d800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d76c8db3ea33fcb605d5aca4415c21824af33aa600000000000000000000000068e94fca96536ce72c02ae1de65e7e13bdb807f8

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063d33219b411610066578063d33219b4146101f5578063dd62ed3e14610208578063ecda10f514610241578063f2fde38b1461024a57600080fd5b80638da5cb5b146101a257806395d89b41146101c7578063a9059cbb146101cf578063ade43c37146101e257600080fd5b806323b872dd116100d357806323b872dd1461014d578063313ce5671461016057806370a082311461016f578063715018a61461019857600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b61010261025d565b60405161010f91906107be565b60405180910390f35b61012b610126366004610828565b6102ef565b604051901515815260200161010f565b6002545b60405190815260200161010f565b61012b61015b366004610852565b610309565b6040516009815260200161010f565b61013f61017d36600461088e565b6001600160a01b031660009081526020819052604090205490565b6101a061032d565b005b6005546001600160a01b03165b6040516001600160a01b03909116815260200161010f565b610102610341565b61012b6101dd366004610828565b610350565b6101a06101f0366004610828565b61035e565b6008546101af906001600160a01b031681565b61013f6102163660046108b0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61013f60065481565b6101a061025836600461088e565b6103dc565b60606003805461026c906108e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610298906108e3565b80156102e55780601f106102ba576101008083540402835291602001916102e5565b820191906000526020600020905b8154815290600101906020018083116102c857829003601f168201915b5050505050905090565b6000336102fd81858561041a565b60019150505b92915050565b60003361031785828561042c565b6103228585856104ab565b506001949350505050565b61033561050a565b61033f6000610537565b565b60606004805461026c906108e3565b6000336102fd8185856104ab565b6008546001600160a01b031633146103ce5760405162461bcd60e51b815260206004820152602860248201527f4f6e6c792074696d656c6f636b2063616e2065786563757465207468697320666044820152673ab731ba34b7b71760c11b60648201526084015b60405180910390fd5b6103d88282610589565b5050565b6103e461050a565b6001600160a01b03811661040e57604051631e4fbdf760e01b8152600060048201526024016103c5565b61041781610537565b50565b61042783838360016105bf565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198110156104a5578181101561049657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016103c5565b6104a5848484840360006105bf565b50505050565b6001600160a01b0383166104d557604051634b637e8f60e11b8152600060048201526024016103c5565b6001600160a01b0382166104ff5760405163ec442f0560e01b8152600060048201526024016103c5565b610427838383610694565b6005546001600160a01b0316331461033f5760405163118cdaa760e01b81523360048201526024016103c5565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166105b357604051634b637e8f60e11b8152600060048201526024016103c5565b6103d882600083610694565b6001600160a01b0384166105e95760405163e602df0560e01b8152600060048201526024016103c5565b6001600160a01b03831661061357604051634a1406b160e11b8152600060048201526024016103c5565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156104a557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161068691815260200190565b60405180910390a350505050565b6001600160a01b0383166106bf5780600260008282546106b4919061091d565b909155506107319050565b6001600160a01b038316600090815260208190526040902054818110156107125760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016103c5565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661074d5760028054829003905561076c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107b191815260200190565b60405180910390a3505050565b600060208083528351808285015260005b818110156107eb578581018301518582016040015282016107cf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082357600080fd5b919050565b6000806040838503121561083b57600080fd5b6108448361080c565b946020939093013593505050565b60008060006060848603121561086757600080fd5b6108708461080c565b925061087e6020850161080c565b9150604084013590509250925092565b6000602082840312156108a057600080fd5b6108a98261080c565b9392505050565b600080604083850312156108c357600080fd5b6108cc8361080c565b91506108da6020840161080c565b90509250929050565b600181811c908216806108f757607f821691505b60208210810361091757634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561030357634e487b7160e01b600052601160045260246000fdfea2646970667358221220fb2633857841a85e8f68a53a167c4c9227898af8c86395cc803f771deb5269b764736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000013141d2b1a1ce98b191895279db9b27014a988ff000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000440000000000000000000000000552ce105c3d3442501d4176e17b2533916972d540000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000c845880000000000000000000000000000000000000000000000000000000000000000200000000000000000000000012130a436fc9ad68a927c5e82677939b124b5e5d000000000000000000000000691a7529c67ee735d2688052facd7226d63e4db100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000036fdc240000000000000000000000000000000000000000000000000000000000000000200000000000000000000000042aa21d54cfa4cd909f41316ad37a1822b5656d600000000000000000000000072f25a4d4b51f0a7ae9ff3e044ba2bc092e7b4700000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000001c7aecf10000000000000000000000000000000000000000000000000000000000000003000000000000000000000000826ba16365ba370293ee774921c47d40d04b426600000000000000000000000051a7ed09a4a29e1fa479508b0c469d17fcf2951c000000000000000000000000a50d5780d58c92e2df5dad8a1c503434c6be7f190000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000002528f32600000000000000000000000000000000000000000000000000000000000000020000000000000000000000008ba4a6f0787902ec046f519dcbf471719623d9ee00000000000000000000000018b9c1f2016c6efefea02048ad3de9bc20d845a50000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000005a7ad7800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000212272cc5b7caa678164e7cd5ba9355c30453cb9000000000000000000000000ab33d7705743c5251878950a9791f553f113b61e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000042c1d800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d76c8db3ea33fcb605d5aca4415c21824af33aa600000000000000000000000068e94fca96536ce72c02ae1de65e7e13bdb807f8

-----Decoded View---------------
Arg [0] : creator (address): 0x13141D2B1a1Ce98b191895279DB9b27014a988fF
Arg [1] : devOps (tuple):
Arg [1] : wallets (address[]): 0x12130a436fC9Ad68A927c5E82677939b124b5e5D,0x691A7529C67eE735d2688052FaCD7226d63E4Db1
Arg [2] : totalBalance (uint256): 210000000

Arg [2] : team (tuple):
Arg [1] : wallets (address[]): 0x42aA21d54cFa4Cd909f41316ad37a1822b5656d6,0x72f25a4D4b51F0a7aE9Ff3e044Ba2bc092E7B470
Arg [2] : totalBalance (uint256): 922600000

Arg [3] : strategicReserve (tuple):
Arg [1] : wallets (address[]): 0x826ba16365bA370293EE774921C47D40d04b4266,0x51A7Ed09a4A29E1FA479508B0c469d17FCF2951c,0xA50d5780d58C92e2DF5dAd8a1c503434c6Be7F19
Arg [2] : totalBalance (uint256): 477818097

Arg [4] : marketing (tuple):
Arg [1] : wallets (address[]): 0x8ba4a6F0787902ec046f519dcbF471719623D9eE,0x18b9C1f2016C6EfeFEA02048Ad3De9BC20D845A5
Arg [2] : totalBalance (uint256): 623440678

Arg [5] : staking (tuple):
Arg [1] : wallets (address[]): 0x212272cC5b7Caa678164E7cD5bA9355c30453cb9,0xAb33D7705743c5251878950a9791F553f113b61e
Arg [2] : totalBalance (uint256): 1518000000

Arg [6] : charity (tuple):
Arg [1] : wallets (address[]): 0xD76c8db3Ea33fCB605D5acA4415c21824AF33aa6,0x68E94FcA96536CE72c02AE1DE65E7E13BdB807F8
Arg [2] : totalBalance (uint256): 70000000

Arg [7] : timelockAddress (address): 0x552ce105c3d3442501D4176E17B2533916972d54

-----Encoded View---------------
39 Constructor Arguments found :
Arg [0] : 00000000000000000000000013141d2b1a1ce98b191895279db9b27014a988ff
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [5] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000440
Arg [7] : 000000000000000000000000552ce105c3d3442501d4176e17b2533916972d54
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [9] : 000000000000000000000000000000000000000000000000000000000c845880
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 00000000000000000000000012130a436fc9ad68a927c5e82677939b124b5e5d
Arg [12] : 000000000000000000000000691a7529c67ee735d2688052facd7226d63e4db1
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [14] : 0000000000000000000000000000000000000000000000000000000036fdc240
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [16] : 00000000000000000000000042aa21d54cfa4cd909f41316ad37a1822b5656d6
Arg [17] : 00000000000000000000000072f25a4d4b51f0a7ae9ff3e044ba2bc092e7b470
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [19] : 000000000000000000000000000000000000000000000000000000001c7aecf1
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [21] : 000000000000000000000000826ba16365ba370293ee774921c47d40d04b4266
Arg [22] : 00000000000000000000000051a7ed09a4a29e1fa479508b0c469d17fcf2951c
Arg [23] : 000000000000000000000000a50d5780d58c92e2df5dad8a1c503434c6be7f19
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [25] : 000000000000000000000000000000000000000000000000000000002528f326
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [27] : 0000000000000000000000008ba4a6f0787902ec046f519dcbf471719623d9ee
Arg [28] : 00000000000000000000000018b9c1f2016c6efefea02048ad3de9bc20d845a5
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [30] : 000000000000000000000000000000000000000000000000000000005a7ad780
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [32] : 000000000000000000000000212272cc5b7caa678164e7cd5ba9355c30453cb9
Arg [33] : 000000000000000000000000ab33d7705743c5251878950a9791f553f113b61e
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [35] : 00000000000000000000000000000000000000000000000000000000042c1d80
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [37] : 000000000000000000000000d76c8db3ea33fcb605d5aca4415c21824af33aa6
Arg [38] : 00000000000000000000000068e94fca96536ce72c02ae1de65e7e13bdb807f8


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.