ETH Price: $3,078.37 (-1.23%)
Gas: 18 Gwei

Token

PRIMATE (PRIMATE)
 

Overview

Max Total Supply

2,060,000,000 PRIMATE

Holders

1,116 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000001 ETH

Onchain Market Cap

$9,511,102.40

Circulating Supply Market Cap

$901,933.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Market

Volume (24H):$31.47
Market Capitalization:$901,933.00
Circulating Supply:195,348,767.00 PRIMATE
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PrimateCoin

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File @animoca/ethereum-contracts-core/contracts/metatx/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6 <0.8.0;

/*
 * Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner.
 */
abstract contract ManagedIdentity {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


// File @animoca/ethereum-contracts-core/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-173 Contract Ownership Standard
 * Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface IERC173 {
    /**
     * Event emited when ownership of a contract changes.
     * @param previousOwner the previous owner.
     * @param newOwner the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * Set the address of the new owner of the contract
     * Set newOwner to address(0) to renounce any ownership.
     * @dev Emits an {OwnershipTransferred} event.
     * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership.
     */
    function transferOwnership(address newOwner) external;
}


// File @animoca/ethereum-contracts-core/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;


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

    /**
     * Initializes the contract, setting the deployer as the initial owner.
     * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event.
     */
    constructor(address owner_) {
        _owner = owner_;
        emit OwnershipTransferred(address(0), owner_);
    }

    /**
     * Gets the address of the current contract owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * See {IERC173-transferOwnership(address)}
     * @dev Reverts if the sender is not the current contract owner.
     * @param newOwner the address of the new owner. Use the zero address to renounce the ownership.
     */
    function transferOwnership(address newOwner) public virtual override {
        _requireOwnership(_msgSender());
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    /**
     * @dev Reverts if `account` is not the contract owner.
     * @param account the account to test.
     */
    function _requireOwnership(address account) internal virtual {
        require(account == this.owner(), "Ownable: not the owner");
    }
}


// File @animoca/ethereum-contracts-core/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Upgrades the address type to check if it is a contract.
 */
library AddressIsContract {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}


// File @animoca/ethereum-contracts-core/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20Wrapper
 * Wraps ERC20 functions to support non-standard implementations which do not return a bool value.
 * Calls to the wrapped functions revert only if they throw or if they return false.
 */
library ERC20Wrapper {
    using AddressIsContract for address;

    function wrappedTransfer(
        IWrappedERC20 token,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function wrappedTransferFrom(
        IWrappedERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function wrappedApprove(
        IWrappedERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal {
        address target = address(token);
        require(target.isContract(), "ERC20Wrapper: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = target.call(callData);
        if (success) {
            if (data.length != 0) {
                require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed");
            }
        } else {
            // revert using a standard revert message
            if (data.length == 0) {
                revert("ERC20Wrapper: operation failed");
            }

            // revert using the revert message coming from the call
            assembly {
                let size := mload(data)
                revert(add(32, data), size)
            }
        }
    }
}

interface IWrappedERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);
}


// File @animoca/ethereum-contracts-core/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;



abstract contract Recoverable is ManagedIdentity, Ownable {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens
     * so that the extraction is limited to only amounts sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length.
     * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function.
     * @dev Reverts if one of the ERC20 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param tokens the list of ERC20 token addresses.
     * @param amounts the list of token amounts to transfer.
     */
    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]);
        }
    }

    /**
     * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens
     * so that the extraction is limited to only tokens sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length.
     * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function.
     * @dev Reverts if one of the ERC721 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param contracts the list of ERC721 contract addresses.
     * @param tokenIds the list of token ids to transfer.
     */
    function recoverERC721s(
        address[] calldata accounts,
        address[] calldata contracts,
        uint256[] calldata tokenIds
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface IRecoverableERC721 {
    /// See {IERC721-transferFrom(address,address,uint256)}
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}


// File @animoca/ethereum-contracts-core/contracts/introspection/[email protected]

pragma solidity >=0.7.6 <0.8.0;

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


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, basic interface.
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * @dev Note: The ERC-165 identifier for this interface is 0x36372b07.
 */
interface IERC20 {
    /**
     * @dev Emitted when tokens are transferred, including zero value transfers.
     * @param _from The account where the transferred tokens are withdrawn from.
     * @param _to The account where the transferred tokens are deposited to.
     * @param _value The amount of tokens being transferred.
     */
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    /**
     * @dev Emitted when a successful call to {IERC20-approve(address,uint256)} is made.
     * @param _owner The account granting an allowance to `_spender`.
     * @param _spender The account being granted an allowance from `_owner`.
     * @param _value The allowance amount being granted.
     */
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    /**
     * @notice Returns the total token supply.
     * @return The total token supply.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @notice Returns the account balance of another account with address `owner`.
     * @param owner The account whose balance will be returned.
     * @return The account balance of another account with address `owner`.
     */
    function balanceOf(address owner) external view returns (uint256);

    /**
     * Transfers `value` amount of tokens to address `to`.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender does not have enough balance.
     * @dev Emits an {IERC20-Transfer} event.
     * @dev Transfers of 0 values are treated as normal transfers and fire the {IERC20-Transfer} event.
     * @param to The receiver account.
     * @param value The amount of tokens to transfer.
     * @return True if the transfer succeeds, false otherwise.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @notice Transfers `value` amount of tokens from address `from` to address `to`.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `from` does not have at least `value` of balance.
     * @dev Reverts if the sender is not `from` and has not been approved by `from` for at least `value`.
     * @dev Emits an {IERC20-Transfer} event.
     * @dev Transfers of 0 values are treated as normal transfers and fire the {IERC20-Transfer} event.
     * @param from The emitter account.
     * @param to The receiver account.
     * @param value The amount of tokens to transfer.
     * @return True if the transfer succeeds, false otherwise.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    /**
     * Sets `value` as the allowance from the caller to `spender`.
     *  IMPORTANT: Beware that changing an allowance with this method brings the risk
     *  that someone may use both the old and the new allowance by unfortunate
     *  transaction ordering. One possible solution to mitigate this race
     *  condition is to first reduce the spender's allowance to 0 and set the
     *  desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @dev Reverts if `spender` is the zero address.
     * @dev Emits the {IERC20-Approval} event.
     * @param spender The account being granted the allowance by the message caller.
     * @param value The allowance amount to grant.
     * @return True if the approval succeeds, false otherwise.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * Returns the amount which `spender` is allowed to spend on behalf of `owner`.
     * @param owner The account that has granted an allowance to `spender`.
     * @param spender The account that was granted an allowance by `owner`.
     * @return The amount which `spender` is allowed to spend on behalf of `owner`.
     */
    function allowance(address owner, address spender) external view returns (uint256);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Detailed.
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * @dev Note: the ERC-165 identifier for this interface is 0xa219a025.
 */
interface IERC20Detailed {
    /**
     * Returns the name of the token. E.g. "My Token".
     * @return The name of the token.
     */
    function name() external view returns (string memory);

    /**
     * Returns the symbol of the token. E.g. "HIX".
     * @return The symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * Returns the number of decimals used to display the balances.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.
     *
     * @dev Note: This information is only used for _display_ purposes: it does  not impact the arithmetic of the contract.
     * @return The number of decimals used to display the balances.
     */
    function decimals() external view returns (uint8);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Allowance.
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * @dev Note: the ERC-165 identifier for this interface is 0x9d075186.
 */
interface IERC20Allowance {
    /**
     * Increases the allowance granted by the sender to `spender` by `value`.
     *  This is an alternative to {approve} that can be used as a mitigation for
     *  problems described in {IERC20-approve}.
     * @dev Reverts if `spender` is the zero address.
     * @dev Reverts if `spender`'s allowance overflows.
     * @dev Emits an {IERC20-Approval} event with an updated allowance for `spender`.
     * @param spender The account whose allowance is being increased by the message caller.
     * @param value The allowance amount increase.
     * @return True if the allowance increase succeeds, false otherwise.
     */
    function increaseAllowance(address spender, uint256 value) external returns (bool);

    /**
     * Decreases the allowance granted by the sender to `spender` by `value`.
     *  This is an alternative to {approve} that can be used as a mitigation for
     *  problems described in {IERC20-approve}.
     * @dev Reverts if `spender` is the zero address.
     * @dev Reverts if `spender` has an allowance with the message caller for less than `value`.
     * @dev Emits an {IERC20-Approval} event with an updated allowance for `spender`.
     * @param spender The account whose allowance is being decreased by the message caller.
     * @param value The allowance amount decrease.
     * @return True if the allowance decrease succeeds, false otherwise.
     */
    function decreaseAllowance(address spender, uint256 value) external returns (bool);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Safe Transfers.
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.
 */
interface IERC20SafeTransfers {
    /**
     * Transfers tokens from the caller to `to`. If this address is a contract, then calls `onERC20Received(address,address,uint256,bytes)` on it.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `value` is greater than the sender's balance.
     * @dev Reverts if `to` is a contract which does not implement `onERC20Received(address,address,uint256,bytes)`.
     * @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` returns a wrong value.
     * @dev Emits an {IERC20-Transfer} event.
     * @param to The address for the tokens to be transferred to.
     * @param amount The amount of tokens to be transferred.
     * @param data Optional additional data with no specified format, to be passed to the receiver contract.
     * @return true.
     */
    function safeTransfer(
        address to,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);

    /**
     * Transfers tokens from `from` to another address, using the allowance mechanism.
     *  If this address is a contract, then calls `onERC20Received(address,address,uint256,bytes)` on it.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `value` is greater than `from`'s balance.
     * @dev Reverts if the sender does not have at least `value` allowance by `from`.
     * @dev Reverts if `to` is a contract which does not implement `onERC20Received(address,address,uint256,bytes)`.
     * @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` returns a wrong value.
     * @dev Emits an {IERC20-Transfer} event.
     * @param from The address which owns the tokens to be transferred.
     * @param to The address for the tokens to be transferred to.
     * @param amount The amount of tokens to be transferred.
     * @param data Optional additional data with no specified format, to be passed to the receiver contract.
     * @return true.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Batch Transfers.
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.
 */
interface IERC20BatchTransfers {
    /**
     * Moves multiple `amounts` tokens from the caller's account to each of `recipients`.
     * @dev Reverts if `recipients` and `amounts` have different lengths.
     * @dev Reverts if one of `recipients` is the zero address.
     * @dev Reverts if the caller has an insufficient balance.
     * @dev Emits an {IERC20-Transfer} event for each individual transfer.
     * @param recipients the list of recipients to transfer the tokens to.
     * @param amounts the amounts of tokens to transfer to each of `recipients`.
     * @return a boolean value indicating whether the operation succeeded.
     */
    function batchTransfer(address[] calldata recipients, uint256[] calldata amounts) external returns (bool);

    /**
     * Moves multiple `amounts` tokens from an account to each of `recipients`.
     * @dev Reverts if `recipients` and `amounts` have different lengths.
     * @dev Reverts if one of `recipients` is the zero address.
     * @dev Reverts if `from` has an insufficient balance.
     * @dev Reverts if the sender is not `from` and has an insufficient allowance.
     * @dev Emits an {IERC20-Transfer} event for each individual transfer.
     * @dev Emits an {IERC20-Approval} event.
     * @param from The address which owns the tokens to be transferred.
     * @param recipients the list of recipients to transfer the tokens to.
     * @param amounts the amounts of tokens to transfer to each of `recipients`.
     * @return a boolean value indicating whether the operation succeeded.
     */
    function batchTransferFrom(
        address from,
        address[] calldata recipients,
        uint256[] calldata amounts
    ) external returns (bool);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, ERC1046 optional extension: Metadata.
 * @dev See https://eips.ethereum.org/EIPS/eip-1046
 * @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.
 */
interface IERC20Metadata {
    /**
     * Returns a distinct Uniform Resource Identifier (URI) for the token metadata.
     * @return a distinct Uniform Resource Identifier (URI) for the token metadata.
     */
    function tokenURI() external view returns (string memory);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, ERC2612 optional extension: permit – 712-signed approvals
 * Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.
 * @dev See https://eips.ethereum.org/EIPS/eip-2612
 * @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.
 */
interface IERC20Permit {
    /**
     * Sets `value` as the allowance of `spender` over the tokens of `owner`, given `owner` account's signed permit.
     * @dev WARNING: The standard ERC-20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114
     * @dev Reverts if `owner` is the zero address.
     * @dev Reverts if the current blocktime is > `deadline`.
     * @dev Reverts if `r`, `s`, and `v` is not a valid `secp256k1` signature from `owner`.
     * @dev Emits an {IERC20-Approval} event.
     * @param owner The token owner granting the allowance to `spender`.
     * @param spender The token spender being granted the allowance by `owner`.
     * @param value The token amount of the allowance.
     * @param deadline The deadline from which the permit signature is no longer valid.
     * @param v Permit signature v parameter
     * @param r Permit signature r parameter.
     * @param s Permis signature s parameter.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * Returns the current permit nonce of `owner`.
     * @param owner the address to check the nonce of.
     * @return the current permit nonce of `owner`.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * Returns the EIP-712 encoded hash struct of the domain-specific information for permits.
     *
     * @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:
     *
     *  keccak256(
     *      abi.encode(
     *          keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
     *          keccak256(bytes(name)),
     *          keccak256(bytes(version)),
     *          chainId,
     *          address(this)))
     *
     *  where
     *   - `name` (string) is the ERC-20 token name.
     *   - `version` (string) refers to the ERC-20 token contract version.
     *   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.
     *   - `verifyingContract` (address) is the ERC-20 token contract address.
     *
     * @return the EIP-712 encoded hash struct of the domain-specific information for permits.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/interfaces/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, Tokens Receiver.
 * Interface for any contract that wants to support safeTransfers from ERC20 contracts with Safe Transfers extension.
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.
 */
interface IERC20Receiver {
    /**
     * Handles the receipt of ERC20 tokens.
     * @param sender The initiator of the transfer.
     * @param from The address which transferred the tokens.
     * @param value The amount of tokens transferred.
     * @param data Optional additional data with no specified format.
     * @return bytes4 `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))`
     */
    function onERC20Received(
        address sender,
        address from,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);
}


// File @animoca/ethereum-contracts-assets/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;











/**
 * @title ERC20 Fungible Token Contract.
 */
contract ERC20 is
    ManagedIdentity,
    IERC165,
    IERC20,
    IERC20Detailed,
    IERC20Metadata,
    IERC20Allowance,
    IERC20BatchTransfers,
    IERC20SafeTransfers,
    IERC20Permit
{
    using AddressIsContract for address;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")
    bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    uint256 public immutable deploymentChainId;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 internal immutable _DOMAIN_SEPARATOR;

    /// @inheritdoc IERC20Permit
    mapping(address => uint256) public override nonces;

    string internal _name;
    string internal _symbol;
    uint8 internal immutable _decimals;
    string internal _tokenURI;

    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;
    uint256 internal _totalSupply;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_
    ) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;

        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        deploymentChainId = chainId;
        _DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId, bytes(name_));
    }

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == type(IERC20).interfaceId ||
            interfaceId == type(IERC20Detailed).interfaceId ||
            interfaceId == type(IERC20Metadata).interfaceId ||
            interfaceId == type(IERC20Allowance).interfaceId ||
            interfaceId == type(IERC20BatchTransfers).interfaceId ||
            interfaceId == type(IERC20SafeTransfers).interfaceId ||
            interfaceId == type(IERC20Permit).interfaceId;
    }

    //======================================================== ERC20 ========================================================//

    /// @inheritdoc IERC20
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /// @inheritdoc IERC20
    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    /// @inheritdoc IERC20
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /// @inheritdoc IERC20
    function approve(address spender, uint256 value) external virtual override returns (bool) {
        _approve(_msgSender(), spender, value);
        return true;
    }

    /// @inheritdoc IERC20
    function transfer(address to, uint256 value) external virtual override returns (bool) {
        _transfer(_msgSender(), to, value);
        return true;
    }

    /// @inheritdoc IERC20
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external virtual override returns (bool) {
        _transferFrom(_msgSender(), from, to, value);
        return true;
    }

    //==================================================== ERC20Detailed ====================================================//

    /// @inheritdoc IERC20Detailed
    function name() external view override returns (string memory) {
        return _name;
    }

    /// @inheritdoc IERC20Detailed
    function symbol() external view override returns (string memory) {
        return _symbol;
    }

    /// @inheritdoc IERC20Detailed
    function decimals() external view override returns (uint8) {
        return _decimals;
    }

    //==================================================== ERC20Metadata ====================================================//

    /// @inheritdoc IERC20Metadata
    function tokenURI() external view override returns (string memory) {
        return _tokenURI;
    }

    //=================================================== ERC20Allowance ====================================================//

    /// @inheritdoc IERC20Allowance
    function increaseAllowance(address spender, uint256 addedValue) external virtual override returns (bool) {
        require(spender != address(0), "ERC20: zero address spender");
        address owner = _msgSender();
        uint256 allowance_ = _allowances[owner][spender];
        if (addedValue != 0) {
            uint256 newAllowance = allowance_ + addedValue;
            require(newAllowance > allowance_, "ERC20: allowance overflow");
            _allowances[owner][spender] = newAllowance;
            allowance_ = newAllowance;
        }
        emit Approval(owner, spender, allowance_);

        return true;
    }

    /// @inheritdoc IERC20Allowance
    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual override returns (bool) {
        require(spender != address(0), "ERC20: zero address spender");
        _decreaseAllowance(_msgSender(), spender, subtractedValue);
        return true;
    }

    //================================================= ERC20BatchTransfers =================================================//

    /// @inheritdoc IERC20BatchTransfers
    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual override returns (bool) {
        uint256 length = recipients.length;
        require(length == values.length, "ERC20: inconsistent arrays");
        address sender = _msgSender();
        uint256 balance = _balances[sender];

        uint256 totalValue;
        uint256 selfTransferTotalValue;
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "ERC20: to zero address");

            uint256 value = values[i];
            if (value != 0) {
                uint256 newTotalValue = totalValue + value;
                require(newTotalValue > totalValue, "ERC20: values overflow");
                totalValue = newTotalValue;
                if (sender != to) {
                    _balances[to] += value;
                } else {
                    require(value <= balance, "ERC20: insufficient balance");
                    selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true
                }
            }
            emit Transfer(sender, to, value);
        }

        if (totalValue != 0 && totalValue != selfTransferTotalValue) {
            uint256 newBalance = balance - totalValue;
            require(newBalance < balance, "ERC20: insufficient balance"); // balance must be sufficient, including self-transfers
            _balances[sender] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance
        }
        return true;
    }

    /// @inheritdoc IERC20BatchTransfers
    function batchTransferFrom(
        address from,
        address[] calldata recipients,
        uint256[] calldata values
    ) external virtual override returns (bool) {
        uint256 length = recipients.length;
        require(length == values.length, "ERC20: inconsistent arrays");

        uint256 balance = _balances[from];

        uint256 totalValue;
        uint256 selfTransferTotalValue;
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "ERC20: to zero address");

            uint256 value = values[i];

            if (value != 0) {
                uint256 newTotalValue = totalValue + value;
                require(newTotalValue > totalValue, "ERC20: values overflow");
                totalValue = newTotalValue;
                if (from != to) {
                    _balances[to] += value;
                } else {
                    require(value <= balance, "ERC20: insufficient balance");
                    selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true
                }
            }

            emit Transfer(from, to, value);
        }

        if (totalValue != 0 && totalValue != selfTransferTotalValue) {
            uint256 newBalance = balance - totalValue;
            require(newBalance < balance, "ERC20: insufficient balance"); // balance must be sufficient, including self-transfers
            _balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance
        }

        address sender = _msgSender();
        if (from != sender) {
            _decreaseAllowance(from, sender, totalValue);
        }

        return true;
    }

    //================================================= ERC20SafeTransfers ==================================================//

    /// @inheritdoc IERC20SafeTransfers
    function safeTransfer(
        address to,
        uint256 amount,
        bytes calldata data
    ) external virtual override returns (bool) {
        address sender = _msgSender();
        _transfer(sender, to, amount);
        if (to.isContract()) {
            require(IERC20Receiver(to).onERC20Received(sender, sender, amount, data) == type(IERC20Receiver).interfaceId, "ERC20: transfer refused");
        }
        return true;
    }

    /// @inheritdoc IERC20SafeTransfers
    function safeTransferFrom(
        address from,
        address to,
        uint256 amount,
        bytes calldata data
    ) external virtual override returns (bool) {
        address sender = _msgSender();
        _transferFrom(sender, from, to, amount);
        if (to.isContract()) {
            require(IERC20Receiver(to).onERC20Received(sender, from, amount, data) == type(IERC20Receiver).interfaceId, "ERC20: transfer refused");
        }
        return true;
    }

    //===================================================== ERC20Permit =====================================================//

    /// @inheritdoc IERC20Permit
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() public view override returns (bytes32) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        // recompute the domain separator in case of fork and chainid update
        return chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId, bytes(_name));
    }

    /// @inheritdoc IERC20Permit
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override {
        require(owner != address(0), "ERC20: zero address owner");
        require(block.timestamp <= deadline, "ERC20: expired permit");
        bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline));
        bytes32 hash = keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct));
        address signer = ecrecover(hash, v, r, s);
        require(signer == owner, "ERC20: invalid permit");
        _approve(owner, spender, value);
    }

    //============================================ High-level Internal Functions ============================================//

    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        require(spender != address(0), "ERC20: zero address spender");
        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _decreaseAllowance(
        address owner,
        address spender,
        uint256 subtractedValue
    ) internal {
        uint256 allowance_ = _allowances[owner][spender];

        if (allowance_ != type(uint256).max && subtractedValue != 0) {
            // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)
            uint256 newAllowance = allowance_ - subtractedValue;
            require(newAllowance < allowance_, "ERC20: insufficient allowance");
            _allowances[owner][spender] = newAllowance;
            allowance_ = newAllowance;
        }
        emit Approval(owner, spender, allowance_);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual {
        require(to != address(0), "ERC20: to zero address");

        if (value != 0) {
            uint256 balance = _balances[from];
            uint256 newBalance = balance - value;
            require(newBalance < balance, "ERC20: insufficient balance");
            if (from != to) {
                _balances[from] = newBalance;
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function _transferFrom(
        address sender,
        address from,
        address to,
        uint256 value
    ) internal {
        _transfer(from, to, value);
        if (from != sender) {
            _decreaseAllowance(from, sender, value);
        }
    }

    function _mint(address to, uint256 value) internal virtual {
        require(to != address(0), "ERC20: zero address");
        uint256 supply = _totalSupply;
        if (value != 0) {
            uint256 newSupply = supply + value;
            require(newSupply > supply, "ERC20: supply overflow");
            _totalSupply = newSupply;
            _balances[to] += value; // balance cannot overflow if supply does not
        }
        emit Transfer(address(0), to, value);
    }

    function _batchMint(address[] memory recipients, uint256[] memory values) internal virtual {
        uint256 length = recipients.length;
        require(length == values.length, "ERC20: inconsistent arrays");

        uint256 totalValue;
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "ERC20: zero address");

            uint256 value = values[i];
            if (value != 0) {
                uint256 newTotalValue = totalValue + value;
                require(newTotalValue > totalValue, "ERC20: values overflow");
                totalValue = newTotalValue;
                _balances[to] += value; // balance cannot overflow if supply does not
            }
            emit Transfer(address(0), to, value);
        }

        if (totalValue != 0) {
            uint256 supply = _totalSupply;
            uint256 newSupply = supply + totalValue;
            require(newSupply > supply, "ERC20: supply overflow");
            _totalSupply = newSupply;
        }
    }

    function _burn(address from, uint256 value) internal virtual {
        if (value != 0) {
            uint256 balance = _balances[from];
            uint256 newBalance = balance - value;
            require(newBalance < balance, "ERC20: insufficient balance");
            _balances[from] = newBalance;
            _totalSupply -= value; // will not underflow if balance does not
        }
        emit Transfer(from, address(0), value);
    }

    function _burnFrom(address from, uint256 value) internal virtual {
        _burn(from, value);
        address sender = _msgSender();
        if (from != sender) {
            _decreaseAllowance(from, sender, value);
        }
    }

    function _batchBurnFrom(address[] memory owners, uint256[] memory values) internal virtual {
        uint256 length = owners.length;
        require(length == values.length, "ERC20: inconsistent arrays");

        address sender = _msgSender();

        uint256 totalValue;
        for (uint256 i; i != length; ++i) {
            address from = owners[i];
            uint256 value = values[i];
            if (value != 0) {
                uint256 balance = _balances[from];
                uint256 newBalance = balance - value;
                require(newBalance < balance, "ERC20: insufficient balance");
                _balances[from] = newBalance;
                totalValue += value; // totalValue cannot overflow if the individual balances do not underflow
            }
            emit Transfer(from, address(0), value);

            if (from != sender) {
                _decreaseAllowance(from, sender, value);
            }
        }

        if (totalValue != 0) {
            _totalSupply -= totalValue; // _totalSupply cannot underfow as balances do not underflow
        }
    }

    //============================================== Helper Internal Functions ==============================================//

    function _calculateDomainSeparator(uint256 chainId, bytes memory name_) private view returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(name_),
                    keccak256("1"),
                    chainId,
                    address(this)
                )
            );
    }
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingAppendedCallData {
    function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) {
        // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1
        // The assembly code is more direct than the Solidity version using `abi.decode`.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            sender := shr(96, calldataload(sub(calldatasize(), 20)))
        }
    }

    function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) {
        return msg.data[:msg.data.length - 20];
    }
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IERC2771 {
    function isTrustedForwarder(address forwarder) external view returns (bool);
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IForwarderRegistry {
    function isForwarderFor(address, address) external view returns (bool);
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;



abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 {
    IForwarderRegistry internal immutable _forwarderRegistry;
    address internal immutable _universalForwarder;

    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) {
        _universalForwarder = universalForwarder;
        _forwarderRegistry = forwarderRegistry;
    }

    function isTrustedForwarder(address forwarder) external view virtual override returns (bool) {
        return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry);
    }

    function _msgSender() internal view virtual returns (address payable) {
        address payable msgSender = msg.sender;
        address payable sender = _lastAppendedDataAsSender();
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return sender;
        }

        // if msg.sender is neither the registry nor the universal forwarder,
        // we have to check the last 20bytes of the call data intepreted as an address
        // and check if the msg.sender was registered as forewarder for that address
        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) {
            return sender;
        }

        return msgSender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        address payable msgSender = msg.sender;
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return _msgDataAssuming20BytesAppendedData();
        }

        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) {
            return _msgDataAssuming20BytesAppendedData();
        }
        return msg.data;
    }
}


// File contracts/token/erc20/PrimateCoin.sol

pragma solidity >=0.7.6 <0.8.0;



/**
 * @title PrimateCoin
 */
contract PrimateCoin is ERC20, UsingUniversalForwarding, Recoverable {
    string public constant NAME = "PRIMATE";
    string public constant SYMBOL = "PRIMATE";
    uint8 public constant DECIMALS = 18;

    /**
     * Constructor.
     * @dev Reverts if `values` and `recipients` have different lengths.
     * @dev Reverts if one of `recipients` is the zero address.
     * @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.
     * @param recipients the accounts to deliver the tokens to.
     * @param values the amounts of tokens to mint to each of `recipients`.
     * @param forwarderRegistry Registry of approved meta-transaction forwarders.
     * @param universalForwarder Universal meta-transaction forwarder.
     */
    constructor(
        address[] memory recipients,
        uint256[] memory values,
        IForwarderRegistry forwarderRegistry,
        address universalForwarder
    ) ERC20(NAME, SYMBOL, DECIMALS) UsingUniversalForwarding(forwarderRegistry, universalForwarder) Ownable(msg.sender) {
        _batchMint(recipients, values);
    }

    /**
     * Updates the URI of the token.
     * @dev Reverts if the sender is not the contract owner.
     * @param tokenURI_ the updated URI.
     */
    function setTokenURI(string calldata tokenURI_) external {
        _requireOwnership(_msgSender());
        _tokenURI = tokenURI_;
    }

    function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) {
        return UsingUniversalForwarding._msgSender();
    }

    function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) {
        return UsingUniversalForwarding._msgData();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"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":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deploymentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040523480156200001257600080fd5b5060405162002e4338038062002e43833981810160405260808110156200003857600080fd5b81019080805160405193929190846401000000008211156200005957600080fd5b9083019060208201858111156200006f57600080fd5b82518660208202830111640100000000821117156200008d57600080fd5b82525081516020918201928201910280838360005b83811015620000bc578181015183820152602001620000a2565b5050505090500160405260200180516040519392919084640100000000821115620000e657600080fd5b908301906020820185811115620000fc57600080fd5b82518660208202830111640100000000821117156200011a57600080fd5b82525081516020918201928201910280838360005b83811015620001495781810151838201526020016200012f565b505050509190910160408181526020848101519482015182840183526007808552665052494d41544560c81b83860181815285518087019096529185529284019290925283519597509550339487945086939291601291620001ae9160019162000549565b508151620001c490600290602085019062000549565b507fff0000000000000000000000000000000000000000000000000000000000000060f882901b1660c05246608081905262000201818562000284565b60a05250505050606090811b6001600160601b03199081166101005291901b1660e052600780546001600160a01b0319166001600160a01b0383169081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200027a84846200030e565b50505050620005f5565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b81518151811462000366576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6000805b828114620004db5760008582815181106200038157fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415620003f4576040805162461bcd60e51b815260206004820152601360248201527f45524332303a207a65726f206164647265737300000000000000000000000000604482015290519081900360640190fd5b60008583815181106200040357fe5b60200260200101519050806000146200048f578381018481116200046e576040805162461bcd60e51b815260206004820152601660248201527f45524332303a2076616c756573206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b6001600160a01b038316600090815260046020526040902080548301905593505b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350506001016200036a565b50801562000543576006548181018181116200053e576040805162461bcd60e51b815260206004820152601660248201527f45524332303a20737570706c79206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b600655505b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005815760008555620005cc565b82601f106200059c57805160ff1916838001178555620005cc565b82800160010185558215620005cc579182015b82811115620005cc578251825591602001919060010190620005af565b50620005da929150620005de565b5090565b5b80821115620005da5760008155600101620005df565b60805160a05160c05160f81c60e05160601c6101005160601c6127f162000652600039806111e652806123ef52508061122152806123b45280612447525080610c01525080610ceb525080610c285280611a2152506127f16000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806388d695b211610104578063c3666c36116100a2578063e0df5b6f11610071578063e0df5b6f14610932578063eb795549146109a0578063f2fde38b14610a23578063f76f8d78146106af576101da565b8063c3666c361461079d578063cd0d0096146108ab578063d505accf146108b3578063dd62ed3e14610904576101da565b8063a3f4df7e116100de578063a3f4df7e146106af578063a457c2d7146106b7578063a9059cbb146106e3578063b88d4fde1461070f576101da565b806388d695b2146105c55780638da5cb5b1461068357806395d89b41146106a7576101da565b80633644e5151161017c578063572b6c051161014b578063572b6c051461044357806370a082311461046957806373c8a9581461048f5780637ecebe001461059f576101da565b80633644e5151461033957806339509351146103415780633c130d901461036d5780634885b25414610375576101da565b806318160ddd116101b857806318160ddd146102c357806323b872dd146102dd5780632e0f262514610313578063313ce56714610331576101da565b806301ffc9a7146101df57806306fdde031461021a578063095ea7b314610297575b600080fd5b610206600480360360208110156101f557600080fd5b50356001600160e01b031916610a49565b604080519115158252519081900360200190f35b610222610b22565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610206600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610bb8565b6102cb610bd5565b60408051918252519081900360200190f35b610206600480360360608110156102f357600080fd5b506001600160a01b03813581169160208101359091169060400135610bdb565b61031b610bfa565b6040805160ff9092168252519081900360200190f35b61031b610bff565b6102cb610c23565b6102066004803603604081101561035757600080fd5b506001600160a01b038135169060200135610d11565b610222610e7f565b6102066004803603606081101561038b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103b557600080fd5b8201836020820111156103c757600080fd5b803590602001918460208302840111600160201b831117156103e857600080fd5b919390929091602081019035600160201b81111561040557600080fd5b82018360208201111561041757600080fd5b803590602001918460208302840111600160201b8311171561043857600080fd5b509092509050610ee0565b6102066004803603602081101561045957600080fd5b50356001600160a01b03166111e2565b6102cb6004803603602081101561047f57600080fd5b50356001600160a01b031661125b565b61059d600480360360608110156104a557600080fd5b810190602081018135600160201b8111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460208302840111600160201b831117156104f257600080fd5b919390929091602081019035600160201b81111561050f57600080fd5b82018360208201111561052157600080fd5b803590602001918460208302840111600160201b8311171561054257600080fd5b919390929091602081019035600160201b81111561055f57600080fd5b82018360208201111561057157600080fd5b803590602001918460208302840111600160201b8311171561059257600080fd5b509092509050611276565b005b6102cb600480360360208110156105b557600080fd5b50356001600160a01b0316611368565b610206600480360360408110156105db57600080fd5b810190602081018135600160201b8111156105f557600080fd5b82018360208201111561060757600080fd5b803590602001918460208302840111600160201b8311171561062857600080fd5b919390929091602081019035600160201b81111561064557600080fd5b82018360208201111561065757600080fd5b803590602001918460208302840111600160201b8311171561067857600080fd5b50909250905061137a565b61068b611657565b604080516001600160a01b039092168252519081900360200190f35b610222611666565b6102226116c4565b610206600480360360408110156106cd57600080fd5b506001600160a01b0381351690602001356116e7565b610206600480360360408110156106f957600080fd5b506001600160a01b038135169060200135611756565b6102066004803603608081101561072557600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561075f57600080fd5b82018360208201111561077157600080fd5b803590602001918460018302840111600160201b8311171561079257600080fd5b50909250905061176a565b61059d600480360360608110156107b357600080fd5b810190602081018135600160201b8111156107cd57600080fd5b8201836020820111156107df57600080fd5b803590602001918460208302840111600160201b8311171561080057600080fd5b919390929091602081019035600160201b81111561081d57600080fd5b82018360208201111561082f57600080fd5b803590602001918460208302840111600160201b8311171561085057600080fd5b919390929091602081019035600160201b81111561086d57600080fd5b82018360208201111561087f57600080fd5b803590602001918460208302840111600160201b831117156108a057600080fd5b5090925090506118d7565b6102cb611a1f565b61059d600480360360e08110156108c957600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611a43565b6102cb6004803603604081101561091a57600080fd5b506001600160a01b0381358116916020013516611c97565b61059d6004803603602081101561094857600080fd5b810190602081018135600160201b81111561096257600080fd5b82018360208201111561097457600080fd5b803590602001918460018302840111600160201b8311171561099557600080fd5b509092509050611cc2565b610206600480360360608110156109b657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109e557600080fd5b8201836020820111156109f757600080fd5b803590602001918460018302840111600160201b83111715610a1857600080fd5b509092509050611cde565b61059d60048036036020811015610a3957600080fd5b50356001600160a01b0316611e49565b60006001600160e01b031982166301ffc9a760e01b1480610a7a57506001600160e01b031982166336372b0760e01b145b80610a9557506001600160e01b0319821663a219a02560e01b145b80610ab057506001600160e01b031982166303c130d960e41b145b80610acb57506001600160e01b03198216634e83a8c360e11b145b80610ae657506001600160e01b0319821663602993f360e11b145b80610b0157506001600160e01b031982166353f41a9760e01b145b80610b1c57506001600160e01b03198216634ec7fbed60e11b145b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b820191906000526020600020905b815481529060010190602001808311610b9057829003601f168201915b505050505090505b90565b6000610bcc610bc5611ea4565b8484611eb3565b50600192915050565b60065490565b6000610bf0610be8611ea4565b858585611f70565b5060019392505050565b601281565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ce95760018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152610ce493859391929091830182828015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050611fa5565b610d0b565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b038316610d6e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6000610d78611ea4565b6001600160a01b038082166000908152600560209081526040808320938916835292905220549091508315610e2957808401818111610dfe576040805162461bcd60e51b815260206004820152601960248201527f45524332303a20616c6c6f77616e6365206f766572666c6f7700000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600560209081526040808320938a1683529290522081905590505b846001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3506001949350505050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b600083828114610f37576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600460205260408120549080805b8481146111295760008a8a83818110610f6957fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415610fdc576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b6000898984818110610fea57fe5b905060200201359050806000146110d45784810185811161104b576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b03168e6001600160a01b03161461108a576001600160a01b03831660009081526004602052604090208054830190556110d2565b868211156110cd576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050600101610f54565b5081158015906111395750808214155b156111a157818303838110611183576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038b16600090815260046020526040902090820190555b60006111ab611ea4565b9050806001600160a01b03168b6001600160a01b0316146111d1576111d18b828561202f565b5060019a9950505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610b1c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6001600160a01b031660009081526004602052604090205490565b611286611281611ea4565b61213e565b84838114801561129557508082145b6112e6576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e576113568888838181106112ff57fe5b905060200201356001600160a01b031685858481811061131b57fe5b9050602002013588888581811061132e57fe5b905060200201356001600160a01b03166001600160a01b03166121fe9092919063ffffffff16565b6001016112e9565b5050505050505050565b60006020819052908152604090205481565b6000838281146113d1576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60006113db611ea4565b6001600160a01b03811660009081526004602052604081205491925080805b8581146115cf5760008b8b8381811061140f57fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415611482576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b60008a8a8481811061149057fe5b9050602002013590508060001461157a578481018581116114f1576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b0316886001600160a01b031614611530576001600160a01b0383166000908152600460205260409020805483019055611578565b86821115611573576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350506001016113fa565b5081158015906115df5750808214155b1561164757818303838110611629576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038516600090815260046020526040902090820190555b5060019998505050505050505050565b6007546001600160a01b031690565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b604051806040016040528060078152602001665052494d41544560c81b81525081565b60006001600160a01b038316611744576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b610bcc61174f611ea4565b848461202f565b6000610bcc611763611ea4565b8484612250565b600080611775611ea4565b905061178381888888611f70565b611795866001600160a01b031661239e565b156118ca57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc35859838a8989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050506040513d602081101561187257600080fd5b50516001600160e01b031916146118ca576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b5060019695505050505050565b6118e2611281611ea4565b8483811480156118f157508082145b611942576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e5785858281811061195857fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061198357fe5b905060200201356001600160a01b031687878681811061199f57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b50505050806001019050611945565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b038716611a9e576040805162461bcd60e51b815260206004820152601960248201527f45524332303a207a65726f2061646472657373206f776e657200000000000000604482015290519081900360640190fd5b83421115611aeb576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e88195e1c1a5c9959081c195c9b5a5d605a1b604482015290519081900360640190fd5b6001600160a01b0380881660008181526020818152604080832080546001810190915581517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a084019490945260c08084018990528451808503909101815260e09093019093528151919092012090611b7d610c23565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611c16573d6000803e3d6000fd5b505050602060405103519050896001600160a01b0316816001600160a01b031614611c80576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e881a5b9d985b1a59081c195c9b5a5d605a1b604482015290519081900360640190fd5b611c8b8a8a8a611eb3565b50505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611ccd611281611ea4565b611cd9600383836126fa565b505050565b600080611ce9611ea4565b9050611cf6818787612250565b611d08866001600160a01b031661239e565b15611e3d57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc3585983848989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050506040513d6020811015611de557600080fd5b50516001600160e01b03191614611e3d576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b50600195945050505050565b611e54611281611ea4565b600780546001600160a01b0319166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000611eae6123a4565b905090565b6001600160a01b038216611f0e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611f7b838383612250565b836001600160a01b0316836001600160a01b031614611f9f57611f9f83858361202f565b50505050565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b6001600160a01b03808416600090815260056020908152604080832093861683529290522054600019811480159061206657508115155b156120ed578181038181106120c2576040805162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522081905590505b826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a350505050565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561217757600080fd5b505afa15801561218b573d6000803e3d6000fd5b505050506040513d60208110156121a157600080fd5b50516001600160a01b038281169116146121fb576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cd9908490612504565b6001600160a01b0382166122a4576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b801561234e576001600160a01b038316600090815260046020526040902054818103818110612308576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461234b576001600160a01b038086166000908152600460205260408082208490559186168152208054840190555b50505b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b3b151590565b600033816123b06126ee565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061242357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b15612431579150610bb59050565b6001600160a01b03821632148015906124f057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b50515b156124fe579150610bb59050565b50905090565b816125176001600160a01b03821661239e565b612568576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106125a55780518252601f199092019160209182019101612586565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b5091509150811561268b578051156126865780806020019051602081101561263357600080fd5b5051612686576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b6126e7565b80516126de576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b5050505050565b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826127305760008555612776565b82601f106127495782800160ff19823516178555612776565b82800160010185558215612776579182015b8281111561277657823582559160200191906001019061275b565b50612782929150612786565b5090565b5b80821115612782576000815560010161278756fe45524332303a20696e73756666696369656e742062616c616e63650000000000a26469706673582212201f9c631b722e0bd11309a56d5c35d0eefcf0557bb95f5a05add164a843e69f7264736f6c634300070600330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000028ccf125b7751e830fc0f345690806905caa4e0a000000000000000000000000a62b87cd634fceab940361e6c9584d620e904e1100000000000000000000000041c517c9a1051da7704d8de3e6e642597d7e13fc00000000000000000000000088bb5b695535d7acb5970fe9f9e698d16f55bf160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000c2632f86d61e22cb00000000000000000000000000000000000000000000000014adf4b7320334b90000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000a56fa5b99019a5c8000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806388d695b211610104578063c3666c36116100a2578063e0df5b6f11610071578063e0df5b6f14610932578063eb795549146109a0578063f2fde38b14610a23578063f76f8d78146106af576101da565b8063c3666c361461079d578063cd0d0096146108ab578063d505accf146108b3578063dd62ed3e14610904576101da565b8063a3f4df7e116100de578063a3f4df7e146106af578063a457c2d7146106b7578063a9059cbb146106e3578063b88d4fde1461070f576101da565b806388d695b2146105c55780638da5cb5b1461068357806395d89b41146106a7576101da565b80633644e5151161017c578063572b6c051161014b578063572b6c051461044357806370a082311461046957806373c8a9581461048f5780637ecebe001461059f576101da565b80633644e5151461033957806339509351146103415780633c130d901461036d5780634885b25414610375576101da565b806318160ddd116101b857806318160ddd146102c357806323b872dd146102dd5780632e0f262514610313578063313ce56714610331576101da565b806301ffc9a7146101df57806306fdde031461021a578063095ea7b314610297575b600080fd5b610206600480360360208110156101f557600080fd5b50356001600160e01b031916610a49565b604080519115158252519081900360200190f35b610222610b22565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610206600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610bb8565b6102cb610bd5565b60408051918252519081900360200190f35b610206600480360360608110156102f357600080fd5b506001600160a01b03813581169160208101359091169060400135610bdb565b61031b610bfa565b6040805160ff9092168252519081900360200190f35b61031b610bff565b6102cb610c23565b6102066004803603604081101561035757600080fd5b506001600160a01b038135169060200135610d11565b610222610e7f565b6102066004803603606081101561038b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103b557600080fd5b8201836020820111156103c757600080fd5b803590602001918460208302840111600160201b831117156103e857600080fd5b919390929091602081019035600160201b81111561040557600080fd5b82018360208201111561041757600080fd5b803590602001918460208302840111600160201b8311171561043857600080fd5b509092509050610ee0565b6102066004803603602081101561045957600080fd5b50356001600160a01b03166111e2565b6102cb6004803603602081101561047f57600080fd5b50356001600160a01b031661125b565b61059d600480360360608110156104a557600080fd5b810190602081018135600160201b8111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460208302840111600160201b831117156104f257600080fd5b919390929091602081019035600160201b81111561050f57600080fd5b82018360208201111561052157600080fd5b803590602001918460208302840111600160201b8311171561054257600080fd5b919390929091602081019035600160201b81111561055f57600080fd5b82018360208201111561057157600080fd5b803590602001918460208302840111600160201b8311171561059257600080fd5b509092509050611276565b005b6102cb600480360360208110156105b557600080fd5b50356001600160a01b0316611368565b610206600480360360408110156105db57600080fd5b810190602081018135600160201b8111156105f557600080fd5b82018360208201111561060757600080fd5b803590602001918460208302840111600160201b8311171561062857600080fd5b919390929091602081019035600160201b81111561064557600080fd5b82018360208201111561065757600080fd5b803590602001918460208302840111600160201b8311171561067857600080fd5b50909250905061137a565b61068b611657565b604080516001600160a01b039092168252519081900360200190f35b610222611666565b6102226116c4565b610206600480360360408110156106cd57600080fd5b506001600160a01b0381351690602001356116e7565b610206600480360360408110156106f957600080fd5b506001600160a01b038135169060200135611756565b6102066004803603608081101561072557600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561075f57600080fd5b82018360208201111561077157600080fd5b803590602001918460018302840111600160201b8311171561079257600080fd5b50909250905061176a565b61059d600480360360608110156107b357600080fd5b810190602081018135600160201b8111156107cd57600080fd5b8201836020820111156107df57600080fd5b803590602001918460208302840111600160201b8311171561080057600080fd5b919390929091602081019035600160201b81111561081d57600080fd5b82018360208201111561082f57600080fd5b803590602001918460208302840111600160201b8311171561085057600080fd5b919390929091602081019035600160201b81111561086d57600080fd5b82018360208201111561087f57600080fd5b803590602001918460208302840111600160201b831117156108a057600080fd5b5090925090506118d7565b6102cb611a1f565b61059d600480360360e08110156108c957600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611a43565b6102cb6004803603604081101561091a57600080fd5b506001600160a01b0381358116916020013516611c97565b61059d6004803603602081101561094857600080fd5b810190602081018135600160201b81111561096257600080fd5b82018360208201111561097457600080fd5b803590602001918460018302840111600160201b8311171561099557600080fd5b509092509050611cc2565b610206600480360360608110156109b657600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109e557600080fd5b8201836020820111156109f757600080fd5b803590602001918460018302840111600160201b83111715610a1857600080fd5b509092509050611cde565b61059d60048036036020811015610a3957600080fd5b50356001600160a01b0316611e49565b60006001600160e01b031982166301ffc9a760e01b1480610a7a57506001600160e01b031982166336372b0760e01b145b80610a9557506001600160e01b0319821663a219a02560e01b145b80610ab057506001600160e01b031982166303c130d960e41b145b80610acb57506001600160e01b03198216634e83a8c360e11b145b80610ae657506001600160e01b0319821663602993f360e11b145b80610b0157506001600160e01b031982166353f41a9760e01b145b80610b1c57506001600160e01b03198216634ec7fbed60e11b145b92915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b820191906000526020600020905b815481529060010190602001808311610b9057829003601f168201915b505050505090505b90565b6000610bcc610bc5611ea4565b8484611eb3565b50600192915050565b60065490565b6000610bf0610be8611ea4565b858585611f70565b5060019392505050565b601281565b7f000000000000000000000000000000000000000000000000000000000000001290565b6000467f00000000000000000000000000000000000000000000000000000000000000018114610ce95760018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152610ce493859391929091830182828015610cda5780601f10610caf57610100808354040283529160200191610cda565b820191906000526020600020905b815481529060010190602001808311610cbd57829003601f168201915b5050505050611fa5565b610d0b565b7f8b85057b2108e0cd88ae3916c9df2f1e5f6ba370d24086199ba10ce6bce3163c5b91505090565b60006001600160a01b038316610d6e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6000610d78611ea4565b6001600160a01b038082166000908152600560209081526040808320938916835292905220549091508315610e2957808401818111610dfe576040805162461bcd60e51b815260206004820152601960248201527f45524332303a20616c6c6f77616e6365206f766572666c6f7700000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600560209081526040808320938a1683529290522081905590505b846001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3506001949350505050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b600083828114610f37576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600460205260408120549080805b8481146111295760008a8a83818110610f6957fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415610fdc576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b6000898984818110610fea57fe5b905060200201359050806000146110d45784810185811161104b576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b03168e6001600160a01b03161461108a576001600160a01b03831660009081526004602052604090208054830190556110d2565b868211156110cd576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050600101610f54565b5081158015906111395750808214155b156111a157818303838110611183576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038b16600090815260046020526040902090820190555b60006111ab611ea4565b9050806001600160a01b03168b6001600160a01b0316146111d1576111d18b828561202f565b5060019a9950505050505050505050565b60007f00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad26001600160a01b0316826001600160a01b03161480610b1c57507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b0316826001600160a01b0316149050919050565b6001600160a01b031660009081526004602052604090205490565b611286611281611ea4565b61213e565b84838114801561129557508082145b6112e6576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e576113568888838181106112ff57fe5b905060200201356001600160a01b031685858481811061131b57fe5b9050602002013588888581811061132e57fe5b905060200201356001600160a01b03166001600160a01b03166121fe9092919063ffffffff16565b6001016112e9565b5050505050505050565b60006020819052908152604090205481565b6000838281146113d1576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60006113db611ea4565b6001600160a01b03811660009081526004602052604081205491925080805b8581146115cf5760008b8b8381811061140f57fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415611482576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b60008a8a8481811061149057fe5b9050602002013590508060001461157a578481018581116114f1576040805162461bcd60e51b815260206004820152601660248201527545524332303a2076616c756573206f766572666c6f7760501b604482015290519081900360640190fd5b809550826001600160a01b0316886001600160a01b031614611530576001600160a01b0383166000908152600460205260409020805483019055611578565b86821115611573576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b938101935b505b816001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350506001016113fa565b5081158015906115df5750808214155b1561164757818303838110611629576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b6001600160a01b038516600090815260046020526040902090820190555b5060019998505050505050505050565b6007546001600160a01b031690565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610bad5780601f10610b8257610100808354040283529160200191610bad565b604051806040016040528060078152602001665052494d41544560c81b81525081565b60006001600160a01b038316611744576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b610bcc61174f611ea4565b848461202f565b6000610bcc611763611ea4565b8484612250565b600080611775611ea4565b905061178381888888611f70565b611795866001600160a01b031661239e565b156118ca57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc35859838a8989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050506040513d602081101561187257600080fd5b50516001600160e01b031916146118ca576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b5060019695505050505050565b6118e2611281611ea4565b8483811480156118f157508082145b611942576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461135e5785858281811061195857fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061198357fe5b905060200201356001600160a01b031687878681811061199f57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b50505050806001019050611945565b7f000000000000000000000000000000000000000000000000000000000000000181565b6001600160a01b038716611a9e576040805162461bcd60e51b815260206004820152601960248201527f45524332303a207a65726f2061646472657373206f776e657200000000000000604482015290519081900360640190fd5b83421115611aeb576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e88195e1c1a5c9959081c195c9b5a5d605a1b604482015290519081900360640190fd5b6001600160a01b0380881660008181526020818152604080832080546001810190915581517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98185015280830195909552948b166060850152608084018a905260a084019490945260c08084018990528451808503909101815260e09093019093528151919092012090611b7d610c23565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611c16573d6000803e3d6000fd5b505050602060405103519050896001600160a01b0316816001600160a01b031614611c80576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c0e881a5b9d985b1a59081c195c9b5a5d605a1b604482015290519081900360640190fd5b611c8b8a8a8a611eb3565b50505050505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611ccd611281611ea4565b611cd9600383836126fa565b505050565b600080611ce9611ea4565b9050611cf6818787612250565b611d08866001600160a01b031661239e565b15611e3d57634fc3585960e01b6001600160e01b031916866001600160a01b0316634fc3585983848989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b505050506040513d6020811015611de557600080fd5b50516001600160e01b03191614611e3d576040805162461bcd60e51b8152602060048201526017602482015276115490cc8c0e881d1c985b9cd9995c881c99599d5cd959604a1b604482015290519081900360640190fd5b50600195945050505050565b611e54611281611ea4565b600780546001600160a01b0319166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000611eae6123a4565b905090565b6001600160a01b038216611f0e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6001600160a01b03808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611f7b838383612250565b836001600160a01b0316836001600160a01b031614611f9f57611f9f83858361202f565b50505050565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b6001600160a01b03808416600090815260056020908152604080832093861683529290522054600019811480159061206657508115155b156120ed578181038181106120c2576040805162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522081905590505b826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a350505050565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561217757600080fd5b505afa15801561218b573d6000803e3d6000fd5b505050506040513d60208110156121a157600080fd5b50516001600160a01b038281169116146121fb576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cd9908490612504565b6001600160a01b0382166122a4576040805162461bcd60e51b815260206004820152601660248201527545524332303a20746f207a65726f206164647265737360501b604482015290519081900360640190fd5b801561234e576001600160a01b038316600090815260046020526040902054818103818110612308576040805162461bcd60e51b815260206004820152601b602482015260008051602061279c833981519152604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461234b576001600160a01b038086166000908152600460205260408082208490559186168152208054840190555b50505b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b3b151590565b600033816123b06126ee565b90507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b0316826001600160a01b0316148061242357507f00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad26001600160a01b0316826001600160a01b0316145b15612431579150610bb59050565b6001600160a01b03821632148015906124f057507f00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b50515b156124fe579150610bb59050565b50905090565b816125176001600160a01b03821661239e565b612568576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106125a55780518252601f199092019160209182019101612586565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b5091509150811561268b578051156126865780806020019051602081101561263357600080fd5b5051612686576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b6126e7565b80516126de576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b5050505050565b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826127305760008555612776565b82601f106127495782800160ff19823516178555612776565b82800160010185558215612776579182015b8281111561277657823582559160200191906001019061275b565b50612782929150612786565b5090565b5b80821115612782576000815560010161278756fe45524332303a20696e73756666696369656e742062616c616e63650000000000a26469706673582212201f9c631b722e0bd11309a56d5c35d0eefcf0557bb95f5a05add164a843e69f7264736f6c63430007060033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000028ccf125b7751e830fc0f345690806905caa4e0a000000000000000000000000a62b87cd634fceab940361e6c9584d620e904e1100000000000000000000000041c517c9a1051da7704d8de3e6e642597d7e13fc00000000000000000000000088bb5b695535d7acb5970fe9f9e698d16f55bf160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000c2632f86d61e22cb00000000000000000000000000000000000000000000000014adf4b7320334b90000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000000a56fa5b99019a5c8000000

-----Decoded View---------------
Arg [0] : recipients (address[]): 0x28CCF125B7751e830FC0f345690806905CAA4E0a,0xa62b87cd634fCeab940361e6C9584d620E904e11,0x41c517C9A1051da7704D8DE3e6e642597D7e13FC,0x88BB5B695535D7ACb5970FE9F9E698d16f55bf16
Arg [1] : values (uint256[]): 235000000000000000000000000,25000000000000000000000000,1600000000000000000000000000,200000000000000000000000000
Arg [2] : forwarderRegistry (address): 0x71beE13E92e64701b78f059801A70857E4683ACd
Arg [3] : universalForwarder (address): 0x56133a31F4cD01EDe8c6EE780071c021bd324aD2

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd
Arg [3] : 00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 00000000000000000000000028ccf125b7751e830fc0f345690806905caa4e0a
Arg [6] : 000000000000000000000000a62b87cd634fceab940361e6c9584d620e904e11
Arg [7] : 00000000000000000000000041c517c9a1051da7704d8de3e6e642597d7e13fc
Arg [8] : 00000000000000000000000088bb5b695535d7acb5970fe9f9e698d16f55bf16
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 000000000000000000000000000000000000000000c2632f86d61e22cb000000
Arg [11] : 00000000000000000000000000000000000000000014adf4b7320334b9000000
Arg [12] : 0000000000000000000000000000000000000000052b7d2dcc80cd2e40000000
Arg [13] : 000000000000000000000000000000000000000000a56fa5b99019a5c8000000


Deployed Bytecode Sourcemap

49823:1821:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29967:620;;;;;;;;;;;;;;;;-1:-1:-1;29967:620:0;-1:-1:-1;;;;;;29967:620:0;;:::i;:::-;;;;;;;;;;;;;;;;;;32036:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31236:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31236:169:0;;;;;;;;:::i;30754:102::-;;;:::i;:::-;;;;;;;;;;;;;;;;31638:223;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31638:223:0;;;;;;;;;;;;;;;;;:::i;49993:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32316:94;;;:::i;38896:361::-;;;:::i;32863:638::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32863:638:0;;;;;;;;:::i;32585:102::-;;;:::i;35704:1801::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35704:1801:0;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35704:1801:0;;;;;;;;;;-1:-1:-1;35704:1801:0;;-1:-1:-1;35704:1801:0;-1:-1:-1;35704:1801:0;:::i;47877:195::-;;;;;;;;;;;;;;;;-1:-1:-1;47877:195:0;-1:-1:-1;;;;;47877:195:0;;:::i;30892:121::-;;;;;;;;;;;;;;;;-1:-1:-1;30892:121:0;-1:-1:-1;;;;;30892:121:0;;:::i;8513:492::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8513:492:0;;;;;;;;;;-1:-1:-1;8513:492:0;;-1:-1:-1;8513:492:0;-1:-1:-1;8513:492:0;:::i;:::-;;29032:50;;;;;;;;;;;;;;;;-1:-1:-1;29032:50:0;-1:-1:-1;;;;;29032:50:0;;:::i;34008:1646::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34008:1646:0;;;;;;;;;;-1:-1:-1;34008:1646:0;;-1:-1:-1;34008:1646:0;-1:-1:-1;34008:1646:0;:::i;2876:96::-;;;:::i;:::-;;;;-1:-1:-1;;;;;2876:96:0;;;;;;;;;;;;;;32174:98;;;:::i;49899:39::-;;;:::i;33546:281::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33546:281:0;;;;;;;;:::i;31441:161::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31441:161:0;;;;;;;;:::i;38184:485::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38184:485:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38184:485:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38184:485:0;;;;;;;;;;-1:-1:-1;38184:485:0;;-1:-1:-1;38184:485:0;-1:-1:-1;38184:485:0;:::i;9831:522::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9831:522:0;;;;;;;;;;-1:-1:-1;9831:522:0;;-1:-1:-1;9831:522:0;-1:-1:-1;9831:522:0;:::i;28841:42::-;;;:::i;39299:727::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39299:727:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31049:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31049:151:0;;;;;;;;;;:::i;51119:139::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51119:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51119:139:0;;;;;;;;;;-1:-1:-1;51119:139:0;;-1:-1:-1;51119:139:0;-1:-1:-1;51119:139:0;:::i;37685:450::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37685:450:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37685:450:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37685:450:0;;;;;;;;;;-1:-1:-1;37685:450:0;;-1:-1:-1;37685:450:0;-1:-1:-1;37685:450:0;:::i;3219:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3219:201:0;-1:-1:-1;;;;;3219:201:0;;:::i;29967:620::-;30052:4;-1:-1:-1;;;;;;30089:40:0;;-1:-1:-1;;;30089:40:0;;:96;;-1:-1:-1;;;;;;;30146:39:0;;-1:-1:-1;;;30146:39:0;30089:96;:160;;;-1:-1:-1;;;;;;;30202:47:0;;-1:-1:-1;;;30202:47:0;30089:160;:224;;;-1:-1:-1;;;;;;;30266:47:0;;-1:-1:-1;;;30266:47:0;30089:224;:289;;;-1:-1:-1;;;;;;;30330:48:0;;-1:-1:-1;;;30330:48:0;30089:289;:359;;;-1:-1:-1;;;;;;;30395:53:0;;-1:-1:-1;;;30395:53:0;30089:359;:428;;;-1:-1:-1;;;;;;;30465:52:0;;-1:-1:-1;;;30465:52:0;30089:428;:490;;;-1:-1:-1;;;;;;;30534:45:0;;-1:-1:-1;;;30534:45:0;30089:490;30069:510;29967:620;-1:-1:-1;;29967:620:0:o;32036:94::-;32117:5;32110:12;;;;;;;;-1:-1:-1;;32110:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32084:13;;32110:12;;32117:5;;32110:12;;32117:5;32110:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32036:94;;:::o;31236:169::-;31320:4;31337:38;31346:12;:10;:12::i;:::-;31360:7;31369:5;31337:8;:38::i;:::-;-1:-1:-1;31393:4:0;31236:169;;;;:::o;30754:102::-;30836:12;;30754:102;:::o;31638:223::-;31770:4;31787:44;31801:12;:10;:12::i;:::-;31815:4;31821:2;31825:5;31787:13;:44::i;:::-;-1:-1:-1;31849:4:0;31638:223;;;;;:::o;49993:35::-;50026:2;49993:35;:::o;32316:94::-;32393:9;32316:94;:::o;38896:361::-;38954:7;39035:9;39161:17;39150:28;;:99;;39242:5;39201:48;;;;;;;;;;;;;-1:-1:-1;;39201:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39227:7;;39201:48;;39242:5;;39201:48;;39242:5;39201:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;:48::i;:::-;39150:99;;;39181:17;39150:99;39143:106;;;38896:361;:::o;32863:638::-;32962:4;-1:-1:-1;;;;;32987:21:0;;32979:61;;;;;-1:-1:-1;;;32979:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33051:13;33067:12;:10;:12::i;:::-;-1:-1:-1;;;;;33111:18:0;;;33090;33111;;;:11;:18;;;;;;;;:27;;;;;;;;;;33051:28;;-1:-1:-1;33153:15:0;;33149:269;;33208:23;;;33254:25;;;33246:63;;;;;-1:-1:-1;;;33246:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33324:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:42;;;33354:12;-1:-1:-1;33149:269:0;33449:7;-1:-1:-1;;;;;33433:36:0;33442:5;-1:-1:-1;;;;;33433:36:0;;33458:10;33433:36;;;;;;;;;;;;;;;;;;-1:-1:-1;33489:4:0;;32863:638;-1:-1:-1;;;;32863:638:0:o;32585:102::-;32670:9;32663:16;;;;;;;;-1:-1:-1;;32663:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32637:13;;32663:16;;32670:9;;32663:16;;32670:9;32663:16;;;;;;;;;;;;;;;;;;;;;;;;35704:1801;35872:4;35906:10;35942:23;;;35934:62;;;;;-1:-1:-1;;;35934:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36027:15:0;;36009;36027;;;:9;:15;;;;;;;36009;;36125:810;36146:6;36141:1;:11;36125:810;;36174:10;36187;;36198:1;36187:13;;;;;;;;;;;;;-1:-1:-1;;;;;36187:13:0;36174:26;;36237:1;-1:-1:-1;;;;;36223:16:0;:2;-1:-1:-1;;;;;36223:16:0;;;36215:51;;;;;-1:-1:-1;;;36215:51:0;;;;;;;;;;;;-1:-1:-1;;;36215:51:0;;;;;;;;;;;;;;;36283:13;36299:6;;36306:1;36299:9;;;;;;;;;;;;;36283:25;;36329:5;36338:1;36329:10;36325:552;;36384:18;;;36429:26;;;36421:61;;;;;-1:-1:-1;;;36421:61:0;;;;;;;;;;;;-1:-1:-1;;;36421:61:0;;;;;;;;;;;;;;;36514:13;36501:26;;36558:2;-1:-1:-1;;;;;36550:10:0;:4;-1:-1:-1;;;;;36550:10:0;;36546:316;;-1:-1:-1;;;;;36585:13:0;;;;;;:9;:13;;;;;:22;;;;;;36546:316;;;36673:7;36664:5;:16;;36656:56;;;;;-1:-1:-1;;;36656:56:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36656:56:0;;;;;;;;;;;;;;;36735:31;;;;36546:316;36325:552;;36913:2;-1:-1:-1;;;;;36898:25:0;36907:4;-1:-1:-1;;;;;36898:25:0;;36917:5;36898:25;;;;;;;;;;;;;;;;;;-1:-1:-1;;36154:3:0;;36125:810;;;-1:-1:-1;36951:15:0;;;;;:55;;;36984:22;36970:10;:36;;36951:55;36947:384;;;37044:20;;;37087;;;37079:60;;;;;-1:-1:-1;;;37079:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37079:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37210:15:0;;;;;;:9;:15;;;;;37228:35;;;37210:53;;36947:384;37343:14;37360:12;:10;:12::i;:::-;37343:29;;37395:6;-1:-1:-1;;;;;37387:14:0;:4;-1:-1:-1;;;;;37387:14:0;;37383:91;;37418:44;37437:4;37443:6;37451:10;37418:18;:44::i;:::-;-1:-1:-1;37493:4:0;;35704:1801;-1:-1:-1;;;;;;;;;;35704:1801:0:o;47877:195::-;47964:4;48001:19;-1:-1:-1;;;;;47988:32:0;:9;-1:-1:-1;;;;;47988:32:0;;:76;;;;48045:18;-1:-1:-1;;;;;48024:40:0;:9;-1:-1:-1;;;;;48024:40:0;;47981:83;;47877:195;;;:::o;30892:121::-;-1:-1:-1;;;;;30987:18:0;30960:7;30987:18;;;:9;:18;;;;;;;30892:121::o;8513:492::-;8682:31;8700:12;:10;:12::i;:::-;8682:17;:31::i;:::-;8741:8;8775:23;;;:51;;;;-1:-1:-1;8802:24:0;;;8775:51;8767:90;;;;;-1:-1:-1;;;8767:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8873:9;8868:130;8893:6;8888:1;:11;8868:130;;8921:65;8962:8;;8971:1;8962:11;;;;;;;;;;;;;-1:-1:-1;;;;;8962:11:0;8975:7;;8983:1;8975:10;;;;;;;;;;;;;8935:6;;8942:1;8935:9;;;;;;;;;;;;;-1:-1:-1;;;;;8935:9:0;-1:-1:-1;;;;;8921:40:0;;;:65;;;;;:::i;:::-;8901:3;;8868:130;;;;8513:492;;;;;;;:::o;29032:50::-;;;;;;;;;;;;;;:::o;34008:1646::-;34124:4;34158:10;34194:23;;;34186:62;;;;;-1:-1:-1;;;34186:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34259:14;34276:12;:10;:12::i;:::-;-1:-1:-1;;;;;34317:17:0;;34299:15;34317:17;;;:9;:17;;;;;;34259:29;;-1:-1:-1;34299:15:0;;34417:810;34438:6;34433:1;:11;34417:810;;34466:10;34479;;34490:1;34479:13;;;;;;;;;;;;;-1:-1:-1;;;;;34479:13:0;34466:26;;34529:1;-1:-1:-1;;;;;34515:16:0;:2;-1:-1:-1;;;;;34515:16:0;;;34507:51;;;;;-1:-1:-1;;;34507:51:0;;;;;;;;;;;;-1:-1:-1;;;34507:51:0;;;;;;;;;;;;;;;34575:13;34591:6;;34598:1;34591:9;;;;;;;;;;;;;34575:25;;34619:5;34628:1;34619:10;34615:554;;34674:18;;;34719:26;;;34711:61;;;;;-1:-1:-1;;;34711:61:0;;;;;;;;;;;;-1:-1:-1;;;34711:61:0;;;;;;;;;;;;;;;34804:13;34791:26;;34850:2;-1:-1:-1;;;;;34840:12:0;:6;-1:-1:-1;;;;;34840:12:0;;34836:318;;-1:-1:-1;;;;;34877:13:0;;;;;;:9;:13;;;;;:22;;;;;;34836:318;;;34965:7;34956:5;:16;;34948:56;;;;;-1:-1:-1;;;34948:56:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34948:56:0;;;;;;;;;;;;;;;35027:31;;;;34836:318;34615:554;;35205:2;-1:-1:-1;;;;;35188:27:0;35197:6;-1:-1:-1;;;;;35188:27:0;;35209:5;35188:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;34446:3:0;;34417:810;;;-1:-1:-1;35243:15:0;;;;;:55;;;35276:22;35262:10;:36;;35243:55;35239:386;;;35336:20;;;35379;;;35371:60;;;;;-1:-1:-1;;;35371:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35371:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35502:17:0;;;;;;:9;:17;;;;;35522:35;;;35502:55;;35239:386;-1:-1:-1;35642:4:0;;34008:1646;-1:-1:-1;;;;;;;;;34008:1646:0:o;2876:96::-;2958:6;;-1:-1:-1;;;;;2958:6:0;2876:96;:::o;32174:98::-;32257:7;32250:14;;;;;;;-1:-1:-1;;32250:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32224:13;;32250:14;;32257:7;;32250:14;;32257:7;32250:14;;;;;;;;;;;;;;;;;;;;;;;;49899:39;;;;;;;;;;;;;;-1:-1:-1;;;49899:39:0;;;;:::o;33546:281::-;33650:4;-1:-1:-1;;;;;33675:21:0;;33667:61;;;;;-1:-1:-1;;;33667:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33739:58;33758:12;:10;:12::i;:::-;33772:7;33781:15;33739:18;:58::i;31441:161::-;31521:4;31538:34;31548:12;:10;:12::i;:::-;31562:2;31566:5;31538:9;:34::i;38184:485::-;38351:4;38368:14;38385:12;:10;:12::i;:::-;38368:29;;38408:39;38422:6;38430:4;38436:2;38440:6;38408:13;:39::i;:::-;38462:15;:2;-1:-1:-1;;;;;38462:13:0;;:15::i;:::-;38458:182;;;-1:-1:-1;;;;;;;;38502:98:0;;38517:2;-1:-1:-1;;;;;38502:34:0;;38537:6;38545:4;38551:6;38559:4;;38502:62;;;;;;;;;;;;;-1:-1:-1;;;;;38502:62:0;;;;;;-1:-1:-1;;;;;38502:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38502:62:0;-1:-1:-1;;;;;;38502:98:0;;38494:134;;;;;-1:-1:-1;;;38494:134:0;;;;;;;;;;;;-1:-1:-1;;;38494:134:0;;;;;;;;;;;;;;;-1:-1:-1;38657:4:0;;38184:485;-1:-1:-1;;;;;;38184:485:0:o;9831:522::-;10005:31;10023:12;:10;:12::i;10005:31::-;10064:8;10098:26;;;:55;;;;-1:-1:-1;10128:25:0;;;10098:55;10090:94;;;;;-1:-1:-1;;;10090:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10200:9;10195:151;10220:6;10215:1;:11;10195:151;;10267:9;;10277:1;10267:12;;;;;;;;;;;;;-1:-1:-1;;;;;10267:12:0;-1:-1:-1;;;;;10248:45:0;;10302:4;10309:8;;10318:1;10309:11;;;;;;;;;;;;;-1:-1:-1;;;;;10309:11:0;10322:8;;10331:1;10322:11;;;;;;;;;;;;;10248:86;;;;;;;;;;;;;-1:-1:-1;;;;;10248:86:0;;;;;;-1:-1:-1;;;;;10248:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10228:3;;;;;10195:151;;28841:42;;;:::o;39299:727::-;-1:-1:-1;;;;;39526:19:0;;39518:57;;;;;-1:-1:-1;;;39518:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39613:8;39594:15;:27;;39586:61;;;;;-1:-1:-1;;;39586:61:0;;;;;;;;;;;;-1:-1:-1;;;39586:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39740:13:0;;;39658:18;39740:13;;;;;;;;;;;:15;;;;;;;;39689:77;;28766:66;39689:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39679:88;;;;;;;;39832:18;:16;:18::i;:::-;39852:10;39803:60;;;;;;-1:-1:-1;;;39803:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39793:71;;;;;;39778:86;;39875:14;39892:24;39902:4;39908:1;39911;39914;39892:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39875:41;;39945:5;-1:-1:-1;;;;;39935:15:0;:6;-1:-1:-1;;;;;39935:15:0;;39927:49;;;;;-1:-1:-1;;;39927:49:0;;;;;;;;;;;;-1:-1:-1;;;39927:49:0;;;;;;;;;;;;;;;39987:31;39996:5;40003:7;40012:5;39987:8;:31::i;:::-;39299:727;;;;;;;;;;:::o;31049:151::-;-1:-1:-1;;;;;31165:18:0;;;31138:7;31165:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31049:151::o;51119:139::-;51187:31;51205:12;:10;:12::i;51187:31::-;51229:21;:9;51241;;51229:21;:::i;:::-;;51119:139;;:::o;37685:450::-;37825:4;37842:14;37859:12;:10;:12::i;:::-;37842:29;;37882;37892:6;37900:2;37904:6;37882:9;:29::i;:::-;37926:15;:2;-1:-1:-1;;;;;37926:13:0;;:15::i;:::-;37922:184;;;-1:-1:-1;;;;;;;;37966:100:0;;37981:2;-1:-1:-1;;;;;37966:34:0;;38001:6;38009;38017;38025:4;;37966:64;;;;;;;;;;;;;-1:-1:-1;;;;;37966:64:0;;;;;;-1:-1:-1;;;;;37966:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37966:64:0;-1:-1:-1;;;;;;37966:100:0;;37958:136;;;;;-1:-1:-1;;;37958:136:0;;;;;;;;;;;;-1:-1:-1;;;37958:136:0;;;;;;;;;;;;;;;-1:-1:-1;38123:4:0;;37685:450;-1:-1:-1;;;;;37685:450:0:o;3219:201::-;3299:31;3317:12;:10;:12::i;3299:31::-;3341:6;:17;;-1:-1:-1;;;;;;3341:17:0;-1:-1:-1;;;;;3341:17:0;;;;;;;;;;3374:38;;3341:17;;3395:6;;3374:38;;-1:-1:-1;;3374:38:0;3219:201;:::o;51266:185::-;51371:15;51406:37;:35;:37::i;:::-;51399:44;;51266:185;:::o;40165:281::-;-1:-1:-1;;;;;40292:21:0;;40284:61;;;;;-1:-1:-1;;;40284:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40356:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;40407:31;;;;;;;;;;;;;;;;;40165:281;;;:::o;41739:273::-;41882:26;41892:4;41898:2;41902:5;41882:9;:26::i;:::-;41931:6;-1:-1:-1;;;;;41923:14:0;:4;-1:-1:-1;;;;;41923:14:0;;41919:86;;41954:39;41973:4;41979:6;41987:5;41954:18;:39::i;:::-;41739:273;;;;:::o;45562:474::-;45875:16;;;;;;;45724:289;;;45757:95;45724:289;;;;;;;;;;;45914:14;45724:289;;;;;;;;;;;45989:4;45724:289;;;;;;;;;;;;;;;;;;;;;;;;;45696:332;;;;;;45562:474::o;40454:697::-;-1:-1:-1;;;;;40614:18:0;;;40593;40614;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;40658:31:0;;;;;:55;;-1:-1:-1;40693:20:0;;;40658:55;40654:438;;;40873:28;;;40924:25;;;40916:67;;;;;-1:-1:-1;;;40916:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40998:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:42;;;41028:12;-1:-1:-1;40654:438:0;41123:7;-1:-1:-1;;;;;41107:36:0;41116:5;-1:-1:-1;;;;;41107:36:0;;41132:10;41107:36;;;;;;;;;;;;;;;;;;40454:697;;;;:::o;3551:138::-;3642:4;-1:-1:-1;;;;;3642:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3642:12:0;-1:-1:-1;;;;;3631:23:0;;;;;;3623:58;;;;;-1:-1:-1;;;3623:58:0;;;;;;;;;;;;-1:-1:-1;;;3623:58:0;;;;;;;;;;;;;;;3551:138;:::o;5506:229::-;5668:58;;;-1:-1:-1;;;;;5668:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5668:58:0;-1:-1:-1;;;5668:58:0;;;5633:94;;5661:5;;5633:27;:94::i;41159:572::-;-1:-1:-1;;;;;41289:16:0;;41281:51;;;;;-1:-1:-1;;;41281:51:0;;;;;;;;;;;;-1:-1:-1;;;41281:51:0;;;;;;;;;;;;;;;41349:10;;41345:336;;-1:-1:-1;;;;;41394:15:0;;41376;41394;;;:9;:15;;;;;;41445;;;41483:20;;;41475:60;;;;;-1:-1:-1;;;41475:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41475:60:0;;;;;;;;;;;;;;;41562:2;-1:-1:-1;;;;;41554:10:0;:4;-1:-1:-1;;;;;41554:10:0;;41550:120;;-1:-1:-1;;;;;41585:15:0;;;;;;;:9;:15;;;;;;:28;;;41632:13;;;;;;:22;;;;;;41550:120;41345:336;;;41713:2;-1:-1:-1;;;;;41698:25:0;41707:4;-1:-1:-1;;;;;41698:25:0;;41717:5;41698:25;;;;;;;;;;;;;;;;;;41159:572;;;:::o;4699:387::-;5022:20;5070:8;;;4699:387::o;48080:922::-;48133:15;48189:10;48133:15;48235:27;:25;:27::i;:::-;48210:52;;48298:18;-1:-1:-1;;;;;48277:40:0;:9;-1:-1:-1;;;;;48277:40:0;;:76;;;;48334:19;-1:-1:-1;;;;;48321:32:0;:9;-1:-1:-1;;;;;48321:32:0;;48277:76;48273:169;;;48424:6;-1:-1:-1;48417:13:0;;-1:-1:-1;48417:13:0;48273:169;-1:-1:-1;;;;;48846:22:0;;48859:9;48846:22;;;;:78;;;48872:18;-1:-1:-1;;;;;48872:33:0;;48906:6;48914:9;48872:52;;;;;;;;;;;;;-1:-1:-1;;;;;48872:52:0;;;;;;-1:-1:-1;;;;;48872:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48872:52:0;48846:78;48842:124;;;48948:6;-1:-1:-1;48941:13:0;;-1:-1:-1;48941:13:0;48842:124;-1:-1:-1;48985:9:0;-1:-1:-1;48080:922:0;:::o;6262:892::-;6388:5;6413:19;-1:-1:-1;;;;;6413:17:0;;;:19::i;:::-;6405:58;;;;;-1:-1:-1;;;6405:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6537:12;6551:17;6572:6;-1:-1:-1;;;;;6572:11:0;6584:8;6572:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6572:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6536:57;;;;6608:7;6604:543;;;6636:11;;:16;6632:124;;6692:4;6681:24;;;;;;;;;;;;;;;-1:-1:-1;6681:24:0;6673:67;;;;;-1:-1:-1;;;6673:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6604:543;;;6847:11;;6843:97;;6884:40;;;-1:-1:-1;;;6884:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6843:97;7071:4;7065:11;7116:4;7109;7105:2;7101:13;7094:27;7034:102;6262:892;;;;;:::o;46211:526::-;-1:-1:-1;;46698:14:0;46694:23;46681:37;46677:2;46673:46;;46648:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://1f9c631b722e0bd11309a56d5c35d0eefcf0557bb95f5a05add164a843e69f72
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.