Token Hashflow

DEX  DeFi  
 

Overview [ERC-20]

Price
$0.49 @ 0.000297 Eth (-4.42%)
Fully Diluted Market Cap
Max Total Supply:
1,000,000,000 HFT

Holders:
7,896 ( 0.051%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Hashflow is a decentralized exchange designed for interoperability, zero slippage, and MEV-protected trades. It allows users to trade any asset on any chain in seconds simply by connecting to their wallet.

Market

Volume (24H):$70,399,367.00
Market Capitalization:$86,032,242.00
Circulating Supply:175,229,156.00 HFT
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-20
*/

/**
 * SPDX-License-Identifier: UNLICENSED
 */
pragma solidity 0.8.11;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract HFT {
    /// @notice EIP-20 token name for this token
    string public constant name = 'Hashflow';

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = 'HFT';

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 18;

    /// @notice Total number of tokens in circulation
    uint256 public totalSupply = 1_000_000_000e18; // 1 billion HFT

    /// @notice Address which may mint new tokens
    address public minter;

    /// @notice The timestamp after which minting may occur (must be set to 4 years)
    uint256 public mintingAllowedAfter;

    /// @notice Minimum time between mints
    uint32 public constant minimumTimeBetweenMints = 1 days * 365;

    /// @notice Cap on the percentage of totalSupply that can be minted at each mint (set to 5% inflation currently)
    uint8 public mintCap = 5;

    /// @notice Allowance amounts on behalf of others
    mapping(address => mapping(address => uint96)) internal allowances;

    /// @notice Official record of token balances for each account
    mapping(address => uint96) internal balances;

    /// @notice A record of each accounts delegate
    mapping(address => address) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            'EIP712Domain(string name,uint256 chainId,address verifyingContract)'
        );

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256(
            'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'
        );

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// @notice An event that is emitted when the minter address is changed
    event MinterChanged(address minter, address newMinter);

    /// @notice An event that is emitted when the mint percentage is changed
    event MintCapChanged(uint256 newMintCap);

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @notice The standard EIP-20 approval event
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );

    /**
     * @notice Construct a new Hashflow token
     * @param account The initial account to grant all the tokens
     * @param minter_ The account with minting ability
     * @param mintingAllowedAfter_ The timestamp after which minting may occur
     */
    constructor(
        address account,
        address minter_,
        uint256 mintingAllowedAfter_
    ) {
        require(
            mintingAllowedAfter_ >= block.timestamp + 1460 days,
            'HFT::constructor: minting can only begin after 4 years'
        );

        require(
            minter_ != address(0),
            'HFT::constructor: minter_ cannot be zero address'
        );

        require(
            account != address(0),
            'HFT::constructor: account cannot be zero address'
        );

        balances[account] = uint96(totalSupply);
        emit Transfer(address(0), account, totalSupply);
        minter = minter_;
        emit MinterChanged(address(0), minter);
        mintingAllowedAfter = mintingAllowedAfter_;
    }

    /**
     * @notice Change the minter address
     * @param minter_ The address of the new minter
     */
    function setMinter(address minter_) external {
        require(
            minter_ != address(0),
            'HFT::setMinter: minter_ cannot be zero address'
        );
        require(
            msg.sender == minter,
            'HFT::setMinter: only the minter can change the minter address'
        );
        minter = minter_;
        emit MinterChanged(minter, minter_);
    }

    function setMintCap(uint256 mintCap_) external {
        require(
            msg.sender == minter,
            'HFT::setMintCap: only the minter can change the mint cap'
        );
        require(
            mintCap_ <= 100,
            'HFT::setMintCap: mint cap should be between 0 and 100'
        );
        mintCap = uint8(mintCap_);
        emit MintCapChanged(uint256(mintCap));
    }

    /**
     * @notice Mint new tokens
     * @param dst The address of the destination account

     */
    function mint(address dst) external {
        require(msg.sender == minter, 'HFT::mint: only the minter can mint');
        require(
            block.timestamp >= mintingAllowedAfter,
            'HFT::mint: minting not allowed yet or exceeds mint cap'
        );
        require(
            dst != address(0),
            'HFT::mint: cannot transfer to the zero address'
        );

        // record the mint
        mintingAllowedAfter = SafeMath.add(
            block.timestamp,
            minimumTimeBetweenMints
        );

        uint96 amount = safe96(
            SafeMath.div(SafeMath.mul(totalSupply, uint256(mintCap)), 100),
            'HFT::mint: amount exceeds 96 bits'
        );

        totalSupply = safe96(
            SafeMath.add(totalSupply, amount),
            'HFT::mint: totalSupply exceeds 96 bits'
        );

        // transfer the amount to the recipient
        balances[dst] = add96(
            balances[dst],
            amount,
            'HFT::mint: transfer amount overflows'
        );
        emit Transfer(address(0), dst, amount);

        // move delegates
        _moveDelegates(address(0), delegates[dst], amount);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender)
        external
        view
        returns (uint256)
    {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint256 rawAmount)
        external
        returns (bool)
    {
        _approve(msg.sender, spender, rawAmount);
        return true;
    }

    /**
     * @notice Atomically increases the allowance granted to `spender` by the caller.
     * @dev This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function increaseAllowance(address spender, uint256 rawAmount)
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            allowances[msg.sender][spender] + rawAmount
        );
        return true;
    }

    /**
     * @notice Atomically increases the allowance granted to `spender` by the caller.
     * @dev This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function decreaseAllowance(address spender, uint256 rawAmount)
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            allowances[msg.sender][spender] - rawAmount
        );
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(
        address owner,
        address spender,
        uint256 rawAmount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        uint96 amount;
        if (rawAmount == type(uint256).max) {
            amount = type(uint96).max;
        } else {
            amount = safe96(rawAmount, 'HFT::permit: amount exceeds 96 bits');
        }

        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                rawAmount,
                nonces[owner]++,
                deadline
            )
        );
        bytes32 digest = keccak256(
            abi.encodePacked('\x19\x01', domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), 'HFT::permit: invalid signature');
        require(signatory == owner, 'HFT::permit: unauthorized');
        require(block.timestamp <= deadline, 'HFT::permit: signature expired');

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint256) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint256 rawAmount) external returns (bool) {
        uint96 amount = safe96(
            rawAmount,
            'HFT::transfer: amount exceeds 96 bits'
        );
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(
        address src,
        address dst,
        uint256 rawAmount
    ) external returns (bool) {
        address spender = msg.sender;
        uint96 spenderAllowance = allowances[src][spender];
        uint96 amount = safe96(
            rawAmount,
            'HFT::approve: amount exceeds 96 bits'
        );

        if (spender != src && spenderAllowance != type(uint96).max) {
            uint96 newAllowance = sub96(
                spenderAllowance,
                amount,
                'HFT::transferFrom: transfer amount exceeds spender allowance'
            );
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)
        );
        bytes32 digest = keccak256(
            abi.encodePacked('\x19\x01', domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            'HFT::delegateBySig: invalid signature'
        );
        require(
            nonce == nonces[signatory]++,
            'HFT::delegateBySig: invalid nonce'
        );
        require(
            block.timestamp <= expiry,
            'HFT::delegateBySig: signature expired'
        );
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber)
        public
        view
        returns (uint96)
    {
        require(
            blockNumber < block.number,
            'HFT::getPriorVotes: not yet determined'
        );

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _approve(
        address caller,
        address spender,
        uint256 rawAmount
    ) internal {
        uint96 amount;
        if (rawAmount == type(uint256).max) {
            amount = type(uint96).max;
        } else {
            amount = safe96(rawAmount, 'HFT::approve: amount exceeds 96 bits');
        }

        allowances[caller][spender] = amount;

        emit Approval(caller, spender, amount);
    }

    function _transferTokens(
        address src,
        address dst,
        uint96 amount
    ) internal {
        require(
            src != address(0),
            'HFT::_transferTokens: cannot transfer from the zero address'
        );
        require(
            dst != address(0),
            'HFT::_transferTokens: cannot transfer to the zero address'
        );

        balances[src] = sub96(
            balances[src],
            amount,
            'HFT::_transferTokens: transfer amount exceeds balance'
        );
        balances[dst] = add96(
            balances[dst],
            amount,
            'HFT::_transferTokens: transfer amount overflows'
        );
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0
                    ? checkpoints[srcRep][srcRepNum - 1].votes
                    : 0;
                uint96 srcRepNew = sub96(
                    srcRepOld,
                    amount,
                    'HFT::_moveDelegates: vote amount underflows'
                );
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0
                    ? checkpoints[dstRep][dstRepNum - 1].votes
                    : 0;
                uint96 dstRepNew = add96(
                    dstRepOld,
                    amount,
                    'HFT::_moveDelegates: vote amount overflows'
                );
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(
            block.number,
            'HFT::_writeCheckpoint: block number exceeds 32 bits'
        );

        if (
            nCheckpoints > 0 &&
            checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(
                blockNumber,
                newVotes
            );
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint32)
    {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint96)
    {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"minter_","type":"address"},{"internalType":"uint256","name":"mintingAllowedAfter_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMintCap","type":"uint256"}],"name":"MintCapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"newMinter","type":"address"}],"name":"MinterChanged","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"rawAmount","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minimumTimeBetweenMints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingAllowedAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCap_","type":"uint256"}],"name":"setMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526b033b2e3c9fd0803ce80000006000556003805460ff191660051790553480156200002e57600080fd5b5060405162002a1338038062002a138339810160408190526200005191620002b0565b6200006142630784ce00620002f1565b811015620000dc5760405162461bcd60e51b815260206004820152603660248201527f4846543a3a636f6e7374727563746f723a206d696e74696e672063616e206f6e60448201527f6c7920626567696e20616674657220342079656172730000000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166200014d5760405162461bcd60e51b815260206004820152603060248201527f4846543a3a636f6e7374727563746f723a206d696e7465725f2063616e6e6f7460448201526f206265207a65726f206164647265737360801b6064820152608401620000d3565b6001600160a01b038316620001be5760405162461bcd60e51b815260206004820152603060248201527f4846543a3a636f6e7374727563746f723a206163636f756e742063616e6e6f7460448201526f206265207a65726f206164647265737360801b6064820152608401620000d3565b600080546001600160a01b03851680835260056020908152604080852080546001600160601b0319166001600160601b0390951694909417909355835492519283529092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600180546001600160a01b0319166001600160a01b038416908117909155604080516000815260208101929092527f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f6910160405180910390a160025550620003189050565b80516001600160a01b0381168114620002ab57600080fd5b919050565b600080600060608486031215620002c657600080fd5b620002d18462000293565b9250620002e16020850162000293565b9150604084015190509250925092565b600082198211156200031357634e487b7160e01b600052601160045260246000fd5b500190565b6126eb80620003286000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636fcfff4511610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e146104e7578063e7a324dc14610529578063f1127ed814610550578063fca3b5aa146105b857600080fd5b8063a9059cbb1461049b578063b4b5ea57146104ae578063c3cda520146104c1578063d505accf146104d457600080fd5b8063782d6fe1116100de578063782d6fe1146104015780637ecebe001461042c57806395d89b411461044c578063a457c2d71461048857600080fd5b80636fcfff451461039c57806370a08231146103c257806376c71ca1146103f457600080fd5b806330b36cef1161017c578063587cde1e1161014b578063587cde1e1461032d5780635c11d62f146103565780635c19a95c146103765780636a6278421461038957600080fd5b806330b36cef146102e2578063313ce567146102eb57806339509351146103055780634070a0c91461031857600080fd5b806318160ddd116101b857806318160ddd1461026a57806320606b701461028157806323b872dd146102a857806330adf81f146102bb57600080fd5b806306fdde03146101df578063075461721461021c578063095ea7b314610247575b600080fd5b6102066040518060400160405280600881526020016748617368666c6f7760c01b81525081565b60405161021391906120d8565b60405180910390f35b60015461022f906001600160a01b031681565b6040516001600160a01b039091168152602001610213565b61025a610255366004612149565b6105cb565b6040519015158152602001610213565b61027360005481565b604051908152602001610213565b6102737f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61025a6102b6366004612173565b6105e2565b6102737f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61027360025481565b6102f3601281565b60405160ff9091168152602001610213565b61025a610313366004612149565b61072c565b61032b6103263660046121af565b610771565b005b61022f61033b3660046121c8565b6006602052600090815260409020546001600160a01b031681565b6103616301e1338081565b60405163ffffffff9091168152602001610213565b61032b6103843660046121c8565b6108d4565b61032b6103973660046121c8565b6108e1565b6103616103aa3660046121c8565b60086020526000908152604090205463ffffffff1681565b6102736103d03660046121c8565b6001600160a01b03166000908152600560205260409020546001600160601b031690565b6003546102f39060ff1681565b61041461040f366004612149565b610bc9565b6040516001600160601b039091168152602001610213565b61027361043a3660046121c8565b60096020526000908152604090205481565b6102066040518060400160405280600381526020017f484654000000000000000000000000000000000000000000000000000000000081525081565b61025a610496366004612149565b610e69565b61025a6104a9366004612149565b610ea9565b6104146104bc3660046121c8565b610ee5565b61032b6104cf3660046121f4565b610f64565b61032b6104e236600461224c565b6112b4565b6102736104f53660046122b6565b6001600160a01b0391821660009081526004602090815260408083209390941682529190915220546001600160601b031690565b6102737fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b61059461055e3660046122e9565b600760209081526000928352604080842090915290825290205463ffffffff81169064010000000090046001600160601b031682565b6040805163ffffffff90931683526001600160601b03909116602083015201610213565b61032b6105c63660046121c8565b6116bf565b60006105d8338484611828565b5060015b92915050565b6001600160a01b03831660009081526004602090815260408083203380855290835281842054825160608101909352602480845291936001600160601b0390911692859261063a928892919061266e908301396118e7565b9050866001600160a01b0316836001600160a01b03161415801561066757506001600160601b0382811614155b1561071457600061069183836040518060600160405280603c81526020016125d3603c913961191f565b6001600160a01b038981166000818152600460209081526040808320948a168084529482529182902080546bffffffffffffffffffffffff19166001600160601b0387169081179091559151918252939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b61071f878783611969565b5060019695505050505050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916105d891859061076c9086906001600160601b0316612358565b611828565b6001546001600160a01b031633146107f65760405162461bcd60e51b815260206004820152603860248201527f4846543a3a7365744d696e744361703a206f6e6c7920746865206d696e74657260448201527f2063616e206368616e676520746865206d696e7420636170000000000000000060648201526084015b60405180910390fd5b606481111561086d5760405162461bcd60e51b815260206004820152603560248201527f4846543a3a7365744d696e744361703a206d696e74206361702073686f756c6460448201527f206265206265747765656e203020616e6420313030000000000000000000000060648201526084016107ed565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff83169081179091556040519081527f1b3897f919a5b5973b0bc01ddfa5fd686de127a16ad08e0b8618dc493aad5462906020015b60405180910390a150565b6108de3382611bc4565b50565b6001546001600160a01b031633146109615760405162461bcd60e51b815260206004820152602360248201527f4846543a3a6d696e743a206f6e6c7920746865206d696e7465722063616e206d60448201527f696e74000000000000000000000000000000000000000000000000000000000060648201526084016107ed565b6002544210156109d95760405162461bcd60e51b815260206004820152603660248201527f4846543a3a6d696e743a206d696e74696e67206e6f7420616c6c6f776564207960448201527f6574206f722065786365656473206d696e74206361700000000000000000000060648201526084016107ed565b6001600160a01b038116610a555760405162461bcd60e51b815260206004820152602e60248201527f4846543a3a6d696e743a2063616e6e6f74207472616e7366657220746f20746860448201527f65207a65726f206164647265737300000000000000000000000000000000000060648201526084016107ed565b610a63426301e13380611c66565b60025560008054600354610aa791610a8991610a82919060ff16611c72565b6064611c7e565b604051806060016040528060218152602001612536602191396118e7565b9050610adf610ac1600054836001600160601b0316611c66565b604051806060016040528060268152602001612557602691396118e7565b6001600160601b0390811660009081556001600160a01b038416815260056020908152604091829020548251606081019093526024808452610b31949190911692859290919061269290830139611c8a565b6001600160a01b038316600081815260056020908152604080832080546bffffffffffffffffffffffff19166001600160601b03968716179055519385168452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36001600160a01b03808316600090815260066020526040812054610bc5921683611cd7565b5050565b6000438210610c405760405162461bcd60e51b815260206004820152602660248201527f4846543a3a6765745072696f72566f7465733a206e6f7420796574206465746560448201527f726d696e6564000000000000000000000000000000000000000000000000000060648201526084016107ed565b6001600160a01b03831660009081526008602052604090205463ffffffff1680610c6e5760009150506105dc565b6001600160a01b03841660009081526007602052604081208491610c93600185612370565b63ffffffff90811682526020820192909252604001600020541611610d07576001600160a01b038416600090815260076020526040812090610cd6600184612370565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b031691506105dc9050565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff16831015610d425760009150506105dc565b600080610d50600184612370565b90505b8163ffffffff168163ffffffff161115610e235760006002610d758484612370565b610d7f91906123c4565b610d899083612370565b6001600160a01b038816600090815260076020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046001600160601b031691810191909152919250871415610df7576020015194506105dc9350505050565b805163ffffffff16871115610e0e57819350610e1c565b610e19600183612370565b92505b5050610d53565b506001600160a01b038516600090815260076020908152604080832063ffffffff909416835292905220546001600160601b036401000000009091041691505092915050565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916105d891859061076c9086906001600160601b03166123e7565b600080610ece836040518060600160405280602581526020016124b7602591396118e7565b9050610edb338583611969565b5060019392505050565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610f10576000610f5d565b6001600160a01b038316600090815260076020526040812090610f34600184612370565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b9392505050565b604080518082018252600881526748617368666c6f7760c01b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f70e176c38526689559300fe21b44602da514e4f56672b3a42c83485a8ef82ed181840152466060820152306080808301919091528351808303909101815260a0820184528051908301207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08301526001600160a01b038a1660e08301526101008201899052610120808301899052845180840390910181526101408301909452835193909201929092207f19010000000000000000000000000000000000000000000000000000000000006101608401526101628301829052610182830181905290916000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611102573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661118b5760405162461bcd60e51b815260206004820152602560248201527f4846543a3a64656c656761746542795369673a20696e76616c6964207369676e60448201527f617475726500000000000000000000000000000000000000000000000000000060648201526084016107ed565b6001600160a01b03811660009081526009602052604081208054916111af836123fe565b9190505589146112275760405162461bcd60e51b815260206004820152602160248201527f4846543a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107ed565b8742111561129d5760405162461bcd60e51b815260206004820152602560248201527f4846543a3a64656c656761746542795369673a207369676e617475726520657860448201527f706972656400000000000000000000000000000000000000000000000000000060648201526084016107ed565b6112a7818b611bc4565b505050505b505050505050565b60006000198614156112ce57506001600160601b036112f3565b6112f0866040518060600160405280602381526020016125b0602391396118e7565b90505b604080518082018252600881526748617368666c6f7760c01b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f70e176c38526689559300fe21b44602da514e4f56672b3a42c83485a8ef82ed181840152466060820152306080808301919091528351808303909101815260a090910183528051908201206001600160a01b038b166000908152600990925291812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c9190866113d1836123fe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012090506000828260405160200161146b9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8b169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa1580156114d6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115395760405162461bcd60e51b815260206004820152601e60248201527f4846543a3a7065726d69743a20696e76616c6964207369676e6174757265000060448201526064016107ed565b8b6001600160a01b0316816001600160a01b03161461159a5760405162461bcd60e51b815260206004820152601960248201527f4846543a3a7065726d69743a20756e617574686f72697a65640000000000000060448201526064016107ed565b884211156115ea5760405162461bcd60e51b815260206004820152601e60248201527f4846543a3a7065726d69743a207369676e61747572652065787069726564000060448201526064016107ed565b84600460008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160601b0302191690836001600160601b031602179055508a6001600160a01b03168c6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516116a991906001600160601b0391909116815260200190565b60405180910390a3505050505050505050505050565b6001600160a01b03811661173b5760405162461bcd60e51b815260206004820152602e60248201527f4846543a3a7365744d696e7465723a206d696e7465725f2063616e6e6f74206260448201527f65207a65726f206164647265737300000000000000000000000000000000000060648201526084016107ed565b6001546001600160a01b031633146117bb5760405162461bcd60e51b815260206004820152603d60248201527f4846543a3a7365744d696e7465723a206f6e6c7920746865206d696e7465722060448201527f63616e206368616e676520746865206d696e746572206164647265737300000060648201526084016107ed565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040805182815260208101929092527f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f691016108c9565b600060001982141561184257506001600160601b03611867565b6118648260405180606001604052806024815260200161266e602491396118e7565b90505b6001600160a01b0384811660008181526004602090815260408083209488168084529482529182902080546bffffffffffffffffffffffff19166001600160601b03871690811790915591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050565b6000816c0100000000000000000000000084106119175760405162461bcd60e51b81526004016107ed91906120d8565b509192915050565b6000836001600160601b0316836001600160601b0316111582906119565760405162461bcd60e51b81526004016107ed91906120d8565b506119618385612419565b949350505050565b6001600160a01b0383166119e55760405162461bcd60e51b815260206004820152603b60248201527f4846543a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726160448201527f6e736665722066726f6d20746865207a65726f2061646472657373000000000060648201526084016107ed565b6001600160a01b038216611a615760405162461bcd60e51b815260206004820152603960248201527f4846543a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726160448201527f6e7366657220746f20746865207a65726f20616464726573730000000000000060648201526084016107ed565b6001600160a01b038316600090815260056020908152604091829020548251606081019093526035808452611aac936001600160601b03909216928592919061260f9083013961191f565b6001600160a01b03848116600090815260056020908152604080832080546bffffffffffffffffffffffff19166001600160601b0396871617905592861682529082902054825160608101909352602f808452611b19949190911692859290919061250790830139611c8a565b6001600160a01b0383811660008181526005602090815260409182902080546bffffffffffffffffffffffff19166001600160601b03968716179055905193851684529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36001600160a01b03808416600090815260066020526040808220548584168352912054611bbf92918216911683611cd7565b505050565b6001600160a01b03808316600081815260066020818152604080842080546005845282862054949093528787167fffffffffffffffffffffffff000000000000000000000000000000000000000084168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611c60828483611cd7565b50505050565b6000610f5d8284612358565b6000610f5d8284612439565b6000610f5d8284612458565b600080611c97848661246c565b9050846001600160601b0316816001600160601b031610158390611cce5760405162461bcd60e51b81526004016107ed91906120d8565b50949350505050565b816001600160a01b0316836001600160a01b031614158015611d0257506000816001600160601b0316115b15611bbf576001600160a01b03831615611dc8576001600160a01b03831660009081526008602052604081205463ffffffff169081611d42576000611d8f565b6001600160a01b038516600090815260076020526040812090611d66600185612370565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b90506000611db682856040518060600160405280602b81526020016124dc602b913961191f565b9050611dc486848484611e81565b5050505b6001600160a01b03821615611bbf576001600160a01b03821660009081526008602052604081205463ffffffff169081611e03576000611e50565b6001600160a01b038416600090815260076020526040812090611e27600185612370565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b90506000611e7782856040518060600160405280602a8152602001612644602a9139611c8a565b90506112ac858484845b6000611ea54360405180606001604052806033815260200161257d603391396120b4565b905060008463ffffffff16118015611eff57506001600160a01b038516600090815260076020526040812063ffffffff831691611ee3600188612370565b63ffffffff908116825260208201929092526040016000205416145b15611f83576001600160a01b03851660009081526007602052604081208391611f29600188612370565b63ffffffff168152602081019190915260400160002080546001600160601b0392909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff90921691909117905561205f565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000908152600782528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909416911617919091179055612013846001612497565b6001600160a01b038616600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516001600160601b038086168252841660208201526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008164010000000084106119175760405162461bcd60e51b81526004016107ed91905b600060208083528351808285015260005b81811015612105578581018301518582016040015282016120e9565b81811115612117576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461214457600080fd5b919050565b6000806040838503121561215c57600080fd5b6121658361212d565b946020939093013593505050565b60008060006060848603121561218857600080fd5b6121918461212d565b925061219f6020850161212d565b9150604084013590509250925092565b6000602082840312156121c157600080fd5b5035919050565b6000602082840312156121da57600080fd5b610f5d8261212d565b803560ff8116811461214457600080fd5b60008060008060008060c0878903121561220d57600080fd5b6122168761212d565b95506020870135945060408701359350612232606088016121e3565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561226757600080fd5b6122708861212d565b965061227e6020890161212d565b9550604088013594506060880135935061229a608089016121e3565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156122c957600080fd5b6122d28361212d565b91506122e06020840161212d565b90509250929050565b600080604083850312156122fc57600080fd5b6123058361212d565b9150602083013563ffffffff8116811461231e57600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561236b5761236b612329565b500190565b600063ffffffff8381169083168181101561238d5761238d612329565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff808416806123db576123db612395565b92169190910492915050565b6000828210156123f9576123f9612329565b500390565b600060001982141561241257612412612329565b5060010190565b60006001600160601b038381169083168181101561238d5761238d612329565b600081600019048311821515161561245357612453612329565b500290565b60008261246757612467612395565b500490565b60006001600160601b0380831681851680830382111561248e5761248e612329565b01949350505050565b600063ffffffff80831681851680830382111561248e5761248e61232956fe4846543a3a7472616e736665723a20616d6f756e74206578636565647320393620626974734846543a3a5f6d6f766544656c6567617465733a20766f746520616d6f756e7420756e646572666c6f77734846543a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f77734846543a3a6d696e743a20616d6f756e74206578636565647320393620626974734846543a3a6d696e743a20746f74616c537570706c79206578636565647320393620626974734846543a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974734846543a3a7065726d69743a20616d6f756e74206578636565647320393620626974734846543a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e63654846543a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e63654846543a3a5f6d6f766544656c6567617465733a20766f746520616d6f756e74206f766572666c6f77734846543a3a617070726f76653a20616d6f756e74206578636565647320393620626974734846543a3a6d696e743a207472616e7366657220616d6f756e74206f766572666c6f7773a264697066735822122039840fd33b6c0f40588ce6f70f58be5ce1cf8c8fa79a676880dd051e5e73bb1664736f6c634300080b0033000000000000000000000000ff830ce17d39bbd6a4fef9683308d793df8e34fc000000000000000000000000ff830ce17d39bbd6a4fef9683308d793df8e34fc0000000000000000000000000000000000000000000000000000000069dafd37

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

000000000000000000000000ff830ce17d39bbd6a4fef9683308d793df8e34fc000000000000000000000000ff830ce17d39bbd6a4fef9683308d793df8e34fc0000000000000000000000000000000000000000000000000000000069dafd37

-----Decoded View---------------
Arg [0] : account (address): 0xff830ce17D39BbD6a4fef9683308D793dF8E34fC
Arg [1] : minter_ (address): 0xff830ce17D39BbD6a4fef9683308D793dF8E34fC
Arg [2] : mintingAllowedAfter_ (uint256): 1775959351

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff830ce17d39bbd6a4fef9683308d793df8e34fc
Arg [1] : 000000000000000000000000ff830ce17d39bbd6a4fef9683308d793df8e34fc
Arg [2] : 0000000000000000000000000000000000000000000000000000000069dafd37


Deployed ByteCode Sourcemap

6593:22098:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6663:40;;;;;;;;;;;;;;;-1:-1:-1;;;6663:40:0;;;;;;;;;;;;:::i;:::-;;;;;;;;7085:21;;;;;-1:-1:-1;;;;;7085:21:0;;;;;;-1:-1:-1;;;;;839:55:1;;;821:74;;809:2;794:18;7085:21:0;675:226:1;14415:181:0;;;;;;:::i;:::-;;:::i;:::-;;;1531:14:1;;1524:22;1506:41;;1494:2;1479:18;14415:181:0;1366:187:1;6963:45:0;;;;;;;;;1704:25:1;;;1692:2;1677:18;6963:45:0;1558:177:1;8358:155:0;;8409:104;8358:155;;19158:816;;;;;;:::i;:::-;;:::i;8823:170::-;;8874:119;8823:170;;7201:34;;;;;;6864:35;;6897:2;6864:35;;;;;2427:4:1;2415:17;;;2397:36;;2385:2;2370:18;6864:35:0;2255:184:1;15062:275:0;;;;;;:::i;:::-;;:::i;11730:405::-;;;;;;:::i;:::-;;:::i;:::-;;7812:44;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;7812:44:0;;;7288:61;;7337:12;7288:61;;;;;2994:10:1;2982:23;;;2964:42;;2952:2;2937:18;7288:61:0;2820:192:1;20122:102:0;;;;;;:::i;:::-;;:::i;12253:1209::-;;;;;;:::i;:::-;;:::i;8237:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18196:111;;;;;;:::i;:::-;-1:-1:-1;;;;;18282:17:0;18255:7;18282:17;;;:8;:17;;;;;;-1:-1:-1;;;;;18282:17:0;;18196:111;7476:24;;;;;;;;;22656:1289;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3179:39:1;;;3161:58;;3149:2;3134:18;22656:1289:0;3017:208:1;9074:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;6764:37;;;;;;;;;;;;;;;;;;;;;15803:275;;;;;;:::i;:::-;;:::i;18571:277::-;;;;;;:::i;:::-;;:::i;21990:235::-;;;;;;:::i;:::-;;:::i;20658:1131::-;;;;;;:::i;:::-;;:::i;16568:1425::-;;;;;;:::i;:::-;;:::i;13766:171::-;;;;;;:::i;:::-;-1:-1:-1;;;;;13901:19:0;;;13869:7;13901:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;-1:-1:-1;;;;;13901:28:0;;13766:171;8607:126;;8662:71;8607:126;;8100:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8100:68:0;;;;;;;5358:10:1;5346:23;;;5328:42;;-1:-1:-1;;;;;5406:39:1;;;5401:2;5386:18;;5379:67;5301:18;8100:68:0;5158:294:1;11326:396:0;;;;;;:::i;:::-;;:::i;14415:181::-;14504:4;14526:40;14535:10;14547:7;14556:9;14526:8;:40::i;:::-;-1:-1:-1;14584:4:0;14415:181;;;;;:::o;19158:816::-;-1:-1:-1;;;;;19359:15:0;;19277:4;19359:15;;;:10;:15;;;;;;;;19312:10;19359:24;;;;;;;;;;19410:94;;;;;;;;;;;;19312:10;;-1:-1:-1;;;;;19359:24:0;;;;19277:4;;19410:94;;19431:9;;19410:94;;;;;;;:6;:94::i;:::-;19394:110;;19532:3;-1:-1:-1;;;;;19521:14:0;:7;-1:-1:-1;;;;;19521:14:0;;;:54;;;;-1:-1:-1;;;;;;19539:36:0;;;;;19521:54;19517:382;;;19592:19;19614:161;19638:16;19673:6;19614:161;;;;;;;;;;;;;;;;;:5;:161::i;:::-;-1:-1:-1;;;;;19790:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;:39;;-1:-1:-1;;19790:39:0;-1:-1:-1;;;;;19790:39:0;;;;;;;;19851:36;;3161:58:1;;;19790:39:0;;-1:-1:-1;19790:24:0;;:15;;19851:36;;3134:18:1;19851:36:0;;;;;;;19577:322;19517:382;19911:33;19927:3;19932;19937:6;19911:15;:33::i;:::-;-1:-1:-1;19962:4:0;;19158:816;-1:-1:-1;;;;;;19158:816:0:o;15062:275::-;15206:10;15161:4;15253:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15253:31:0;;;;;;;;;;15161:4;;15183:124;;15231:7;;15253:43;;15287:9;;-1:-1:-1;;;;;15253:31:0;:43;:::i;:::-;15183:8;:124::i;11730:405::-;11824:6;;-1:-1:-1;;;;;11824:6:0;11810:10;:20;11788:126;;;;-1:-1:-1;;;11788:126:0;;6195:2:1;11788:126:0;;;6177:21:1;6234:2;6214:18;;;6207:30;6273:34;6253:18;;;6246:62;6344:26;6324:18;;;6317:54;6388:19;;11788:126:0;;;;;;;;;11959:3;11947:8;:15;;11925:118;;;;-1:-1:-1;;;11925:118:0;;6620:2:1;11925:118:0;;;6602:21:1;6659:2;6639:18;;;6632:30;6698:34;6678:18;;;6671:62;6769:23;6749:18;;;6742:51;6810:19;;11925:118:0;6418:417:1;11925:118:0;12054:7;:25;;;;;;;;;;;;;12095:32;;1704:25:1;;;12095:32:0;;1692:2:1;1677:18;12095:32:0;;;;;;;;11730:405;:::o;20122:102::-;20184:32;20194:10;20206:9;20184;:32::i;:::-;20122:102;:::o;12253:1209::-;12322:6;;-1:-1:-1;;;;;12322:6:0;12308:10;:20;12300:68;;;;-1:-1:-1;;;12300:68:0;;7042:2:1;12300:68:0;;;7024:21:1;7081:2;7061:18;;;7054:30;7120:34;7100:18;;;7093:62;7191:5;7171:18;;;7164:33;7214:19;;12300:68:0;6840:399:1;12300:68:0;12420:19;;12401:15;:38;;12379:142;;;;-1:-1:-1;;;12379:142:0;;7446:2:1;12379:142:0;;;7428:21:1;7485:2;7465:18;;;7458:30;7524:34;7504:18;;;7497:62;7595:24;7575:18;;;7568:52;7637:19;;12379:142:0;7244:418:1;12379:142:0;-1:-1:-1;;;;;12554:17:0;;12532:113;;;;-1:-1:-1;;;12532:113:0;;7869:2:1;12532:113:0;;;7851:21:1;7908:2;7888:18;;;7881:30;7947:34;7927:18;;;7920:62;8018:16;7998:18;;;7991:44;8052:19;;12532:113:0;7667:410:1;12532:113:0;12708:91;12735:15;7337:12;12708;:91::i;:::-;12686:19;:113;12812:13;12875:11;;12896:7;;12828:144;;12849:62;;12862:43;;12875:11;12896:7;;12862:12;:43::i;:::-;12907:3;12849:12;:62::i;:::-;12828:144;;;;;;;;;;;;;;;;;:6;:144::i;:::-;12812:160;;12999:120;13020:33;13033:11;;13046:6;-1:-1:-1;;;;;13020:33:0;:12;:33::i;:::-;12999:120;;;;;;;;;;;;;;;;;:6;:120::i;:::-;-1:-1:-1;;;;;12985:134:0;;;:11;:134;;;-1:-1:-1;;;;;13217:13:0;;;;:8;:13;;;;;;;;;;13197:118;;;;;;;;;;;;;;13217:13;;;;;13245:6;;13197:118;;;;;;;;:5;:118::i;:::-;-1:-1:-1;;;;;13181:13:0;;;;;;:8;:13;;;;;;;;:134;;-1:-1:-1;;13181:134:0;-1:-1:-1;;;;;13181:134:0;;;;;;13331:33;3179:39:1;;;3161:58;;13181:13:0;;;;13331:33;;3134:18:1;13331:33:0;;;;;;;-1:-1:-1;;;;;13431:14:0;;;13427:1;13431:14;;;:9;:14;;;;;;13404:50;;13431:14;13447:6;13404:14;:50::i;:::-;12289:1173;12253:1209;:::o;22656:1289::-;22765:6;22825:12;22811:11;:26;22789:114;;;;-1:-1:-1;;;22789:114:0;;8284:2:1;22789:114:0;;;8266:21:1;8323:2;8303:18;;;8296:30;8362:34;8342:18;;;8335:62;8433:8;8413:18;;;8406:36;8459:19;;22789:114:0;8082:402:1;22789:114:0;-1:-1:-1;;;;;22938:23:0;;22916:19;22938:23;;;:14;:23;;;;;;;;22976:17;22972:58;;23017:1;23010:8;;;;;22972:58;-1:-1:-1;;;;;23090:20:0;;;;;;:11;:20;;;;;23142:11;;23111:16;23126:1;23111:12;:16;:::i;:::-;23090:38;;;;;;;;;;;;;;;-1:-1:-1;23090:38:0;:48;;:63;23086:147;;-1:-1:-1;;;;;23177:20:0;;;;;;:11;:20;;;;;;23198:16;23213:1;23198:12;:16;:::i;:::-;23177:38;;;;;;;;;;;;;-1:-1:-1;23177:38:0;:44;;;;-1:-1:-1;;;;;23177:44:0;;-1:-1:-1;23170:51:0;;-1:-1:-1;23170:51:0;23086:147;-1:-1:-1;;;;;23294:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;23290:88:0;;;23365:1;23358:8;;;;;23290:88;23390:12;;23432:16;23447:1;23432:12;:16;:::i;:::-;23417:31;;23459:428;23474:5;23466:13;;:5;:13;;;23459:428;;;23496:13;23538:1;23521:13;23529:5;23521;:13;:::i;:::-;23520:19;;;;:::i;:::-;23512:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;23604:20:0;;23581;23604;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;23581:51;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23581:51:0;;;;;;;;23604:28;;-1:-1:-1;23651:27:0;;23647:229;;;23706:8;;;;-1:-1:-1;23699:15:0;;-1:-1:-1;;;;23699:15:0;23647:229;23740:12;;:26;;;-1:-1:-1;23736:140:0;;;23795:6;23787:14;;23736:140;;;23850:10;23859:1;23850:6;:10;:::i;:::-;23842:18;;23736:140;23481:406;;23459:428;;;-1:-1:-1;;;;;;23904:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;-1:-1:-1;;;;;23904:33:0;;;;;;-1:-1:-1;;22656:1289:0;;;;:::o;15803:275::-;15947:10;15902:4;15994:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15994:31:0;;;;;;;;;;15902:4;;15924:124;;15972:7;;15994:43;;16028:9;;-1:-1:-1;;;;;15994:31:0;:43;:::i;18571:277::-;18639:4;18656:13;18672:95;18693:9;18672:95;;;;;;;;;;;;;;;;;:6;:95::i;:::-;18656:111;;18778:40;18794:10;18806:3;18811:6;18778:15;:40::i;:::-;-1:-1:-1;18836:4:0;;18571:277;-1:-1:-1;;;18571:277:0:o;21990:235::-;-1:-1:-1;;;;;22096:23:0;;22055:6;22096:23;;;:14;:23;;;;;;;;22150:16;:67;;22216:1;22150:67;;;-1:-1:-1;;;;;22169:20:0;;;;;;:11;:20;;;;;;22190:16;22205:1;22190:12;:16;:::i;:::-;22169:38;;;;;;;;;;;;;-1:-1:-1;22169:38:0;:44;;;;-1:-1:-1;;;;;22169:44:0;22150:67;22130:87;21990:235;-1:-1:-1;;;21990:235:0:o;20658:1131::-;20970:4;;;;;;;;;;;-1:-1:-1;;;20970:4:0;;;;;20891:163;;8409:104;20891:163;;;9461:25:1;20954:22:0;9502:18:1;;;9495:34;28636:9:0;9545:18:1;;;9538:34;21034:4:0;9588:18:1;;;;9581:83;;;;20891:163:0;;;;;;;;;;9433:19:1;;;20891:163:0;;20867:198;;;;;;8662:71;21121:57;;;9906:25:1;-1:-1:-1;;;;;9967:55:1;;9947:18;;;9940:83;10039:18;;;10032:34;;;10082:18;;;;10075:34;;;21121:57:0;;;;;;;;;;9878:19:1;;;21121:57:0;;;21097:92;;;;;;;;;;10390:66:1;21241:57:0;;;10378:79:1;10473:11;;;10466:27;;;10509:12;;;10502:28;;;20867:198:0;;-1:-1:-1;;10546:12:1;;21241:57:0;;;-1:-1:-1;;21241:57:0;;;;;;;;;21217:92;;21241:57;21217:92;;;;21320:17;21340:26;;;;;;;;;10796:25:1;;;10869:4;10857:17;;10837:18;;;10830:45;;;;10891:18;;;10884:34;;;10934:18;;;10927:34;;;21217:92:0;;-1:-1:-1;21320:17:0;21340:26;;10768:19:1;;21340:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21340:26:0;;-1:-1:-1;;21340:26:0;;;-1:-1:-1;;;;;;;21399:23:0;;21377:110;;;;-1:-1:-1;;;21377:110:0;;11174:2:1;21377:110:0;;;11156:21:1;11213:2;11193:18;;;11186:30;11252:34;11232:18;;;11225:62;11323:7;11303:18;;;11296:35;11348:19;;21377:110:0;10972:401:1;21377:110:0;-1:-1:-1;;;;;21529:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;21520:5;:28;21498:111;;;;-1:-1:-1;;;21498:111:0;;11780:2:1;21498:111:0;;;11762:21:1;11819:2;11799:18;;;11792:30;11858:34;11838:18;;;11831:62;11929:3;11909:18;;;11902:31;11950:19;;21498:111:0;11578:397:1;21498:111:0;21661:6;21642:15;:25;;21620:112;;;;-1:-1:-1;;;21620:112:0;;12182:2:1;21620:112:0;;;12164:21:1;12221:2;12201:18;;;12194:30;12260:34;12240:18;;;12233:62;12331:7;12311:18;;;12304:35;12356:19;;21620:112:0;11980:401:1;21620:112:0;21750:31;21760:9;21771;21750;:31::i;:::-;21743:38;;;;20658:1131;;;;;;;:::o;16568:1425::-;16774:13;-1:-1:-1;;16802:9:0;:30;16798:186;;;-1:-1:-1;;;;;;16798:186:0;;;16916:56;16923:9;16916:56;;;;;;;;;;;;;;;;;:6;:56::i;:::-;16907:65;;16798:186;17125:4;;;;;;;;;;;-1:-1:-1;;;17125:4:0;;;;;17046:163;;8409:104;17046:163;;;9461:25:1;17109:22:0;9502:18:1;;;9495:34;28636:9:0;9545:18:1;;;9538:34;17189:4:0;9588:18:1;;;;9581:83;;;;17046:163:0;;;;;;;;;;9433:19:1;;;;17046:163:0;;17022:198;;;;;;-1:-1:-1;;;;;17417:13:0;;-1:-1:-1;17417:13:0;;;:6;:13;;;;;;:15;;8874:119;;17417:13;;17363:7;;17389:9;;17417:15;-1:-1:-1;17417:15:0;;;:::i;:::-;;;;-1:-1:-1;17276:198:0;;;;;;12673:25:1;;;;-1:-1:-1;;;;;12795:15:1;;;12775:18;;;12768:43;12847:15;;;;12827:18;;;12820:43;12879:18;;;12872:34;12922:19;;;12915:35;12966:19;;;12959:35;;;12645:19;;17276:198:0;;;;;;;;;;;;17252:233;;;;;;17231:254;;17496:14;17566:15;17583:10;17537:57;;;;;;;;10390:66:1;10378:79;;10482:1;10473:11;;10466:27;;;;10518:2;10509:12;;10502:28;10555:2;10546:12;;10120:444;17537:57:0;;;;-1:-1:-1;;17537:57:0;;;;;;;;;17513:92;;17537:57;17513:92;;;;17616:17;17636:26;;;;;;;;;10796:25:1;;;10869:4;10857:17;;10837:18;;;10830:45;;;;10891:18;;;10884:34;;;10934:18;;;10927:34;;;17513:92:0;;-1:-1:-1;17616:17:0;17636:26;;10768:19:1;;17636:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17636:26:0;;-1:-1:-1;;17636:26:0;;;-1:-1:-1;;;;;;;17681:23:0;;17673:66;;;;-1:-1:-1;;;17673:66:0;;13207:2:1;17673:66:0;;;13189:21:1;13246:2;13226:18;;;13219:30;13285:32;13265:18;;;13258:60;13335:18;;17673:66:0;13005:354:1;17673:66:0;17771:5;-1:-1:-1;;;;;17758:18:0;:9;-1:-1:-1;;;;;17758:18:0;;17750:56;;;;-1:-1:-1;;;17750:56:0;;13566:2:1;17750:56:0;;;13548:21:1;13605:2;13585:18;;;13578:30;13644:27;13624:18;;;13617:55;13689:18;;17750:56:0;13364:349:1;17750:56:0;17844:8;17825:15;:27;;17817:70;;;;-1:-1:-1;;;17817:70:0;;13920:2:1;17817:70:0;;;13902:21:1;13959:2;13939:18;;;13932:30;13998:32;13978:18;;;13971:60;14048:18;;17817:70:0;13718:354:1;17817:70:0;17929:6;17900:10;:17;17911:5;-1:-1:-1;;;;;17900:17:0;-1:-1:-1;;;;;17900:17:0;;;;;;;;;;;;:26;17918:7;-1:-1:-1;;;;;17900:26:0;-1:-1:-1;;;;;17900:26:0;;;;;;;;;;;;;:35;;;;;-1:-1:-1;;;;;17900:35:0;;;;;-1:-1:-1;;;;;17900:35:0;;;;;;17969:7;-1:-1:-1;;;;;17953:32:0;17962:5;-1:-1:-1;;;;;17953:32:0;;17978:6;17953:32;;;;;-1:-1:-1;;;;;3179:39:1;;;;3161:58;;3149:2;3134:18;;3017:208;17953:32:0;;;;;;;;16763:1230;;;;;16568:1425;;;;;;;:::o;11326:396::-;-1:-1:-1;;;;;11404:21:0;;11382:117;;;;-1:-1:-1;;;11382:117:0;;14279:2:1;11382:117:0;;;14261:21:1;14318:2;14298:18;;;14291:30;14357:34;14337:18;;;14330:62;14428:16;14408:18;;;14401:44;14462:19;;11382:117:0;14077:410:1;11382:117:0;11546:6;;-1:-1:-1;;;;;11546:6:0;11532:10;:20;11510:131;;;;-1:-1:-1;;;11510:131:0;;14694:2:1;11510:131:0;;;14676:21:1;14733:2;14713:18;;;14706:30;14772:34;14752:18;;;14745:62;14843:31;14823:18;;;14816:59;14892:19;;11510:131:0;14492:425:1;11510:131:0;11652:6;:16;;;;-1:-1:-1;;;;;11652:16:0;;;;;;;;11684:30;;;15157:34:1;;;15222:2;15207:18;;15200:43;;;;11684:30:0;;15069:18:1;11684:30:0;14922:327:1;24336:442:0;24460:13;-1:-1:-1;;24488:9:0;:30;24484:187;;;-1:-1:-1;;;;;;24484:187:0;;;24602:57;24609:9;24602:57;;;;;;;;;;;;;;;;;:6;:57::i;:::-;24593:66;;24484:187;-1:-1:-1;;;;;24683:18:0;;;;;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;-1:-1:-1;;24683:36:0;-1:-1:-1;;;;;24683:36:0;;;;;;;;24737:33;;3161:58:1;;;24737:33:0;;3134:18:1;24737:33:0;;;;;;;24449:329;24336:442;;;:::o;27869:196::-;27974:6;28017:12;28010:5;28006:9;;27998:32;;;;-1:-1:-1;;;27998:32:0;;;;;;;;:::i;:::-;-1:-1:-1;28055:1:0;;27869:196;-1:-1:-1;;27869:196:0:o;28303:199::-;28423:6;28455:1;-1:-1:-1;;;;;28450:6:0;:1;-1:-1:-1;;;;;28450:6:0;;;28458:12;28442:29;;;;;-1:-1:-1;;;28442:29:0;;;;;;;;:::i;:::-;-1:-1:-1;28489:5:0;28493:1;28489;:5;:::i;:::-;28482:12;28303:199;-1:-1:-1;;;;28303:199:0:o;24786:818::-;-1:-1:-1;;;;;24928:17:0;;24906:126;;;;-1:-1:-1;;;24906:126:0;;15698:2:1;24906:126:0;;;15680:21:1;15737:2;15717:18;;;15710:30;15776:34;15756:18;;;15749:62;15847:29;15827:18;;;15820:57;15894:19;;24906:126:0;15496:423:1;24906:126:0;-1:-1:-1;;;;;25065:17:0;;25043:124;;;;-1:-1:-1;;;25043:124:0;;16126:2:1;25043:124:0;;;16108:21:1;16165:2;16145:18;;;16138:30;16204:34;16184:18;;;16177:62;16275:27;16255:18;;;16248:55;16320:19;;25043:124:0;15924:421:1;25043:124:0;-1:-1:-1;;;;;25216:13:0;;;;;;:8;:13;;;;;;;;;;25196:135;;;;;;;;;;;;;;-1:-1:-1;;;;;25216:13:0;;;;25244:6;;25196:135;;;;;;;:5;:135::i;:::-;-1:-1:-1;;;;;25180:13:0;;;;;;;:8;:13;;;;;;;;:151;;-1:-1:-1;;25180:151:0;-1:-1:-1;;;;;25180:151:0;;;;;;25378:13;;;;;;;;;;25358:129;;;;;;;;;;;;;;25378:13;;;;;25406:6;;25358:129;;;;;;;;:5;:129::i;:::-;-1:-1:-1;;;;;25342:13:0;;;;;;;:8;:13;;;;;;;;;:145;;-1:-1:-1;;25342:145:0;-1:-1:-1;;;;;25342:145:0;;;;;;25503:26;;3179:39:1;;;3161:58;;25342:13:0;;25503:26;;;;;;3134:18:1;25503:26:0;;;;;;;-1:-1:-1;;;;;25557:14:0;;;;;;;:9;:14;;;;;;;25573;;;;;;;;25542:54;;25557:14;;;;25573;25589:6;25542:14;:54::i;:::-;24786:818;;;:::o;23953:375::-;-1:-1:-1;;;;;24056:20:0;;;24030:23;24056:20;;;:9;:20;;;;;;;;;;24113:8;:19;;;;;;24143:20;;;;:32;;;;;;;;;;;24193:54;;24056:20;;;;;-1:-1:-1;;;;;24113:19:0;;;;24143:32;;24056:20;;;24193:54;;24030:23;24193:54;24260:60;24275:15;24292:9;24303:16;24260:14;:60::i;:::-;24019:309;;23953:375;;:::o;2428:98::-;2486:7;2513:5;2517:1;2513;:5;:::i;3166:98::-;3224:7;3251:5;3255:1;3251;:5;:::i;3565:98::-;3623:7;3650:5;3654:1;3650;:5;:::i;28073:222::-;28193:6;;28223:5;28227:1;28223;:5;:::i;:::-;28212:16;;28252:1;-1:-1:-1;;;;;28247:6:0;:1;-1:-1:-1;;;;;28247:6:0;;;28255:12;28239:29;;;;;-1:-1:-1;;;28239:29:0;;;;;;;;:::i;:::-;-1:-1:-1;28286:1:0;28073:222;-1:-1:-1;;;;28073:222:0:o;25612:1227::-;25751:6;-1:-1:-1;;;;;25741:16:0;:6;-1:-1:-1;;;;;25741:16:0;;;:30;;;;;25770:1;25761:6;-1:-1:-1;;;;;25761:10:0;;25741:30;25737:1095;;;-1:-1:-1;;;;;25792:20:0;;;25788:509;;-1:-1:-1;;;;;25852:22:0;;25833:16;25852:22;;;:14;:22;;;;;;;;;25912:13;:102;;26013:1;25912:102;;;-1:-1:-1;;;;;25949:19:0;;;;;;:11;:19;;;;;;25969:13;25981:1;25969:9;:13;:::i;:::-;25949:34;;;;;;;;;;;;;-1:-1:-1;25949:34:0;:40;;;;-1:-1:-1;;;;;25949:40:0;25912:102;25893:121;;26033:16;26052:153;26080:9;26112:6;26052:153;;;;;;;;;;;;;;;;;:5;:153::i;:::-;26033:172;;26224:57;26241:6;26249:9;26260;26271;26224:16;:57::i;:::-;25814:483;;;25788:509;-1:-1:-1;;;;;26317:20:0;;;26313:508;;-1:-1:-1;;;;;26377:22:0;;26358:16;26377:22;;;:14;:22;;;;;;;;;26437:13;:102;;26538:1;26437:102;;;-1:-1:-1;;;;;26474:19:0;;;;;;:11;:19;;;;;;26494:13;26506:1;26494:9;:13;:::i;:::-;26474:34;;;;;;;;;;;;;-1:-1:-1;26474:34:0;:40;;;;-1:-1:-1;;;;;26474:40:0;26437:102;26418:121;;26558:16;26577:152;26605:9;26637:6;26577:152;;;;;;;;;;;;;;;;;:5;:152::i;:::-;26558:171;;26748:57;26765:6;26773:9;26784;26795;26847:810;27010:18;27031:112;27052:12;27031:112;;;;;;;;;;;;;;;;;:6;:112::i;:::-;27010:133;;27189:1;27174:12;:16;;;:98;;;;-1:-1:-1;;;;;;27207:22:0;;;;;;:11;:22;;;;;:65;;;;27230:16;27245:1;27230:12;:16;:::i;:::-;27207:40;;;;;;;;;;;;;;;-1:-1:-1;27207:40:0;:50;;:65;27174:98;27156:425;;;-1:-1:-1;;;;;27299:22:0;;;;;;:11;:22;;;;;27348:8;;27322:16;27337:1;27322:12;:16;:::i;:::-;27299:40;;;;;;;;;;;;;-1:-1:-1;27299:40:0;:57;;-1:-1:-1;;;;;27299:57:0;;;;;;;;;;;;;;;;27156:425;;;27428:82;;;;;;;;;;;;;;-1:-1:-1;;;;;27428:82:0;;;;;;;;;;-1:-1:-1;;;;;27389:22:0;;-1:-1:-1;27389:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;27553:16;27412:12;27389:121;27553:16;:::i;:::-;-1:-1:-1;;;;;27525:25:0;;;;;;:14;:25;;;;;:44;;;;;;;;;;;;;;;27156:425;27598:51;;;-1:-1:-1;;;;;17425:15:1;;;17407:34;;17477:15;;17472:2;17457:18;;17450:43;-1:-1:-1;;;;;27598:51:0;;;;;17335:18:1;27598:51:0;;;;;;;26999:658;26847:810;;;;:::o;27665:196::-;27770:6;27813:12;27806:5;27802:9;;27794:32;;;;-1:-1:-1;;;27794:32:0;;;;;;;14:656:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:1;574:15;-1:-1:-1;;570:88:1;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:1:o;906:196::-;974:20;;-1:-1:-1;;;;;1023:54:1;;1013:65;;1003:93;;1092:1;1089;1082:12;1003:93;906:196;;;:::o;1107:254::-;1175:6;1183;1236:2;1224:9;1215:7;1211:23;1207:32;1204:52;;;1252:1;1249;1242:12;1204:52;1275:29;1294:9;1275:29;:::i;:::-;1265:39;1351:2;1336:18;;;;1323:32;;-1:-1:-1;;;1107:254:1:o;1922:328::-;1999:6;2007;2015;2068:2;2056:9;2047:7;2043:23;2039:32;2036:52;;;2084:1;2081;2074:12;2036:52;2107:29;2126:9;2107:29;:::i;:::-;2097:39;;2155:38;2189:2;2178:9;2174:18;2155:38;:::i;:::-;2145:48;;2240:2;2229:9;2225:18;2212:32;2202:42;;1922:328;;;;;:::o;2444:180::-;2503:6;2556:2;2544:9;2535:7;2531:23;2527:32;2524:52;;;2572:1;2569;2562:12;2524:52;-1:-1:-1;2595:23:1;;2444:180;-1:-1:-1;2444:180:1:o;2629:186::-;2688:6;2741:2;2729:9;2720:7;2716:23;2712:32;2709:52;;;2757:1;2754;2747:12;2709:52;2780:29;2799:9;2780:29;:::i;3230:156::-;3296:20;;3356:4;3345:16;;3335:27;;3325:55;;3376:1;3373;3366:12;3391:531;3493:6;3501;3509;3517;3525;3533;3586:3;3574:9;3565:7;3561:23;3557:33;3554:53;;;3603:1;3600;3593:12;3554:53;3626:29;3645:9;3626:29;:::i;:::-;3616:39;;3702:2;3691:9;3687:18;3674:32;3664:42;;3753:2;3742:9;3738:18;3725:32;3715:42;;3776:36;3808:2;3797:9;3793:18;3776:36;:::i;:::-;3766:46;;3859:3;3848:9;3844:19;3831:33;3821:43;;3911:3;3900:9;3896:19;3883:33;3873:43;;3391:531;;;;;;;;:::o;3927:606::-;4038:6;4046;4054;4062;4070;4078;4086;4139:3;4127:9;4118:7;4114:23;4110:33;4107:53;;;4156:1;4153;4146:12;4107:53;4179:29;4198:9;4179:29;:::i;:::-;4169:39;;4227:38;4261:2;4250:9;4246:18;4227:38;:::i;:::-;4217:48;;4312:2;4301:9;4297:18;4284:32;4274:42;;4363:2;4352:9;4348:18;4335:32;4325:42;;4386:37;4418:3;4407:9;4403:19;4386:37;:::i;:::-;4376:47;;4470:3;4459:9;4455:19;4442:33;4432:43;;4522:3;4511:9;4507:19;4494:33;4484:43;;3927:606;;;;;;;;;;:::o;4538:260::-;4606:6;4614;4667:2;4655:9;4646:7;4642:23;4638:32;4635:52;;;4683:1;4680;4673:12;4635:52;4706:29;4725:9;4706:29;:::i;:::-;4696:39;;4754:38;4788:2;4777:9;4773:18;4754:38;:::i;:::-;4744:48;;4538:260;;;;;:::o;4803:350::-;4870:6;4878;4931:2;4919:9;4910:7;4906:23;4902:32;4899:52;;;4947:1;4944;4937:12;4899:52;4970:29;4989:9;4970:29;:::i;:::-;4960:39;;5049:2;5038:9;5034:18;5021:32;5093:10;5086:5;5082:22;5075:5;5072:33;5062:61;;5119:1;5116;5109:12;5062:61;5142:5;5132:15;;;4803:350;;;;;:::o;5671:184::-;5723:77;5720:1;5713:88;5820:4;5817:1;5810:15;5844:4;5841:1;5834:15;5860:128;5900:3;5931:1;5927:6;5924:1;5921:13;5918:39;;;5937:18;;:::i;:::-;-1:-1:-1;5973:9:1;;5860:128::o;8489:221::-;8528:4;8557:10;8617;;;;8587;;8639:12;;;8636:38;;;8654:18;;:::i;:::-;8691:13;;8489:221;-1:-1:-1;;;8489:221:1:o;8715:184::-;8767:77;8764:1;8757:88;8864:4;8861:1;8854:15;8888:4;8885:1;8878:15;8904:191;8943:1;8969:10;9006:2;9003:1;8999:10;9028:3;9018:37;;9035:18;;:::i;:::-;9073:10;;9069:20;;;;;8904:191;-1:-1:-1;;8904:191:1:o;9100:125::-;9140:4;9168:1;9165;9162:8;9159:34;;;9173:18;;:::i;:::-;-1:-1:-1;9210:9:1;;9100:125::o;11378:195::-;11417:3;-1:-1:-1;;11441:5:1;11438:77;11435:103;;;11518:18;;:::i;:::-;-1:-1:-1;11565:1:1;11554:13;;11378:195::o;15254:237::-;15293:4;-1:-1:-1;;;;;15398:10:1;;;;15368;;15420:12;;;15417:38;;;15435:18;;:::i;16350:228::-;16390:7;16516:1;-1:-1:-1;;16444:74:1;16441:1;16438:81;16433:1;16426:9;16419:17;16415:105;16412:131;;;16523:18;;:::i;:::-;-1:-1:-1;16563:9:1;;16350:228::o;16583:120::-;16623:1;16649;16639:35;;16654:18;;:::i;:::-;-1:-1:-1;16688:9:1;;16583:120::o;16708:244::-;16747:3;-1:-1:-1;;;;;16828:2:1;16825:1;16821:10;16858:2;16855:1;16851:10;16889:3;16885:2;16881:12;16876:3;16873:21;16870:47;;;16897:18;;:::i;:::-;16933:13;;16708:244;-1:-1:-1;;;;16708:244:1:o;16957:228::-;16996:3;17024:10;17061:2;17058:1;17054:10;17091:2;17088:1;17084:10;17122:3;17118:2;17114:12;17109:3;17106:21;17103:47;;;17130:18;;:::i

Swarm Source

ipfs://39840fd33b6c0f40588ce6f70f58be5ce1cf8c8fa79a676880dd051e5e73bb16

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.