ETH Price: $2,241.47 (-2.99%)
Gas: 42 Gwei

Contract

0x46e98FFE40E408bA6412bEb670507e083C8B95ff
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

PRIMATE (PRIMATE) (@$0.0043)

Multi Chain

Multichain Addresses

Transaction Hash
Method
Block
From
To
Value
0xe071c1fc5fa0c521b0f9227602e555536ba7789251979b8e8fd5136f86a0ea0cSafe Transfer(pending)2023-12-03 2:06:153 days 22 hrs ago1701569175IN
Primate: Old PRIMATE Token
0 ETH(Pending)(Pending)
Transfer187208252023-12-05 14:46:111 day 10 hrs ago1701787571IN
Primate: Old PRIMATE Token
0 ETH0.0027032478
Transfer187207402023-12-05 14:29:111 day 10 hrs ago1701786551IN
Primate: Old PRIMATE Token
0 ETH0.0046042389
Safe Transfer187076212023-12-03 18:23:353 days 6 hrs ago1701627815IN
Primate: Old PRIMATE Token
0 ETH0.0049179437.26988345
Approve186965862023-12-02 5:19:354 days 19 hrs ago1701494375IN
Primate: Old PRIMATE Token
0 ETH0.0011924225.65243648
Transfer186959632023-12-02 3:14:114 days 21 hrs ago1701486851IN
Primate: Old PRIMATE Token
0 ETH0.0018568835.88529717
Safe Transfer186914332023-12-01 12:01:595 days 12 hrs ago1701432119IN
Primate: Old PRIMATE Token
0 ETH0.0036412731.70098918
Safe Transfer186914252023-12-01 12:00:235 days 13 hrs ago1701432023IN
Primate: Old PRIMATE Token
0 ETH0.003654931.81859787
Safe Transfer186807392023-11-30 0:06:597 days 54 mins ago1701302819IN
Primate: Old PRIMATE Token
0 ETH0.0051258735.36133809
Safe Transfer186789082023-11-29 17:58:477 days 7 hrs ago1701280727IN
Primate: Old PRIMATE Token
0 ETH0.0041785536.36722239
Approve186672322023-11-28 2:45:238 days 22 hrs ago1701139523IN
Primate: Old PRIMATE Token
0 ETH0.0007802731.8168922
Transfer186575092023-11-26 18:04:1110 days 6 hrs ago1701021851IN
Primate: Old PRIMATE Token
0 ETH0.0021732942
Safe Transfer186502652023-11-25 17:41:3511 days 7 hrs ago1700934095IN
Primate: Old PRIMATE Token
0 ETH0.0034030325.79326414
Safe Transfer186431942023-11-24 17:55:5912 days 7 hrs ago1700848559IN
Primate: Old PRIMATE Token
0 ETH0.0046666932.19322293
Approve186293802023-11-22 19:31:4714 days 5 hrs ago1700681507IN
Primate: Old PRIMATE Token
0 ETH0.0014170252.66191828
Approve186293802023-11-22 19:31:4714 days 5 hrs ago1700681507IN
Primate: Old PRIMATE Token
0 ETH0.0024649952.66191828
Safe Transfer186260752023-11-22 8:25:1114 days 16 hrs ago1700641511IN
Primate: Old PRIMATE Token
0 ETH0.0030739623.29381023
Safe Transfer186099112023-11-20 2:05:5916 days 22 hrs ago1700445959IN
Primate: Old PRIMATE Token
0 ETH0.0025842119.58705418
Safe Transfer186073972023-11-19 17:38:4717 days 7 hrs ago1700415527IN
Primate: Old PRIMATE Token
0 ETH0.006136742.33522722
Safe Transfer185973822023-11-18 7:55:2318 days 17 hrs ago1700294123IN
Primate: Old PRIMATE Token
0 ETH0.0022587517.12308225
Safe Transfer185767142023-11-15 10:31:5921 days 14 hrs ago1700044319IN
Primate: Old PRIMATE Token
0 ETH0.0034479323.78391469
Transfer From185711612023-11-14 15:52:5922 days 9 hrs ago1699977179IN
Primate: Old PRIMATE Token
0 ETH0.004095774.7950754
Permit185711602023-11-14 15:52:4722 days 9 hrs ago1699977167IN
Primate: Old PRIMATE Token
0 ETH0.0056339275.75121665
Transfer185499512023-11-11 16:42:2325 days 8 hrs ago1699720943IN
Primate: Old PRIMATE Token
0 ETH0.0018227835.22630409
Transfer185499442023-11-11 16:40:5925 days 8 hrs ago1699720859IN
Primate: Old PRIMATE Token
0 ETH0.0008066133.32446799
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.