ETH Price: $3,527.17 (+6.97%)

Token

Ampleforth Governance (FORTH)
 

Overview

Max Total Supply

15,297,897.144559330607622906 FORTH

Holders

26,222 ( -0.008%)

Market

Price

$3.95 @ 0.001120 ETH (+6.41%)

Onchain Market Cap

$60,426,693.72

Circulating Supply Market Cap

$45,193,621.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.1062479406345862 FORTH

Value
$0.42 ( ~0.000119075647973839 Eth) [0.0000%]
0x3e7b67e32ad9ef6eed1715dc2149a66890ca383d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

FORTH is the governance token for the Ampleforth protocol. AMPL is the first rebasing currency and a key DeFi building block for denominating stable contracts.

Market

Volume (24H):$4,917,240.00
Market Capitalization:$45,193,621.00
Circulating Supply:11,424,569.00 FORTH
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Forth

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, BSD-3-Clause license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: Forth.sol
// SPDX-License-Identifier: BSD-3-Clause

pragma solidity 0.6.11;
pragma experimental ABIEncoderV2;

import "./SafeMath.sol";

contract Forth {
    /// @notice EIP-20 token name for this token
    string public constant name = "Ampleforth Governance";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "FORTH";

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

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 15_000_000e18; // 15 million Forth

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

    /// @notice The timestamp after which minting may occur
    uint 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
    uint8 public constant mintCap = 2;

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

    /// @dev 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 => uint) public nonces;

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

    /// @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, uint previousBalance, uint 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 Forth 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_, uint mintingAllowedAfter_) public {
        require(mintingAllowedAfter_ >= block.timestamp, "Forth::constructor: minting can only begin after deployment");

        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(msg.sender == minter, "Forth::setMinter: only the minter can change the minter address");
        emit MinterChanged(minter, minter_);
        minter = minter_;
    }

    /**
     * @notice Mint new tokens
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to be minted
     */
    function mint(address dst, uint rawAmount) external {
        require(msg.sender == minter, "Forth::mint: only the minter can mint");
        require(block.timestamp >= mintingAllowedAfter, "Forth::mint: minting not allowed yet");
        require(dst != address(0), "Forth::mint: cannot transfer to the zero address");

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

        // mint the amount
        uint96 amount = safe96(rawAmount, "Forth::mint: amount exceeds 96 bits");
        require(amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), "Forth::mint: exceeded mint cap");
        uint96 supply = safe96(totalSupply, "Forth::mint old totalSupply exceeds 96 bits");
        totalSupply = add96(supply, amount, "Forth::mint: new totalSupply exceeds 96 bits");

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

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

    /**
     * @notice Destroys `amount` tokens from the caller
     * @param rawAmount The number of tokens to burn
     */
    function burn(uint256 rawAmount) external {
        uint96 amount = safe96(rawAmount, "Forth::burn: rawAmount exceeds 96 bits");
        _burn(msg.sender, amount);
    }

    /**
     * @notice Destroys `amount` tokens from `account`, deducting from the caller's allowance
     * @param account The address of the account to burn from
     * @param rawAmount The number of tokens to burn
     */
    function burnFrom(address account, uint256 rawAmount) external {
        uint96 amount = safe96(rawAmount, "Forth::burnFrom: rawAmount exceeds 96 bits");

        uint96 decreasedAllowance =
            sub96(allowances[account][msg.sender], amount, "Forth::burnFrom: amount exceeds allowance");
        allowances[account][msg.sender] = decreasedAllowance;
        emit Approval(account, msg.sender, decreasedAllowance);

        _burn(account, amount);
    }

    /**
     * @notice Destroys `amount` tokens from `account`, reducing the total supply
     * @param account The address of the account to burn from
     * @param amount The number of tokens to burn
     */
    function _burn(address account, uint96 amount) internal {
        require(account != address(0), "Forth::_burn: burn from the zero address");

        uint96 supply = safe96(totalSupply, "Forth::_burn: old supply exceeds 96 bits");
        totalSupply = sub96(supply, amount, "Forth::_burn: amount exceeds totalSupply");

        balances[account] = sub96(balances[account], amount, "Forth::_burn: amount exceeds balance");
        emit Transfer(account, address(0), amount);

        // move delegates
        _moveDelegates(delegates[account], address(0), 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 (uint) {
        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, uint rawAmount) external returns (bool) {
        uint96 amount;
        if (rawAmount == type(uint).max) {
            amount = type(uint96).max;
        } else {
            amount = safe96(rawAmount, "Forth::approve: amount exceeds 96 bits");
        }

        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        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, uint rawAmount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        uint96 amount;
        if (rawAmount == type(uint).max) {
            amount = type(uint96).max;
        } else {
            amount = safe96(rawAmount, "Forth::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), "Forth::permit: invalid signature");
        require(signatory == owner, "Forth::permit: unauthorized");
        require(now <= deadline, "Forth::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 (uint) {
        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, uint rawAmount) external returns (bool) {
        uint96 amount = safe96(rawAmount, "Forth::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, uint rawAmount) external returns (bool) {
        address spender = msg.sender;
        uint96 spenderAllowance = allowances[src][spender];
        uint96 amount = safe96(rawAmount, "Forth::approve: amount exceeds 96 bits");

        if (spender != src && spenderAllowance != type(uint96).max) {
            uint96 newAllowance = sub96(spenderAllowance, amount, "Forth::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, uint nonce, uint 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), "Forth::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "Forth::delegateBySig: invalid nonce");
        require(now <= expiry, "Forth::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, uint blockNumber) public view returns (uint96) {
        require(blockNumber < block.number, "Forth::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 _transferTokens(address src, address dst, uint96 amount) internal {
        require(src != address(0), "Forth::_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "Forth::_transferTokens: cannot transfer to the zero address");

        balances[src] = sub96(balances[src], amount, "Forth::_transferTokens: transfer amount exceeds balance");
        balances[dst] = add96(balances[dst], amount, "Forth::_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, "Forth::_moveVotes: 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, "Forth::_moveVotes: vote amount overflows");
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
      uint32 blockNumber = safe32(block.number, "Forth::_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(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint 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 pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

File 2 of 2: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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":"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":"uint256","name":"rawAmount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":"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":[],"name":"minimumTimeBetweenMints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"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":"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"}]

60806040526a0c685fa11e01ec6f0000006000553480156200002057600080fd5b506040516200352c3803806200352c83398101604081905262000043916200016e565b428110156200006f5760405162461bcd60e51b81526004016200006690620001ca565b60405180910390fd5b600080546001600160a01b0385168083526004602052604080842080546001600160601b0319166001600160601b0390941693909317909255825491519092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620000dd919062000227565b60405180910390a3600180546001600160a01b0319166001600160a01b0384811691909117918290556040517f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f6926200013c92600092911690620001b0565b60405180910390a160025550620002309050565b80516001600160a01b03811681146200016857600080fd5b92915050565b60008060006060848603121562000183578283fd5b6200018f858562000150565b9250620001a0856020860162000150565b9150604084015190509250925092565b6001600160a01b0392831681529116602082015260400190565b6020808252603b908201527f466f7274683a3a636f6e7374727563746f723a206d696e74696e672063616e2060408201527f6f6e6c7920626567696e206166746572206465706c6f796d656e740000000000606082015260800190565b90815260200190565b6132ec80620002406000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636fcfff4511610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e146103a7578063e7a324dc146103ba578063f1127ed8146103c2578063fca3b5aa146103e3576101cf565b8063a9059cbb1461035b578063b4b5ea571461036e578063c3cda52014610381578063d505accf14610394576101cf565b8063782d6fe1116100de578063782d6fe11461030d57806379cc67901461032d5780637ecebe001461034057806395d89b4114610353576101cf565b80636fcfff45146102df57806370a08231146102f257806376c71ca114610305576101cf565b806330b36cef1161017157806342966c681161014b57806342966c6814610291578063587cde1e146102a45780635c11d62f146102b75780635c19a95c146102cc576101cf565b806330b36cef1461025f578063313ce5671461026757806340c10f191461027c576101cf565b806318160ddd116101ad57806318160ddd1461022757806320606b701461023c57806323b872dd1461024457806330adf81f14610257576101cf565b806306fdde03146101d457806307546172146101f2578063095ea7b314610207575b600080fd5b6101dc6103f6565b6040516101e991906128db565b60405180910390f35b6101fa61042f565b6040516101e991906127be565b61021a610215366004612575565b61044b565b6040516101e99190612806565b61022f61055c565b6040516101e99190612811565b61022f610562565b61021a6102523660046124c9565b610579565b61022f61071b565b61022f610727565b61026f61072d565b6040516101e99190612f23565b61028f61028a366004612575565b610732565b005b61028f61029f366004612637565b610a33565b6101fa6102b236600461247a565b610a67565b6102bf610a8f565b6040516101e99190612eee565b61028f6102da36600461247a565b610a97565b6102bf6102ed36600461247a565b610aa4565b61022f61030036600461247a565b610abc565b61026f610af2565b61032061031b366004612575565b610af7565b6040516101e99190612f31565b61028f61033b366004612575565b610dd9565b61022f61034e36600461247a565b610f11565b6101dc610f23565b61021a610369366004612575565b610f5c565b61032061037c36600461247a565b610f98565b61028f61038f36600461259f565b611047565b61028f6103a2366004612509565b6112cc565b61022f6103b5366004612495565b6116ed565b61022f611733565b6103d56103d03660046125f8565b61173f565b6040516101e9929190612eff565b61028f6103f136600461247a565b61177a565b6040518060400160405280601581526020017f416d706c65666f72746820476f7665726e616e6365000000000000000000000081525081565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561048957506bffffffffffffffffffffffff6104ae565b6104ab8360405180606001604052806026815260200161303f60269139611866565b90505b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff891680855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff861617905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610548908590612f31565b60405180910390a360019150505b92915050565b60005481565b60405161056e906126fa565b604051809103902081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602090815260408083203380855290835281842054825160608101909352602680845291936bffffffffffffffffffffffff9091169285926105e3928892919061303f90830139611866565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561062f57506bffffffffffffffffffffffff82811614155b1561070357600061065983836040518060600160405280603e8152602001613001603e91396118b8565b73ffffffffffffffffffffffffffffffffffffffff8981166000818152600360209081526040808320948a16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff86161790555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106f9908590612f31565b60405180910390a3505b61070e87878361191b565b5060019695505050505050565b60405161056e90612685565b60025481565b601281565b60015473ffffffffffffffffffffffffffffffffffffffff16331461078c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612b2e565b60405180910390fd5b6002544210156107c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612d43565b73ffffffffffffffffffffffffffffffffffffffff8216610815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612da0565b610823426301e13380611b87565b600281905550600061084d826040518060600160405280602381526020016131eb60239139611866565b9050610869610862600054600260ff16611bc6565b6064611c1a565b816bffffffffffffffffffffffff1611156108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612b8b565b60006108d66000546040518060600160405280602b8152602001613265602b9139611866565b90506108fb81836040518060600160405280602c8152602001612f8c602c9139611c66565b6bffffffffffffffffffffffff908116600090815573ffffffffffffffffffffffffffffffffffffffff861681526004602090815260409182902054825160608101909352602680845261095f949190911692869290919061323f90830139611c66565b73ffffffffffffffffffffffffffffffffffffffff851660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff959095169490941790935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109f3908690612f31565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff808516600090815260056020526040812054610a2d921684611cc1565b50505050565b6000610a578260405180606001604052806026815260200161306560269139611866565b9050610a633382611f08565b5050565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6301e1338081565b610aa133826120d0565b50565b60076020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600460205260409020546bffffffffffffffffffffffff1690565b600281565b6000438210610b32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612bc2565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205463ffffffff1680610b6d576000915050610556565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260066020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310610c455773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff168352929052205464010000000090046bffffffffffffffffffffffff169050610556565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260066020908152604080832083805290915290205463ffffffff16831015610c8d576000915050610556565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff161115610d8157600282820363ffffffff16048103610cdd61242e565b5073ffffffffffffffffffffffffffffffffffffffff8716600090815260066020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff169181019190915290871415610d5c576020015194506105569350505050565b805163ffffffff16871115610d7357819350610d7a565b6001820392505b5050610cb3565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260066020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b6000610dfd826040518060600160405280602a8152602001613198602a9139611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020908152604080832033845282528083205481516060810190925260298083529495509293610e64936bffffffffffffffffffffffff16928692919061311f908301396118b8565b73ffffffffffffffffffffffffffffffffffffffff851660008181526003602090815260408083203380855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff86161790559051929350917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610eff908590612f31565b60405180910390a3610a2d8483611f08565b60086020526000908152604090205481565b6040518060400160405280600581526020017f464f52544800000000000000000000000000000000000000000000000000000081525081565b600080610f818360405180606001604052806027815260200161329060279139611866565b9050610f8e33858361191b565b5060019392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205463ffffffff1680610fd0576000611040565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b9392505050565b6000604051611055906126fa565b60408051918290038220828201909152601582527f416d706c65666f72746820476f7665726e616e636500000000000000000000006020909201919091527f8074a57fc3df0f85e9fde9508c19e931785a115c70c33d274f41a392070a74fc6110bc61217e565b306040516020016110d0949392919061288c565b60405160208183030381529060405280519060200120905060006040516110f69061276f565b604051908190038120611111918a908a908a9060200161285b565b6040516020818303038152906040528051906020012090506000828260405160200161113e92919061264f565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161117b94939291906128bd565b6020604051602081039080840390855afa15801561119d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612a3d565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600860205260409020805460018101909155891461127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107839061294c565b874211156112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612e91565b6112bf818b6120d0565b505050505b505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86141561130957506bffffffffffffffffffffffff61132e565b61132b86604051806060016040528060258152602001612fdc60259139611866565b90505b600060405161133c906126fa565b60408051918290038220828201909152601582527f416d706c65666f72746820476f7665726e616e636500000000000000000000006020909201919091527f8074a57fc3df0f85e9fde9508c19e931785a115c70c33d274f41a392070a74fc6113a361217e565b306040516020016113b7949392919061288c565b60405160208183030381529060405280519060200120905060006040516113dd90612685565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff8d1660009081526008602090815292902080546001810190915561142c9391928e928e928e9290918e910161281a565b6040516020818303038152906040528051906020012090506000828260405160200161145992919061264f565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161149694939291906128bd565b6020604051602081039080840390855afa1580156114b8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612d0e565b8b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612e5a565b884211156115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612c1f565b84600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516116d79190612f31565b60405180910390a3505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526003602090815260408083209390941682529190915220546bffffffffffffffffffffffff1690565b60405161056e9061276f565b600660209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b60015473ffffffffffffffffffffffffffffffffffffffff1633146117cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610783906129a9565b6001546040517f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f6916118179173ffffffffffffffffffffffffffffffffffffffff9091169084906127df565b60405180910390a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000816c0100000000000000000000000084106118b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b509192915050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff1611158290611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8316611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612ad1565b73ffffffffffffffffffffffffffffffffffffffff82166119b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612dfd565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020908152604091829020548251606081019093526037808452611a12936bffffffffffffffffffffffff90921692859291906130c0908301396118b8565b73ffffffffffffffffffffffffffffffffffffffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff968716179055928616825290829020548251606081019093526031808452611aa4949190911692859290919061320e90830139611c66565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95909516949094179093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b3b908590612f31565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff808416600090815260056020526040808220548584168352912054611b8292918216911683611cc1565b505050565b600082820183811015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612a06565b600082611bd557506000610556565b82820282848281611be257fe5b0414611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612c54565b6000808211611c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612a9a565b818381611c5e57fe5b049392505050565b6000838301826bffffffffffffffffffffffff8087169083161015611cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d0b57506000816bffffffffffffffffffffffff16115b15611b825773ffffffffffffffffffffffffffffffffffffffff831615611e0e5773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081205463ffffffff169081611d65576000611dd5565b73ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b90506000611dfc82856040518060600160405280602981526020016131c2602991396118b8565b9050611e0a86848484612182565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615611b825773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081205463ffffffff169081611e63576000611ed3565b73ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b90506000611efa82856040518060600160405280602881526020016130f760289139611c66565b90506112c485848484612182565b73ffffffffffffffffffffffffffffffffffffffff8216611f55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612cb1565b6000611f7b60005460405180606001604052806028815260200161317060289139611866565b9050611fa08183604051806060016040528060288152602001613148602891396118b8565b6bffffffffffffffffffffffff908116600090815573ffffffffffffffffffffffffffffffffffffffff85168152600460209081526040918290205482516060810190935260248084526120049491909116928692909190612fb8908301396118b8565b73ffffffffffffffffffffffffffffffffffffffff841660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff959095169490941790935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612095908690612f31565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff808416600090815260056020526040812054611b8292169084611cc1565b73ffffffffffffffffffffffffffffffffffffffff808316600081815260056020818152604080842080546004845282862054949093528787167fffffffffffffffffffffffff000000000000000000000000000000000000000084168117909155905191909516946bffffffffffffffffffffffff9092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610a2d828483611cc1565b4690565b60006121a64360405180606001604052806035815260200161308b603591396123ec565b905060008463ffffffff1611801561221a575073ffffffffffffffffffffffffffffffffffffffff8516600090815260066020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b156122b95773ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff880163ffffffff168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff166401000000006bffffffffffffffffffffffff851602179055612395565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000818152600683528781208c871682528352878120965187549451909516640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9587167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000958616179590951694909417909555938252600790935292909220805460018801909316929091169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516123dd929190612f4a565b60405180910390a25050505050565b60008164010000000084106118b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461055657600080fd5b803560ff8116811461055657600080fd5b60006020828403121561248b578081fd5b6110408383612445565b600080604083850312156124a7578081fd5b6124b18484612445565b91506124c08460208501612445565b90509250929050565b6000806000606084860312156124dd578081fd5b83356124e881612f69565b925060208401356124f881612f69565b929592945050506040919091013590565b600080600080600080600060e0888a031215612523578283fd5b61252d8989612445565b965061253c8960208a01612445565b955060408801359450606088013593506125598960808a01612469565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612587578182fd5b6125918484612445565b946020939093013593505050565b60008060008060008060c087890312156125b7578182fd5b6125c18888612445565b955060208701359450604087013593506125de8860608901612469565b92506080870135915060a087013590509295509295509295565b6000806040838503121561260a578182fd5b6126148484612445565b9150602083013563ffffffff8116811461262c578182fd5b809150509250929050565b600060208284031215612648578081fd5b5035919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b7f5065726d69742861646472657373206f776e65722c616464726573732073706581527f6e6465722c75696e743235362076616c75652c75696e74323536206e6f6e636560208201527f2c75696e7432353620646561646c696e65290000000000000000000000000000604082015260520190565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201527f6374290000000000000000000000000000000000000000000000000000000000604082015260430190565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845273ffffffffffffffffffffffffffffffffffffffff9290921660208401526040830152606082015260800190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015612907578581018301518582016040015282016128eb565b818111156129185783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526023908201527f466f7274683a3a64656c656761746542795369673a20696e76616c6964206e6f60408201527f6e63650000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603f908201527f466f7274683a3a7365744d696e7465723a206f6e6c7920746865206d696e746560408201527f722063616e206368616e676520746865206d696e746572206164647265737300606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f466f7274683a3a64656c656761746542795369673a20696e76616c696420736960408201527f676e617475726500000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252603d908201527f466f7274683a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460408201527f72616e736665722066726f6d20746865207a65726f2061646472657373000000606082015260800190565b60208082526025908201527f466f7274683a3a6d696e743a206f6e6c7920746865206d696e7465722063616e60408201527f206d696e74000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f466f7274683a3a6d696e743a206578636565646564206d696e74206361700000604082015260600190565b60208082526028908201527f466f7274683a3a6765745072696f72566f7465733a206e6f742079657420646560408201527f7465726d696e6564000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f466f7274683a3a7065726d69743a207369676e61747572652065787069726564604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f466f7274683a3a5f6275726e3a206275726e2066726f6d20746865207a65726f60408201527f2061646472657373000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f466f7274683a3a7065726d69743a20696e76616c6964207369676e6174757265604082015260600190565b60208082526024908201527f466f7274683a3a6d696e743a206d696e74696e67206e6f7420616c6c6f77656460408201527f2079657400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f466f7274683a3a6d696e743a2063616e6e6f74207472616e7366657220746f2060408201527f746865207a65726f206164647265737300000000000000000000000000000000606082015260800190565b6020808252603b908201527f466f7274683a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460408201527f72616e7366657220746f20746865207a65726f20616464726573730000000000606082015260800190565b6020808252601b908201527f466f7274683a3a7065726d69743a20756e617574686f72697a65640000000000604082015260600190565b60208082526027908201527f466f7274683a3a64656c656761746542795369673a207369676e61747572652060408201527f6578706972656400000000000000000000000000000000000000000000000000606082015260800190565b63ffffffff91909116815260200190565b63ffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b60ff91909116815260200190565b6bffffffffffffffffffffffff91909116815260200190565b6bffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff81168114610aa157600080fdfe466f7274683a3a6d696e743a206e657720746f74616c537570706c7920657863656564732039362062697473466f7274683a3a5f6275726e3a20616d6f756e7420657863656564732062616c616e6365466f7274683a3a7065726d69743a20616d6f756e7420657863656564732039362062697473466f7274683a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365466f7274683a3a617070726f76653a20616d6f756e7420657863656564732039362062697473466f7274683a3a6275726e3a20726177416d6f756e7420657863656564732039362062697473466f7274683a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473466f7274683a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e6365466f7274683a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773466f7274683a3a6275726e46726f6d3a20616d6f756e74206578636565647320616c6c6f77616e6365466f7274683a3a5f6275726e3a20616d6f756e74206578636565647320746f74616c537570706c79466f7274683a3a5f6275726e3a206f6c6420737570706c7920657863656564732039362062697473466f7274683a3a6275726e46726f6d3a20726177416d6f756e7420657863656564732039362062697473466f7274683a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773466f7274683a3a6d696e743a20616d6f756e7420657863656564732039362062697473466f7274683a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f7773466f7274683a3a6d696e743a207472616e7366657220616d6f756e74206f766572666c6f7773466f7274683a3a6d696e74206f6c6420746f74616c537570706c7920657863656564732039362062697473466f7274683a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473a2646970667358221220376a63168431a84cde2cf43ad7ea14e0ca7fe5764590ce9816da322a9f7a32ae64736f6c634300060b0033000000000000000000000000fe2321d7dfa492dfc39330e8b85e7c49161e7f98000000000000000000000000a847dc227d3f3e86fa01406279c1e88cb6950c3a0000000000000000000000000000000000000000000000000000000062464080

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636fcfff4511610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e146103a7578063e7a324dc146103ba578063f1127ed8146103c2578063fca3b5aa146103e3576101cf565b8063a9059cbb1461035b578063b4b5ea571461036e578063c3cda52014610381578063d505accf14610394576101cf565b8063782d6fe1116100de578063782d6fe11461030d57806379cc67901461032d5780637ecebe001461034057806395d89b4114610353576101cf565b80636fcfff45146102df57806370a08231146102f257806376c71ca114610305576101cf565b806330b36cef1161017157806342966c681161014b57806342966c6814610291578063587cde1e146102a45780635c11d62f146102b75780635c19a95c146102cc576101cf565b806330b36cef1461025f578063313ce5671461026757806340c10f191461027c576101cf565b806318160ddd116101ad57806318160ddd1461022757806320606b701461023c57806323b872dd1461024457806330adf81f14610257576101cf565b806306fdde03146101d457806307546172146101f2578063095ea7b314610207575b600080fd5b6101dc6103f6565b6040516101e991906128db565b60405180910390f35b6101fa61042f565b6040516101e991906127be565b61021a610215366004612575565b61044b565b6040516101e99190612806565b61022f61055c565b6040516101e99190612811565b61022f610562565b61021a6102523660046124c9565b610579565b61022f61071b565b61022f610727565b61026f61072d565b6040516101e99190612f23565b61028f61028a366004612575565b610732565b005b61028f61029f366004612637565b610a33565b6101fa6102b236600461247a565b610a67565b6102bf610a8f565b6040516101e99190612eee565b61028f6102da36600461247a565b610a97565b6102bf6102ed36600461247a565b610aa4565b61022f61030036600461247a565b610abc565b61026f610af2565b61032061031b366004612575565b610af7565b6040516101e99190612f31565b61028f61033b366004612575565b610dd9565b61022f61034e36600461247a565b610f11565b6101dc610f23565b61021a610369366004612575565b610f5c565b61032061037c36600461247a565b610f98565b61028f61038f36600461259f565b611047565b61028f6103a2366004612509565b6112cc565b61022f6103b5366004612495565b6116ed565b61022f611733565b6103d56103d03660046125f8565b61173f565b6040516101e9929190612eff565b61028f6103f136600461247a565b61177a565b6040518060400160405280601581526020017f416d706c65666f72746820476f7665726e616e6365000000000000000000000081525081565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561048957506bffffffffffffffffffffffff6104ae565b6104ab8360405180606001604052806026815260200161303f60269139611866565b90505b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff891680855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff861617905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610548908590612f31565b60405180910390a360019150505b92915050565b60005481565b60405161056e906126fa565b604051809103902081565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602090815260408083203380855290835281842054825160608101909352602680845291936bffffffffffffffffffffffff9091169285926105e3928892919061303f90830139611866565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561062f57506bffffffffffffffffffffffff82811614155b1561070357600061065983836040518060600160405280603e8152602001613001603e91396118b8565b73ffffffffffffffffffffffffffffffffffffffff8981166000818152600360209081526040808320948a16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff86161790555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106f9908590612f31565b60405180910390a3505b61070e87878361191b565b5060019695505050505050565b60405161056e90612685565b60025481565b601281565b60015473ffffffffffffffffffffffffffffffffffffffff16331461078c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612b2e565b60405180910390fd5b6002544210156107c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612d43565b73ffffffffffffffffffffffffffffffffffffffff8216610815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612da0565b610823426301e13380611b87565b600281905550600061084d826040518060600160405280602381526020016131eb60239139611866565b9050610869610862600054600260ff16611bc6565b6064611c1a565b816bffffffffffffffffffffffff1611156108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612b8b565b60006108d66000546040518060600160405280602b8152602001613265602b9139611866565b90506108fb81836040518060600160405280602c8152602001612f8c602c9139611c66565b6bffffffffffffffffffffffff908116600090815573ffffffffffffffffffffffffffffffffffffffff861681526004602090815260409182902054825160608101909352602680845261095f949190911692869290919061323f90830139611c66565b73ffffffffffffffffffffffffffffffffffffffff851660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff959095169490941790935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109f3908690612f31565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff808516600090815260056020526040812054610a2d921684611cc1565b50505050565b6000610a578260405180606001604052806026815260200161306560269139611866565b9050610a633382611f08565b5050565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6301e1338081565b610aa133826120d0565b50565b60076020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600460205260409020546bffffffffffffffffffffffff1690565b600281565b6000438210610b32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612bc2565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205463ffffffff1680610b6d576000915050610556565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260066020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860181168552925290912054168310610c455773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490940163ffffffff168352929052205464010000000090046bffffffffffffffffffffffff169050610556565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260066020908152604080832083805290915290205463ffffffff16831015610c8d576000915050610556565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8163ffffffff168163ffffffff161115610d8157600282820363ffffffff16048103610cdd61242e565b5073ffffffffffffffffffffffffffffffffffffffff8716600090815260066020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046bffffffffffffffffffffffff169181019190915290871415610d5c576020015194506105569350505050565b805163ffffffff16871115610d7357819350610d7a565b6001820392505b5050610cb3565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260066020908152604080832063ffffffff909416835292905220546bffffffffffffffffffffffff6401000000009091041691505092915050565b6000610dfd826040518060600160405280602a8152602001613198602a9139611866565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020908152604080832033845282528083205481516060810190925260298083529495509293610e64936bffffffffffffffffffffffff16928692919061311f908301396118b8565b73ffffffffffffffffffffffffffffffffffffffff851660008181526003602090815260408083203380855292529182902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff86161790559051929350917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610eff908590612f31565b60405180910390a3610a2d8483611f08565b60086020526000908152604090205481565b6040518060400160405280600581526020017f464f52544800000000000000000000000000000000000000000000000000000081525081565b600080610f818360405180606001604052806027815260200161329060279139611866565b9050610f8e33858361191b565b5060019392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205463ffffffff1680610fd0576000611040565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b9392505050565b6000604051611055906126fa565b60408051918290038220828201909152601582527f416d706c65666f72746820476f7665726e616e636500000000000000000000006020909201919091527f8074a57fc3df0f85e9fde9508c19e931785a115c70c33d274f41a392070a74fc6110bc61217e565b306040516020016110d0949392919061288c565b60405160208183030381529060405280519060200120905060006040516110f69061276f565b604051908190038120611111918a908a908a9060200161285b565b6040516020818303038152906040528051906020012090506000828260405160200161113e92919061264f565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161117b94939291906128bd565b6020604051602081039080840390855afa15801561119d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612a3d565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600860205260409020805460018101909155891461127b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107839061294c565b874211156112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612e91565b6112bf818b6120d0565b505050505b505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86141561130957506bffffffffffffffffffffffff61132e565b61132b86604051806060016040528060258152602001612fdc60259139611866565b90505b600060405161133c906126fa565b60408051918290038220828201909152601582527f416d706c65666f72746820476f7665726e616e636500000000000000000000006020909201919091527f8074a57fc3df0f85e9fde9508c19e931785a115c70c33d274f41a392070a74fc6113a361217e565b306040516020016113b7949392919061288c565b60405160208183030381529060405280519060200120905060006040516113dd90612685565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff8d1660009081526008602090815292902080546001810190915561142c9391928e928e928e9290918e910161281a565b6040516020818303038152906040528051906020012090506000828260405160200161145992919061264f565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161149694939291906128bd565b6020604051602081039080840390855afa1580156114b8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612d0e565b8b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612e5a565b884211156115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612c1f565b84600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516116d79190612f31565b60405180910390a3505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526003602090815260408083209390941682529190915220546bffffffffffffffffffffffff1690565b60405161056e9061276f565b600660209081526000928352604080842090915290825290205463ffffffff81169064010000000090046bffffffffffffffffffffffff1682565b60015473ffffffffffffffffffffffffffffffffffffffff1633146117cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610783906129a9565b6001546040517f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f6916118179173ffffffffffffffffffffffffffffffffffffffff9091169084906127df565b60405180910390a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000816c0100000000000000000000000084106118b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b509192915050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff1611158290611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8316611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612ad1565b73ffffffffffffffffffffffffffffffffffffffff82166119b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612dfd565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020908152604091829020548251606081019093526037808452611a12936bffffffffffffffffffffffff90921692859291906130c0908301396118b8565b73ffffffffffffffffffffffffffffffffffffffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff968716179055928616825290829020548251606081019093526031808452611aa4949190911692859290919061320e90830139611c66565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff95909516949094179093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b3b908590612f31565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff808416600090815260056020526040808220548584168352912054611b8292918216911683611cc1565b505050565b600082820183811015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612a06565b600082611bd557506000610556565b82820282848281611be257fe5b0414611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612c54565b6000808211611c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612a9a565b818381611c5e57fe5b049392505050565b6000838301826bffffffffffffffffffffffff8087169083161015611cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d0b57506000816bffffffffffffffffffffffff16115b15611b825773ffffffffffffffffffffffffffffffffffffffff831615611e0e5773ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604081205463ffffffff169081611d65576000611dd5565b73ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b90506000611dfc82856040518060600160405280602981526020016131c2602991396118b8565b9050611e0a86848484612182565b5050505b73ffffffffffffffffffffffffffffffffffffffff821615611b825773ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604081205463ffffffff169081611e63576000611ed3565b73ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860163ffffffff16845290915290205464010000000090046bffffffffffffffffffffffff165b90506000611efa82856040518060600160405280602881526020016130f760289139611c66565b90506112c485848484612182565b73ffffffffffffffffffffffffffffffffffffffff8216611f55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390612cb1565b6000611f7b60005460405180606001604052806028815260200161317060289139611866565b9050611fa08183604051806060016040528060288152602001613148602891396118b8565b6bffffffffffffffffffffffff908116600090815573ffffffffffffffffffffffffffffffffffffffff85168152600460209081526040918290205482516060810190935260248084526120049491909116928692909190612fb8908301396118b8565b73ffffffffffffffffffffffffffffffffffffffff841660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff959095169490941790935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612095908690612f31565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff808416600090815260056020526040812054611b8292169084611cc1565b73ffffffffffffffffffffffffffffffffffffffff808316600081815260056020818152604080842080546004845282862054949093528787167fffffffffffffffffffffffff000000000000000000000000000000000000000084168117909155905191909516946bffffffffffffffffffffffff9092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610a2d828483611cc1565b4690565b60006121a64360405180606001604052806035815260200161308b603591396123ec565b905060008463ffffffff1611801561221a575073ffffffffffffffffffffffffffffffffffffffff8516600090815260066020908152604080832063ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8901811685529252909120548282169116145b156122b95773ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff880163ffffffff168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff166401000000006bffffffffffffffffffffffff851602179055612395565b60408051808201825263ffffffff80841682526bffffffffffffffffffffffff808616602080850191825273ffffffffffffffffffffffffffffffffffffffff8b166000818152600683528781208c871682528352878120965187549451909516640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff9587167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000958616179590951694909417909555938252600790935292909220805460018801909316929091169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516123dd929190612f4a565b60405180910390a25050505050565b60008164010000000084106118b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078391906128db565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461055657600080fd5b803560ff8116811461055657600080fd5b60006020828403121561248b578081fd5b6110408383612445565b600080604083850312156124a7578081fd5b6124b18484612445565b91506124c08460208501612445565b90509250929050565b6000806000606084860312156124dd578081fd5b83356124e881612f69565b925060208401356124f881612f69565b929592945050506040919091013590565b600080600080600080600060e0888a031215612523578283fd5b61252d8989612445565b965061253c8960208a01612445565b955060408801359450606088013593506125598960808a01612469565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612587578182fd5b6125918484612445565b946020939093013593505050565b60008060008060008060c087890312156125b7578182fd5b6125c18888612445565b955060208701359450604087013593506125de8860608901612469565b92506080870135915060a087013590509295509295509295565b6000806040838503121561260a578182fd5b6126148484612445565b9150602083013563ffffffff8116811461262c578182fd5b809150509250929050565b600060208284031215612648578081fd5b5035919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b7f5065726d69742861646472657373206f776e65722c616464726573732073706581527f6e6465722c75696e743235362076616c75652c75696e74323536206e6f6e636560208201527f2c75696e7432353620646561646c696e65290000000000000000000000000000604082015260520190565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201527f6374290000000000000000000000000000000000000000000000000000000000604082015260430190565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845273ffffffffffffffffffffffffffffffffffffffff9290921660208401526040830152606082015260800190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015612907578581018301518582016040015282016128eb565b818111156129185783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526023908201527f466f7274683a3a64656c656761746542795369673a20696e76616c6964206e6f60408201527f6e63650000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603f908201527f466f7274683a3a7365744d696e7465723a206f6e6c7920746865206d696e746560408201527f722063616e206368616e676520746865206d696e746572206164647265737300606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f466f7274683a3a64656c656761746542795369673a20696e76616c696420736960408201527f676e617475726500000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252603d908201527f466f7274683a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460408201527f72616e736665722066726f6d20746865207a65726f2061646472657373000000606082015260800190565b60208082526025908201527f466f7274683a3a6d696e743a206f6e6c7920746865206d696e7465722063616e60408201527f206d696e74000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f466f7274683a3a6d696e743a206578636565646564206d696e74206361700000604082015260600190565b60208082526028908201527f466f7274683a3a6765745072696f72566f7465733a206e6f742079657420646560408201527f7465726d696e6564000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f466f7274683a3a7065726d69743a207369676e61747572652065787069726564604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f466f7274683a3a5f6275726e3a206275726e2066726f6d20746865207a65726f60408201527f2061646472657373000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f466f7274683a3a7065726d69743a20696e76616c6964207369676e6174757265604082015260600190565b60208082526024908201527f466f7274683a3a6d696e743a206d696e74696e67206e6f7420616c6c6f77656460408201527f2079657400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f466f7274683a3a6d696e743a2063616e6e6f74207472616e7366657220746f2060408201527f746865207a65726f206164647265737300000000000000000000000000000000606082015260800190565b6020808252603b908201527f466f7274683a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460408201527f72616e7366657220746f20746865207a65726f20616464726573730000000000606082015260800190565b6020808252601b908201527f466f7274683a3a7065726d69743a20756e617574686f72697a65640000000000604082015260600190565b60208082526027908201527f466f7274683a3a64656c656761746542795369673a207369676e61747572652060408201527f6578706972656400000000000000000000000000000000000000000000000000606082015260800190565b63ffffffff91909116815260200190565b63ffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b60ff91909116815260200190565b6bffffffffffffffffffffffff91909116815260200190565b6bffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff81168114610aa157600080fdfe466f7274683a3a6d696e743a206e657720746f74616c537570706c7920657863656564732039362062697473466f7274683a3a5f6275726e3a20616d6f756e7420657863656564732062616c616e6365466f7274683a3a7065726d69743a20616d6f756e7420657863656564732039362062697473466f7274683a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365466f7274683a3a617070726f76653a20616d6f756e7420657863656564732039362062697473466f7274683a3a6275726e3a20726177416d6f756e7420657863656564732039362062697473466f7274683a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473466f7274683a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e6365466f7274683a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773466f7274683a3a6275726e46726f6d3a20616d6f756e74206578636565647320616c6c6f77616e6365466f7274683a3a5f6275726e3a20616d6f756e74206578636565647320746f74616c537570706c79466f7274683a3a5f6275726e3a206f6c6420737570706c7920657863656564732039362062697473466f7274683a3a6275726e46726f6d3a20726177416d6f756e7420657863656564732039362062697473466f7274683a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773466f7274683a3a6d696e743a20616d6f756e7420657863656564732039362062697473466f7274683a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f7773466f7274683a3a6d696e743a207472616e7366657220616d6f756e74206f766572666c6f7773466f7274683a3a6d696e74206f6c6420746f74616c537570706c7920657863656564732039362062697473466f7274683a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473a2646970667358221220376a63168431a84cde2cf43ad7ea14e0ca7fe5764590ce9816da322a9f7a32ae64736f6c634300060b0033

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

000000000000000000000000fe2321d7dfa492dfc39330e8b85e7c49161e7f98000000000000000000000000a847dc227d3f3e86fa01406279c1e88cb6950c3a0000000000000000000000000000000000000000000000000000000062464080

-----Decoded View---------------
Arg [0] : account (address): 0xfe2321D7DFA492dFC39330e8b85E7c49161e7F98
Arg [1] : minter_ (address): 0xa847dc227D3F3e86Fa01406279C1E88cb6950c3A
Arg [2] : mintingAllowedAfter_ (uint256): 1648771200

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000fe2321d7dfa492dfc39330e8b85e7c49161e7f98
Arg [1] : 000000000000000000000000a847dc227d3f3e86fa01406279c1e88cb6950c3a
Arg [2] : 0000000000000000000000000000000000000000000000000000000062464080


Deployed Bytecode Sourcemap

127:18718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;197:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;619:21;;;:::i;:::-;;;;;;;:::i;8279:420::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;503:39::-;;;:::i;:::-;;;;;;;:::i;1809:122::-;;;:::i;11322:666::-;;;;;;:::i;:::-;;:::i;2226:137::-;;;:::i;707:31::-;;;:::i;407:35::-;;;:::i;:::-;;;;;;;:::i;4473:1129::-;;;;;;:::i;:::-;;:::i;:::-;;5733:169;;;;;;:::i;:::-;;:::i;1274:45::-;;;;;;:::i;:::-;;:::i;788:61::-;;;:::i;:::-;;;;;;;:::i;12130:100::-;;;;;;:::i;:::-;;:::i;1690:49::-;;;;;;:::i;:::-;;:::i;10424:106::-;;;;;;:::i;:::-;;:::i;941:33::-;;;:::i;14271:1187::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6133:460::-;;;;;;:::i;:::-;;:::i;2441:39::-;;;;;;:::i;:::-;;:::i;308:::-;;;:::i;10786:235::-;;;;;;:::i;:::-;;:::i;13630:219::-;;;;;;:::i;:::-;;:::i;12653:783::-;;;;;;:::i;:::-;;:::i;9177:1051::-;;;;;;:::i;:::-;;:::i;7677:134::-;;;;;;:::i;:::-;;:::i;2022:117::-;;;:::i;1554:70::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4076:229::-;;;;;;:::i;:::-;;:::i;197:53::-;;;;;;;;;;;;;;;;;;;:::o;619:21::-;;;;;;:::o;8279:420::-;8347:4;8363:13;8403:14;8390:9;:27;8386:182;;;-1:-1:-1;8442:16:0;8386:182;;;8498:59;8505:9;8498:59;;;;;;;;;;;;;;;;;:6;:59::i;:::-;8489:68;;8386:182;8589:10;8578:22;;;;:10;:22;;;;;;;;;:31;;;;;;;;;;;:40;;;;;;;;;;8634:37;;8578:31;;8589:10;8634:37;;;;8578:40;;8634:37;:::i;:::-;;;;;;;;8688:4;8681:11;;;8279:420;;;;;:::o;503:39::-;;;;:::o;1809:122::-;1851:80;;;;;:::i;:::-;;;;;;;;1809:122;:::o;11322:666::-;11484:15;;;11404:4;11484:15;;;:10;:15;;;;;;;;11438:10;11484:24;;;;;;;;;;11534:59;;;;;;;;;;;;11438:10;;11484:24;;;;;11404:4;;11534:59;;11541:9;;11534:59;;;;;;;:6;:59::i;:::-;11518:75;;11619:3;11608:14;;:7;:14;;;;:54;;;;-1:-1:-1;11646:16:0;11626:36;;;;;11608:54;11604:313;;;11678:19;11700:97;11706:16;11724:6;11700:97;;;;;;;;;;;;;;;;;:5;:97::i;:::-;11811:15;;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;;;;;;;;11870:36;11811:39;;-1:-1:-1;11811:24:0;;11870:36;;;;11811:39;;11870:36;:::i;:::-;;;;;;;;11604:313;;11927:33;11943:3;11948;11953:6;11927:15;:33::i;:::-;-1:-1:-1;11977:4:0;;11322:666;-1:-1:-1;;;;;;11322:666:0:o;2226:137::-;2268:95;;;;;:::i;707:31::-;;;;:::o;407:35::-;440:2;407:35;:::o;4473:1129::-;4557:6;;;;4543:10;:20;4535:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;4642:19;;4623:15;:38;;4615:87;;;;;;;;;;;;:::i;:::-;4720:17;;;4712:78;;;;;;;;;;;;:::i;:::-;4850:54;4863:15;837:12;4850;:54::i;:::-;4828:19;:76;;;;4942:13;4958:56;4965:9;4958:56;;;;;;;;;;;;;;;;;:6;:56::i;:::-;4942:72;;5042:53;5055:34;5068:11;;973:1;5055:34;;:12;:34::i;:::-;5091:3;5042:12;:53::i;:::-;5032:6;:63;;;;5024:106;;;;;;;;;;;;:::i;:::-;5140:13;5156:66;5163:11;;5156:66;;;;;;;;;;;;;;;;;:6;:66::i;:::-;5140:82;;5246:69;5252:6;5260;5246:69;;;;;;;;;;;;;;;;;:5;:69::i;:::-;5232:83;;;;:11;:83;;;5396:13;;;;;:8;:13;;;;;;;;;;5390:70;;;;;;;;;;;;;;5396:13;;;;;5411:6;;5390:70;;;;;;;;:5;:70::i;:::-;5374:13;;;;;;;:8;:13;;;;;;:86;;;;;;;;;;;;;;;;5475:33;;5374:13;;;5475:33;;;;5501:6;;5475:33;:::i;:::-;;;;;;;;5572:14;;;;5568:1;5572:14;;;:9;:14;;;;;;5545:50;;5572:14;5588:6;5545:14;:50::i;:::-;4473:1129;;;;:::o;5733:169::-;5785:13;5801:59;5808:9;5801:59;;;;;;;;;;;;;;;;;:6;:59::i;:::-;5785:75;;5870:25;5876:10;5888:6;5870:5;:25::i;:::-;5733:169;;:::o;1274:45::-;;;;;;;;;;;;;;;:::o;788:61::-;837:12;788:61;:::o;12130:100::-;12191:32;12201:10;12213:9;12191;:32::i;:::-;12130:100;:::o;1690:49::-;;;;;;;;;;;;;;;:::o;10424:106::-;10506:17;;10483:4;10506:17;;;:8;:17;;;;;;;;;10424:106::o;941:33::-;973:1;941:33;:::o;14271:1187::-;14350:6;14390:12;14376:11;:26;14368:79;;;;;;;;;;;;:::i;:::-;14480:23;;;14458:19;14480:23;;;:14;:23;;;;;;;;14517:17;14513:56;;14557:1;14550:8;;;;;14513:56;14626:20;;;;;;;:11;:20;;;;;;;;:38;14647:16;;;14626:38;;;;;;;;;:48;;:63;-1:-1:-1;14622:145:0;;14712:20;;;;;;;:11;:20;;;;;;;;14733:16;;;;;14712:38;;;;;;;;:44;;;;;;;-1:-1:-1;14705:51:0;;14622:145;14825:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;14821:86:0;;;14895:1;14888:8;;;;;14821:86;14917:12;14958:16;;;14984:418;14999:5;14991:13;;:5;:13;;;14984:418;;;15062:1;15045:13;;;15044:19;;;15036:27;;15104:20;;:::i;:::-;-1:-1:-1;15127:20:0;;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;15104:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15173:27;;15169:223;;;15227:8;;;;-1:-1:-1;15220:15:0;;-1:-1:-1;;;;15220:15:0;15169:223;15260:12;;:26;;;-1:-1:-1;15256:136:0;;;15314:6;15306:14;;15256:136;;;15376:1;15367:6;:10;15359:18;;15256:136;14984:418;;;;;-1:-1:-1;15418:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;;;;;-1:-1:-1;;14271:1187:0;;;;:::o;6133:460::-;6206:13;6222:63;6229:9;6222:63;;;;;;;;;;;;;;;;;:6;:63::i;:::-;6342:19;;;6296:25;6342:19;;;:10;:19;;;;;;;;6362:10;6342:31;;;;;;;;6336:91;;;;;;;;;;;;6206:79;;-1:-1:-1;6296:25:0;;6336:91;;6342:31;;;6206:79;;6336:91;;;;;;;:5;:91::i;:::-;6437:19;;;;;;;:10;:19;;;;;;;;6457:10;6437:31;;;;;;;;;:52;;;;;;;;;;6504:49;;6437:52;;-1:-1:-1;6457:10:0;6504:49;;;;6437:52;;6504:49;:::i;:::-;;;;;;;;6564:22;6570:7;6579:6;6564:5;:22::i;2441:39::-;;;;;;;;;;;;;:::o;308:::-;;;;;;;;;;;;;;;;;;;:::o;10786:235::-;10851:4;10867:13;10883:60;10890:9;10883:60;;;;;;;;;;;;;;;;;:6;:60::i;:::-;10867:76;;10953:40;10969:10;10981:3;10986:6;10953:15;:40::i;:::-;-1:-1:-1;11010:4:0;;10786:235;-1:-1:-1;;;10786:235:0:o;13630:219::-;13735:23;;;13695:6;13735:23;;;:14;:23;;;;;;;;13775:16;:67;;13841:1;13775:67;;;13794:20;;;;;;;:11;:20;;;;;;;;13815:16;;;13794:38;;;;;;;;;:44;;;;;;13775:67;13768:74;13630:219;-1:-1:-1;;;13630:219:0:o;12653:783::-;12768:23;1851:80;;;;;:::i;:::-;;;;;;;;;;12848:4;;;;;;;;;;;;;;;;;;12832:22;12856:12;:10;:12::i;:::-;12878:4;12804:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12794:91;;;;;;12768:117;;12895:18;2068:71;;;;;:::i;:::-;;;;;;;;;12926:57;;12958:9;;12969:5;;12976:6;;12926:57;;;:::i;:::-;;;;;;;;;;;;;12916:68;;;;;;12895:89;;12994:14;13050:15;13067:10;13021:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13011:68;;;;;;12994:85;;13089:17;13109:26;13119:6;13127:1;13130;13133;13109:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13109:26:0;;;;;;-1:-1:-1;;13153:23:0;;;13145:75;;;;;;;;;;;;:::i;:::-;13247:17;;;;;;;:6;:17;;;;;:19;;;;;;;;13238:28;;13230:76;;;;;;;;;;;;:::i;:::-;13331:6;13324:3;:13;;13316:65;;;;;;;;;;;;:::i;:::-;13398:31;13408:9;13419;13398;:31::i;:::-;13391:38;;;;12653:783;;;;;;;:::o;9177:1051::-;9306:13;9346:14;9333:9;:27;9329:181;;;-1:-1:-1;9385:16:0;9329:181;;;9441:58;9448:9;9441:58;;;;;;;;;;;;;;;;;:6;:58::i;:::-;9432:67;;9329:181;9520:23;1851:80;;;;;:::i;:::-;;;;;;;;;;9600:4;;;;;;;;;;;;;;;;;;9584:22;9608:12;:10;:12::i;:::-;9630:4;9556:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9546:91;;;;;;9520:117;;9647:18;2268:95;;;;;:::i;:::-;;;;;;;;;;9733:13;;;;;;;:6;:13;;;;;;;:15;;;;;;;;9678:81;;2268:95;;9706:5;;9713:7;;9722:9;;9733:15;;9750:8;;9678:81;;:::i;:::-;;;;;;;;;;;;;9668:92;;;;;;9647:113;;9770:14;9826:15;9843:10;9797:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9787:68;;;;;;9770:85;;9865:17;9885:26;9895:6;9903:1;9906;9909;9885:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9885:26:0;;;;;;-1:-1:-1;;9929:23:0;;;9921:68;;;;;;;;;;;;:::i;:::-;10020:5;10007:18;;:9;:18;;;9999:58;;;;;;;;;;;;:::i;:::-;10082:8;10075:3;:15;;10067:60;;;;;;;;;;;;:::i;:::-;10167:6;10138:10;:17;10149:5;10138:17;;;;;;;;;;;;;;;:26;10156:7;10138:26;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;10205:7;10189:32;;10198:5;10189:32;;;10214:6;10189:32;;;;;;:::i;:::-;;;;;;;;9177:1051;;;;;;;;;;;;:::o;7677:134::-;7776:19;;;;7753:4;7776:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;;;7677:134::o;2022:117::-;2068:71;;;;;:::i;1554:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4076:229::-;4153:6;;;;4139:10;:20;4131:96;;;;;;;;;;;;:::i;:::-;4256:6;;4242:30;;;;;;4256:6;;;;;4264:7;;4242:30;:::i;:::-;;;;;;;;4282:6;:16;;;;;;;;;;;;;;;4076:229::o;18172:158::-;18247:6;18284:12;18277:5;18273:9;;18265:32;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18321:1:0;;18172:158;-1:-1:-1;;18172:158:0:o;18526:162::-;18612:6;18643:1;18638:6;;:1;:6;;;;18646:12;18630:29;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;18676:5:0;;;18526:162::o;15837:609::-;15930:17;;;15922:91;;;;;;;;;;;;:::i;:::-;16031:17;;;16023:89;;;;;;;;;;;;:::i;:::-;16145:13;;;;;;;:8;:13;;;;;;;;;;16139:87;;;;;;;;;;;;;;16145:13;;;;;16160:6;;16139:87;;;;;;;:5;:87::i;:::-;16123:13;;;;;;;;:8;:13;;;;;;;;:103;;;;;;;;;;;16258:13;;;;;;;;;;16252:81;;;;;;;;;;;;;;16258:13;;;;;16273:6;;16252:81;;;;;;;;:5;:81::i;:::-;16236:13;;;;;;;;:8;:13;;;;;;;:97;;;;;;;;;;;;;;;;16348:26;;;;;;;;;;16367:6;;16348:26;:::i;:::-;;;;;;;;16400:14;;;;;;;;:9;:14;;;;;;;16416;;;;;;;;16385:54;;16400:14;;;;16416;16432:6;16385:14;:54::i;:::-;15837:609;;;:::o;2690:175:1:-;2748:7;2779:5;;;2802:6;;;;2794:46;;;;;;;;;;;;:::i;3538:215::-;3596:7;3619:6;3615:20;;-1:-1:-1;3634:1:1;3627:8;;3615:20;3657:5;;;3661:1;3657;:5;:1;3680:5;;;;;:10;3672:56;;;;;;;;;;;;:::i;4217:150::-;4275:7;4306:1;4302;:5;4294:44;;;;;;;;;;;;:::i;:::-;4359:1;4355;:5;;;;;;;4217:150;-1:-1:-1;;;4217:150:1:o;18336:184:0:-;18422:6;18451:5;;;18482:12;18474:6;;;;;;;;;18466:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18512:1:0;18336:184;-1:-1:-1;;;;18336:184:0:o;16452:925::-;16556:6;16546:16;;:6;:16;;;;:30;;;;;16575:1;16566:6;:10;;;16546:30;16542:829;;;16596:20;;;;16592:378;;16655:22;;;16636:16;16655:22;;;:14;:22;;;;;;;;;16714:13;:60;;16773:1;16714:60;;;16730:19;;;;;;;:11;:19;;;;;;;;16750:13;;;16730:34;;;;;;;;;:40;;;;;;16714:60;16695:79;;16792:16;16811:69;16817:9;16828:6;16811:69;;;;;;;;;;;;;;;;;:5;:69::i;:::-;16792:88;;16898:57;16915:6;16923:9;16934;16945;16898:16;:57::i;:::-;16592:378;;;;16988:20;;;;16984:377;;17047:22;;;17028:16;17047:22;;;:14;:22;;;;;;;;;17106:13;:60;;17165:1;17106:60;;;17122:19;;;;;;;:11;:19;;;;;;;;17142:13;;;17122:34;;;;;;;;;:40;;;;;;17106:60;17087:79;;17184:16;17203:68;17209:9;17220:6;17203:68;;;;;;;;;;;;;;;;;:5;:68::i;:::-;17184:87;;17289:57;17306:6;17314:9;17325;17336;17289:16;:57::i;6809:572::-;6883:21;;;6875:74;;;;;;;;;;;;:::i;:::-;6960:13;6976:63;6983:11;;6976:63;;;;;;;;;;;;;;;;;:6;:63::i;:::-;6960:79;;7063:65;7069:6;7077;7063:65;;;;;;;;;;;;;;;;;:5;:65::i;:::-;7049:79;;;;:11;:79;;;7165:17;;;;;:8;:17;;;;;;;;;;7159:72;;;;;;;;;;;;;;7165:17;;;;;7184:6;;7159:72;;;;;;;;:5;:72::i;:::-;7139:17;;;;;;;:8;:17;;;;;;:92;;;;;;;;;;;;;;;;7246:37;;;;;;7276:6;;7246:37;:::i;:::-;;;;;;;;7335:18;;;;;;;;:9;:18;;;;;;7320:54;;7335:18;;7367:6;7320:14;:54::i;15464:367::-;15566:20;;;;15540:23;15566:20;;;:9;:20;;;;;;;;;;15622:8;:19;;;;;;15651:20;;;;:32;;;;;;;;;;;15699:54;;15566:20;;;;;15622:19;;;;;15651:32;;15566:20;;;15699:54;;15540:23;15699:54;15764:60;15779:15;15796:9;15807:16;15764:14;:60::i;18694:149::-;18802:9;18694:149;:::o;17383:619::-;17500:18;17521:77;17528:12;17521:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;17500:98;;17626:1;17611:12;:16;;;:85;;;;-1:-1:-1;17631:22:0;;;;;;;:11;:22;;;;;;;;:65;17654:16;;;17631:40;;;;;;;;;:50;:65;;;:50;;:65;17611:85;17607:324;;;17710:22;;;;;;;:11;:22;;;;;;;;17733:16;;;17710:40;;;;;;;;;:57;;;;;;;;;;;;17607:324;;;17833:33;;;;;;;;;;;;;;;;;;;;;;;;;17794:22;;;-1:-1:-1;17794:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17878:25;;;:14;:25;;;;;;;:44;;17794:72;17906:16;;17878:44;;;;;;;;;;;;;17607:324;17965:9;17944:51;;;17976:8;17986;17944:51;;;;;;;:::i;:::-;;;;;;;;17383:619;;;;;:::o;18008:158::-;18083:6;18120:12;18113:5;18109:9;;18101:32;;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;30508:42;30497:54;;31571:35;;31561:2;;31620:1;;31610:12;551:126;616:20;;30808:4;30797:16;;32063:33;;32053:2;;32110:1;;32100:12;684:241;;788:2;776:9;767:7;763:23;759:32;756:2;;;-1:-1;;794:12;756:2;856:53;901:7;877:22;856:53;:::i;932:366::-;;;1053:2;1041:9;1032:7;1028:23;1024:32;1021:2;;;-1:-1;;1059:12;1021:2;1121:53;1166:7;1142:22;1121:53;:::i;:::-;1111:63;;1229:53;1274:7;1211:2;1254:9;1250:22;1229:53;:::i;:::-;1219:63;;1015:283;;;;;:::o;1305:491::-;;;;1443:2;1431:9;1422:7;1418:23;1414:32;1411:2;;;-1:-1;;1449:12;1411:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1501:63;-1:-1;1601:2;1640:22;;72:20;97:33;72:20;97:33;:::i;:::-;1405:391;;1609:63;;-1:-1;;;1709:2;1748:22;;;;346:20;;1405:391::o;1803:991::-;;;;;;;;2007:3;1995:9;1986:7;1982:23;1978:33;1975:2;;;-1:-1;;2014:12;1975:2;2076:53;2121:7;2097:22;2076:53;:::i;:::-;2066:63;;2184:53;2229:7;2166:2;2209:9;2205:22;2184:53;:::i;:::-;2174:63;;2274:2;2317:9;2313:22;346:20;2282:63;;2382:2;2425:9;2421:22;346:20;2390:63;;2509:51;2552:7;2490:3;2532:9;2528:22;2509:51;:::i;:::-;2499:61;;2597:3;2641:9;2637:22;209:20;2606:63;;2706:3;2750:9;2746:22;209:20;2715:63;;1969:825;;;;;;;;;;:::o;2801:366::-;;;2922:2;2910:9;2901:7;2897:23;2893:32;2890:2;;;-1:-1;;2928:12;2890:2;2990:53;3035:7;3011:22;2990:53;:::i;:::-;2980:63;3080:2;3119:22;;;;346:20;;-1:-1;;;2884:283::o;3174:865::-;;;;;;;3361:3;3349:9;3340:7;3336:23;3332:33;3329:2;;;-1:-1;;3368:12;3329:2;3430:53;3475:7;3451:22;3430:53;:::i;:::-;3420:63;;3520:2;3563:9;3559:22;346:20;3528:63;;3628:2;3671:9;3667:22;346:20;3636:63;;3754:51;3797:7;3736:2;3777:9;3773:22;3754:51;:::i;:::-;3744:61;;3842:3;3886:9;3882:22;209:20;3851:63;;3951:3;3995:9;3991:22;209:20;3960:63;;3323:716;;;;;;;;:::o;4046:364::-;;;4166:2;4154:9;4145:7;4141:23;4137:32;4134:2;;;-1:-1;;4172:12;4134:2;4234:53;4279:7;4255:22;4234:53;:::i;:::-;4224:63;;4324:2;4366:9;4362:22;482:20;30714:10;31969:5;30703:22;31945:5;31942:34;31932:2;;-1:-1;;31980:12;31932:2;4332:62;;;;4128:282;;;;;:::o;4417:241::-;;4521:2;4509:9;4500:7;4496:23;4492:32;4489:2;;;-1:-1;;4527:12;4489:2;-1:-1;346:20;;4483:175;-1:-1;4483:175::o;14672:659::-;6615:66;6595:87;;6580:1;6701:11;;4967:37;;;;15183:12;;;4967:37;15294:12;;;14917:414::o;15338:381::-;8486:34;8466:55;;8555:34;8550:2;8541:12;;8534:56;8624:20;8619:2;8610:12;;8603:42;8450:2;8664:12;;15527:192::o;15726:381::-;10095:34;10075:55;;10164:34;10159:2;10150:12;;10143:56;10233:5;10228:2;10219:12;;10212:27;10059:2;10258:12;;15915:192::o;16114:381::-;13545:34;13525:55;;13614:28;13609:2;13600:12;;13593:50;13509:2;13662:12;;16303:192::o;16502:222::-;30508:42;30497:54;;;;4736:37;;16629:2;16614:18;;16600:124::o;16731:333::-;30508:42;30497:54;;;4736:37;;30497:54;;17050:2;17035:18;;4736:37;16886:2;16871:18;;16857:207::o;17071:210::-;30330:13;;30323:21;4850:34;;17192:2;17177:18;;17163:118::o;17288:222::-;4967:37;;;17415:2;17400:18;;17386:124::o;17517:780::-;4967:37;;;30508:42;30497:54;;;17949:2;17934:18;;4736:37;30497:54;;;;18032:2;18017:18;;4736:37;18115:2;18100:18;;4967:37;18198:3;18183:19;;4967:37;;;;18282:3;18267:19;;4967:37;17784:3;17769:19;;17755:542::o;18304:556::-;4967:37;;;30508:42;30497:54;;;;18680:2;18665:18;;4736:37;18763:2;18748:18;;4967:37;18846:2;18831:18;;4967:37;18515:3;18500:19;;18486:374::o;18867:556::-;4967:37;;;19243:2;19228:18;;4967:37;;;;19326:2;19311:18;;4967:37;30508:42;30497:54;19409:2;19394:18;;4736:37;19078:3;19063:19;;19049:374::o;19430:548::-;4967:37;;;30808:4;30797:16;;;;19798:2;19783:18;;14377:35;19881:2;19866:18;;4967:37;19964:2;19949:18;;4967:37;19637:3;19622:19;;19608:370::o;19985:310::-;;20132:2;;20153:17;20146:47;5320:5;29799:12;29956:6;20132:2;20121:9;20117:18;29944:19;-1:-1;31122:101;31136:6;31133:1;31130:13;31122:101;;;31203:11;;;;;31197:18;31184:11;;;29984:14;31184:11;31177:39;31151:10;;31122:101;;;31238:6;31235:1;31232:13;31229:2;;;-1:-1;29984:14;31294:6;20121:9;31285:16;;31278:27;31229:2;-1:-1;31495:2;31475:14;31491:7;31471:28;5478:39;;;;29984:14;5478:39;;20103:192;-1:-1;;;20103:192::o;20302:416::-;20502:2;20516:47;;;5754:2;20487:18;;;29944:19;5790:34;29984:14;;;5770:55;5859:5;5845:12;;;5838:27;5884:12;;;20473:245::o;20725:416::-;20925:2;20939:47;;;6135:2;20910:18;;;29944:19;6171:34;29984:14;;;6151:55;6240:33;6226:12;;;6219:55;6293:12;;;20896:245::o;21148:416::-;21348:2;21362:47;;;6951:2;21333:18;;;29944:19;6987:29;29984:14;;;6967:50;7036:12;;;21319:245::o;21571:416::-;21771:2;21785:47;;;7287:2;21756:18;;;29944:19;7323:34;29984:14;;;7303:55;7392:9;7378:12;;;7371:31;7421:12;;;21742:245::o;21994:416::-;22194:2;22208:47;;;7672:2;22179:18;;;29944:19;7708:28;29984:14;;;7688:49;7756:12;;;22165:245::o;22417:416::-;22617:2;22631:47;;;8007:2;22602:18;;;29944:19;8043:34;29984:14;;;8023:55;8112:31;8098:12;;;8091:53;8163:12;;;22588:245::o;22840:416::-;23040:2;23054:47;;;8915:2;23025:18;;;29944:19;8951:34;29984:14;;;8931:55;9020:7;9006:12;;;8999:29;9047:12;;;23011:245::o;23263:416::-;23463:2;23477:47;;;9298:2;23448:18;;;29944:19;9334:32;29984:14;;;9314:53;9386:12;;;23434:245::o;23686:416::-;23886:2;23900:47;;;9637:2;23871:18;;;29944:19;9673:34;29984:14;;;9653:55;9742:10;9728:12;;;9721:32;9772:12;;;23857:245::o;24109:416::-;24309:2;24323:47;;;24294:18;;;29944:19;10545:34;29984:14;;;10525:55;10599:12;;;24280:245::o;24532:416::-;24732:2;24746:47;;;10850:2;24717:18;;;29944:19;10886:34;29984:14;;;10866:55;10955:3;10941:12;;;10934:25;10978:12;;;24703:245::o;24955:416::-;25155:2;25169:47;;;11229:2;25140:18;;;29944:19;11265:34;29984:14;;;11245:55;11334:10;11320:12;;;11313:32;11364:12;;;25126:245::o;25378:416::-;25578:2;25592:47;;;25563:18;;;29944:19;11651:34;29984:14;;;11631:55;11705:12;;;25549:245::o;25801:416::-;26001:2;26015:47;;;11956:2;25986:18;;;29944:19;11992:34;29984:14;;;11972:55;12061:6;12047:12;;;12040:28;12087:12;;;25972:245::o;26224:416::-;26424:2;26438:47;;;12338:2;26409:18;;;29944:19;12374:34;29984:14;;;12354:55;12443:18;12429:12;;;12422:40;12481:12;;;26395:245::o;26647:416::-;26847:2;26861:47;;;12732:2;26832:18;;;29944:19;12768:34;29984:14;;;12748:55;12837:29;12823:12;;;12816:51;12886:12;;;26818:245::o;27070:416::-;27270:2;27284:47;;;13137:2;27255:18;;;29944:19;13173:29;29984:14;;;13153:50;13222:12;;;27241:245::o;27493:416::-;27693:2;27707:47;;;13913:2;27678:18;;;29944:19;13949:34;29984:14;;;13929:55;14018:9;14004:12;;;13997:31;14047:12;;;27664:245::o;28145:218::-;30714:10;30703:22;;;;14262:36;;28270:2;28255:18;;28241:122::o;28370:325::-;30714:10;30703:22;;;;14262:36;;30897:26;30886:38;28681:2;28666:18;;14624:36;28521:2;28506:18;;28492:203::o;28702:214::-;30808:4;30797:16;;;;14377:35;;28825:2;28810:18;;28796:120::o;28923:220::-;30897:26;30886:38;;;;14494:49;;29049:2;29034:18;;29020:123::o;29375:329::-;30897:26;30886:38;;;14494:49;;30886:38;;29690:2;29675:18;;14494:49;29528:2;29513:18;;29499:205::o;31512:117::-;30508:42;31599:5;30497:54;31574:5;31571:35;31561:2;;31620:1;;31610:12

Swarm Source

ipfs://376a63168431a84cde2cf43ad7ea14e0ca7fe5764590ce9816da322a9f7a32ae
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.