ETH Price: $2,461.32 (-20.99%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Airdrop207113892024-09-09 6:52:59146 days ago1725864779IN
0x61A7CE2E...6d5980325
0 ETH0.000118091.1337
Claim Airdrop207113872024-09-09 6:52:35146 days ago1725864755IN
0x61A7CE2E...6d5980325
0 ETH0.000137481.1337
Claim Airdrop205839082024-08-22 11:40:59164 days ago1724326859IN
0x61A7CE2E...6d5980325
0 ETH0.000174381.43772332
Claim Airdrop201542492024-06-23 12:00:11224 days ago1719144011IN
0x61A7CE2E...6d5980325
0 ETH0.000252882.08561723
Claim Airdrop189823182024-01-11 7:51:47388 days ago1704959507IN
0x61A7CE2E...6d5980325
0 ETH0.0024257820
Claim Airdrop189452582024-01-06 2:37:47393 days ago1704508667IN
0x61A7CE2E...6d5980325
0 ETH0.0016463713.57669101
Claim Airdrop184580272023-10-29 19:49:47462 days ago1698608987IN
0x61A7CE2E...6d5980325
0 ETH0.0019841916.36243721
Claim Airdrop183673752023-10-17 3:20:35474 days ago1697512835IN
0x61A7CE2E...6d5980325
0 ETH0.000658215.42791934
Claim Airdrop182854512023-10-05 16:17:59486 days ago1696522679IN
0x61A7CE2E...6d5980325
0 ETH0.0015033714.43098735
Claim Airdrop181913992023-09-22 12:31:47499 days ago1695385907IN
0x61A7CE2E...6d5980325
0 ETH0.000836558.02970724
Claim Airdrop181913832023-09-22 12:28:35499 days ago1695385715IN
0x61A7CE2E...6d5980325
0 ETH0.001010718.33475241
Claim Airdrop181913782023-09-22 12:27:35499 days ago1695385655IN
0x61A7CE2E...6d5980325
0 ETH0.000854588.20284772
Claim Airdrop180705272023-09-05 13:18:35516 days ago1693919915IN
0x61A7CE2E...6d5980325
0 ETH0.0008363112.93566029
Claim Airdrop180703242023-09-05 12:37:35516 days ago1693917455IN
0x61A7CE2E...6d5980325
0 ETH0.0006764210.46252144
Claim Airdrop180703012023-09-05 12:32:59516 days ago1693917179IN
0x61A7CE2E...6d5980325
0 ETH0.0006795110.51033972
Claim Airdrop180441972023-09-01 20:51:59520 days ago1693601519IN
0x61A7CE2E...6d5980325
0 ETH0.00126714.5476105
Claim Airdrop179511552023-08-19 20:19:23533 days ago1692476363IN
0x61A7CE2E...6d5980325
0 ETH0.0018130214.94887577
Claim Airdrop179387052023-08-18 2:28:35534 days ago1692325715IN
0x61A7CE2E...6d5980325
0 ETH0.0026683522
Claim Airdrop179113742023-08-14 6:44:35538 days ago1691995475IN
0x61A7CE2E...6d5980325
0 ETH0.0015119312.46676074
Claim Airdrop179064742023-08-13 14:16:23539 days ago1691936183IN
0x61A7CE2E...6d5980325
0 ETH0.001745416.75809393
Claim Airdrop178871362023-08-10 21:21:35542 days ago1691702495IN
0x61A7CE2E...6d5980325
0 ETH0.0012144821.57056218
Claim Airdrop178871352023-08-10 21:21:23542 days ago1691702483IN
0x61A7CE2E...6d5980325
0 ETH0.0024443820.15652771
Claim Airdrop177016362023-07-15 22:10:11568 days ago1689459011IN
0x61A7CE2E...6d5980325
0 ETH0.0007758411.99679256
Claim Airdrop177016282023-07-15 22:08:35568 days ago1689458915IN
0x61A7CE2E...6d5980325
0 ETH0.0007959412.30758426
Claim Airdrop176839892023-07-13 10:28:11570 days ago1689244091IN
0x61A7CE2E...6d5980325
0 ETH0.0018649815.37785842
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
168493642023-03-17 18:39:35688 days ago1679078375
0x61A7CE2E...6d5980325
 Contract Creation0 ETH
168493642023-03-17 18:39:35688 days ago1679078375
0x61A7CE2E...6d5980325
 Contract Creation0 ETH
168493642023-03-17 18:39:35688 days ago1679078375
0x61A7CE2E...6d5980325
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20Token

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 25 : ERC20Token.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

import { StorageBase } from './StorageBase.sol';
import { NonReentrant } from './NonReentrant.sol';
import { ERC20TokenAutoProxy } from './ERC20TokenAutoProxy.sol';

import { LibClaimAirdrop } from './libraries/LibClaimAirdrop.sol';

import { IERC20Token } from './interfaces/IERC20Token.sol';
import { IGovernedProxy } from './interfaces/IGovernedProxy.sol';
import { IERC20TokenStorage } from './interfaces/IERC20TokenStorage.sol';
import { IGovernedContract } from './interfaces/IGovernedContract.sol';
import { IERC20TokenGovernedProxy } from './interfaces/IERC20TokenGovernedProxy.sol';

contract ERC20TokenStorage is StorageBase, IERC20TokenStorage {
    string private name;

    string private symbol;

    uint8 private decimals;

    address private airdropService; // Signs ERC20 airdrop rewards claims

    address private eRC721ManagerProxy; // Can burn tokens

    // ERC20 airdrops lastClaimNonce mappings are stored by airdropId
    mapping(bytes4 => mapping(address => uint256)) private airdropLastClaimNonce;

    constructor(
        address _airdropService,
        address _eRC721ManagerProxy,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) public {
        airdropService = _airdropService;
        eRC721ManagerProxy = _eRC721ManagerProxy;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    function getName() external view returns (string memory _name) {
        _name = name;
    }

    function getSymbol() external view returns (string memory _symbol) {
        _symbol = symbol;
    }

    function getDecimals() external view returns (uint8 _decimals) {
        _decimals = decimals;
    }

    function getAirdropService() external view returns (address _airdropService) {
        _airdropService = airdropService;
    }

    function getERC721ManagerProxy() external view returns (address _eRC721ManagerProxy) {
        _eRC721ManagerProxy = eRC721ManagerProxy;
    }

    function getAirdropLastClaimNonce(bytes4 airdropId, address _user)
        external
        view
        returns (uint256 _lastClaimNonce)
    {
        _lastClaimNonce = airdropLastClaimNonce[airdropId][_user];
    }

    function setName(string calldata _name) external requireOwner {
        name = _name;
    }

    function setSymbol(string calldata _symbol) external requireOwner {
        symbol = _symbol;
    }

    function setDecimals(uint8 _decimals) external requireOwner {
        decimals = _decimals;
    }

    function setAirdropService(address _airdropService) external requireOwner {
        airdropService = _airdropService;
    }

    function setERC721ManagerProxy(address _eRC721ManagerProxy) external requireOwner {
        eRC721ManagerProxy = _eRC721ManagerProxy;
    }

    function setAirdropLastClaimNonce(
        bytes4 airdropId,
        address _user,
        uint256 _lastClaimNonce
    ) external requireOwner {
        airdropLastClaimNonce[airdropId][_user] = _lastClaimNonce;
    }
}

contract ERC20Token is NonReentrant, ERC20TokenAutoProxy, IERC20Token {
    // Data for migration
    //---------------------------------
    ERC20TokenStorage public eRC20TokenStorage;
    //---------------------------------

    modifier onlyERC20TokenOwner() {
        require(_callerAddress() == owner, 'ERC20Token: FORBIDDEN');
        _;
    }

    modifier onlyERC20TokenOwnerOrERC721Manager() {
        require(
            _callerAddress() == owner ||
                msg.sender ==
                address(
                    IGovernedProxy(address(uint160(eRC20TokenStorage.getERC721ManagerProxy())))
                        .impl()
                ),
            'ERC20Token: FORBIDDEN'
        );
        _;
    }

    constructor(
        address _proxy, // If set to address(0), ERC20TokenGovernedProxy will be deployed by ERC20TokenAutoProxy
        address _airdropService,
        address _eRC721ManagerProxy,
        address _owner,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) public ERC20TokenAutoProxy(_proxy, this, _owner) {
        // Deploy ERC20 Token storage
        eRC20TokenStorage = new ERC20TokenStorage(
            _airdropService,
            _eRC721ManagerProxy,
            _name,
            _symbol,
            _decimals
        );
    }

    // Governance functions
    //
    // This function allows to set sporkProxy address after deployment in order to enable upgrades
    function setSporkProxy(address payable _sporkProxy) public onlyERC20TokenOwner {
        IERC20TokenGovernedProxy(proxy).setSporkProxy(_sporkProxy);
    }

    // This function is called in order to upgrade to a new implementation
    function destroy(IGovernedContract _newImpl) external requireProxy {
        eRC20TokenStorage.setOwner(_newImpl);
        _destroyERC20(_newImpl);
        _destroy(_newImpl);
    }

    // This function would be called on the new implementation if necessary for the upgrade
    function migrate(IGovernedContract _oldImpl) external requireProxy {
        _migrateERC20(address(_oldImpl));
        _migrate(_oldImpl);
    }

    // Getter functions
    //
    function name() external view returns (string memory _name) {
        _name = eRC20TokenStorage.getName();
    }

    function symbol() external view returns (string memory _symbol) {
        _symbol = eRC20TokenStorage.getSymbol();
    }

    function decimals() external view returns (uint8 _decimals) {
        _decimals = eRC20TokenStorage.getDecimals();
    }

    function getAirdropService() external view returns (address _airdropService) {
        _airdropService = eRC20TokenStorage.getAirdropService();
    }

    function getAirdropLastClaimNonce(bytes4 airdropId, address _user)
        external
        view
        returns (uint256 _lastClaimNonce)
    {
        _lastClaimNonce = eRC20TokenStorage.getAirdropLastClaimNonce(airdropId, _user);
    }

    // Setter functions
    //
    function setName(string calldata _name) external onlyERC20TokenOwner {
        eRC20TokenStorage.setName(_name);
    }

    function setSymbol(string calldata _symbol) external onlyERC20TokenOwner {
        eRC20TokenStorage.setSymbol(_symbol);
    }

    function setDecimals(uint8 _decimals) external onlyERC20TokenOwner {
        eRC20TokenStorage.setDecimals(_decimals);
    }

    function setAirdropService(address _airdropService) external onlyERC20TokenOwner {
        eRC20TokenStorage.setAirdropService(_airdropService);
    }

    function setERC721ManagerProxy(address _eRC721ManagerProxy) external onlyERC20TokenOwner {
        eRC20TokenStorage.setERC721ManagerProxy(_eRC721ManagerProxy);
    }

    // Mint/burn functions
    //
    function mint(address recipient, uint256 amount) external onlyERC20TokenOwner {
        _mint(recipient, amount);
        IERC20TokenGovernedProxy(proxy).emitTransfer(address(0x0), recipient, amount);
    }

    function burn(address account, uint256 amount) external onlyERC20TokenOwnerOrERC721Manager {
        _burn(account, amount);
        IERC20TokenGovernedProxy(proxy).emitTransfer(account, address(0x0), amount);
    }

    // ERC20 airdrop and airdrop referral rewards claim function
    function claimAirdrop(
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce,
        bytes calldata airdropServiceSignature
    ) external noReentry {
        // Get rewards recipient address
        address recipient = _callerAddress();
        // Make sure claim has not been processed yet
        require(
            lastClaimNonce == eRC20TokenStorage.getAirdropLastClaimNonce(airdropId, recipient),
            'ERC20Token: invalid lastClaimNonce value'
        );
        // Check that claimNonce > lastClaimNonce
        require(
            lastClaimNonce < claimNonce,
            'ERC20Token: claimNonce must be larger than lastClaimNonce'
        );
        // Validate airdrop claim
        LibClaimAirdrop.validateClaim(
            recipient, // Referral rewards claim recipient address
            claimAmountAirdrop, // Claim amount corresponding to ERC20 airdrop
            claimAmountReferral1, // Claim amount corresponding to first level of ERC20 airdrop referral rewards
            claimAmountReferral2, // Claim amount corresponding to second level of ERC20 airdrop referral rewards
            claimAmountReferral3, // Claim amount corresponding to third level of ERC20 airdrop referral rewards
            airdropId, // Airdrop campaign Id
            lastClaimNonce, // Recipient's last claim nonce
            claimNonce, // Recipient's current claim nonce
            airdropServiceSignature, // Claim signature from ERC20 airdrop service
            proxy, // Verifying contract address
            eRC20TokenStorage.getAirdropService() // Airdrop service address
        );
        // Update recipient's last claim nonce to current claim nonce
        eRC20TokenStorage.setAirdropLastClaimNonce(airdropId, recipient, claimNonce);
        // Mint total claim amount to recipient
        mintAirdropClaim(
            recipient,
            claimAmountAirdrop,
            claimAmountReferral1,
            claimAmountReferral2,
            claimAmountReferral3
        );
        // Emit AirdropRewardsClaimed event
        IERC20TokenGovernedProxy(proxy).emitAirdropRewardsClaimed(
            recipient,
            claimAmountAirdrop,
            claimAmountReferral1,
            claimAmountReferral2,
            claimAmountReferral3,
            airdropId,
            lastClaimNonce,
            claimNonce,
            airdropServiceSignature
        );
    }

    function mintAirdropClaim(
        address recipient,
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3
    ) private {
        // Calculate total claim amount
        uint256 totalClaimAmount = claimAmountAirdrop
            .add(claimAmountReferral1)
            .add(claimAmountReferral2)
            .add(claimAmountReferral3);
        // Mint total claim amount to recipient
        _mint(recipient, totalClaimAmount);
        // Emit Transfer event
        IERC20TokenGovernedProxy(proxy).emitTransfer(address(0x0), recipient, totalClaimAmount);
    }
}

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

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 3 of 25 : LibSignature.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

library LibSignature {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert('LibSignature: invalid ECDSA signature length');
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(
            uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
            'LibSignature: invalid ECDSA signature `s` value'
        );

        // If the signature is valid (and not malleable), return the signer address
        // v > 30 is a special case, we need to adjust hash with '\x19Ethereum Signed Message:\n32'
        // and v = v - 4
        address signer;
        if (v > 30) {
            require(v - 4 == 27 || v - 4 == 28, 'LibSignature: invalid ECDSA signature `v` value');
            signer = ecrecover(toEthSignedMessageHash(hash), v - 4, r, s);
        } else {
            require(v == 27 || v == 28, 'LibSignature: invalid ECDSA signature `v` value');
            signer = ecrecover(hash, v, r, s);
        }

        require(signer != address(0), 'LibSignature: invalid ECDSA signature');

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', hash));
    }
}

File 4 of 25 : LibEIP712.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

library LibEIP712 {
    // Calculates EIP712 encoding for a hash struct in this EIP712 Domain.
    // Note that we use the verifying contract's proxy address here instead of the verifying contract's address,
    // so that users signatures remain valid when we upgrade the ERC20Token contract
    function hashEIP712Message(bytes32 hashStruct, address verifyingContractProxy)
        internal
        pure
        returns (bytes32 result)
    {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }

        bytes32 eip712DomainHash = keccak256(
            abi.encode(
                keccak256(
                    'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'
                ),
                keccak256(bytes('Energi')),
                keccak256(bytes('1')),
                chainId,
                verifyingContractProxy
            )
        );

        result = keccak256(abi.encodePacked('\x19\x01', eip712DomainHash, hashStruct));
    }
}

File 5 of 25 : LibClaimAirdrop.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

import { LibEIP712 } from './LibEIP712.sol';
import { LibSignature } from './LibSignature.sol';

library LibClaimAirdrop {
    bytes32 constant AIRDROP_CLAIM_TYPEHASH =
        keccak256(
            'ERC20Claim(address recipient,uint256 claimAmountAirdrop,uint256 claimAmountReferral1,uint256 claimAmountReferral2,uint256 claimAmountReferral3,bytes4 airdropId,uint256 lastClaimNonce,uint256 claimNonce)'
        );

    function hashClaim(
        address recipient,
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce
    ) internal pure returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    AIRDROP_CLAIM_TYPEHASH,
                    recipient,
                    claimAmountAirdrop,
                    claimAmountReferral1,
                    claimAmountReferral2,
                    claimAmountReferral3,
                    airdropId,
                    lastClaimNonce,
                    claimNonce
                )
            );
    }

    function validateClaim(
        address recipient,
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce,
        bytes memory airdropServiceSignature,
        address verifyingContractProxy,
        address airdropService
    ) internal pure {
        // Generate EIP712 hashStruct of airdropClaim
        bytes32 hashStruct = hashClaim(
            recipient,
            claimAmountAirdrop,
            claimAmountReferral1,
            claimAmountReferral2,
            claimAmountReferral3,
            airdropId,
            lastClaimNonce,
            claimNonce
        );
        // Verify claim EIP712 hashStruct signature
        if (
            LibSignature.recover(
                LibEIP712.hashEIP712Message(hashStruct, verifyingContractProxy),
                airdropServiceSignature
            ) != airdropService
        ) {
            revert('LibClaimAirdrop: EIP-712 airdrop service signature verification error');
        }
    }
}

File 6 of 25 : IUpgradeProposal.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

import { IProposal } from './IProposal.sol';
import { IGovernedContract } from './IGovernedContract.sol';

contract IUpgradeProposal is IProposal {
    function impl() external view returns (IGovernedContract);
}

File 7 of 25 : ISporkRegistry.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

import { IGovernedContract } from './IGovernedContract.sol';
import { IUpgradeProposal } from './IUpgradeProposal.sol';

interface ISporkRegistry {
    function createUpgradeProposal(
        IGovernedContract _impl,
        uint256 _period,
        address payable _fee_payer
    ) external payable returns (IUpgradeProposal);

    function consensusGasLimits() external view returns (uint256 callGas, uint256 xferGas);
}

File 8 of 25 : IProposal.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

interface IProposal {
    function parent() external view returns (address);

    function created_block() external view returns (uint256);

    function deadline() external view returns (uint256);

    function fee_payer() external view returns (address payable);

    function fee_amount() external view returns (uint256);

    function accepted_weight() external view returns (uint256);

    function rejected_weight() external view returns (uint256);

    function total_weight() external view returns (uint256);

    function quorum_weight() external view returns (uint256);

    function isFinished() external view returns (bool);

    function isAccepted() external view returns (bool);

    function withdraw() external;

    function destroy() external;

    function collect() external;

    function voteAccept() external;

    function voteReject() external;

    function setFee() external payable;

    function canVote(address owner) external view returns (bool);
}

File 9 of 25 : IOwnedERC20.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

interface IOwnedERC20 {
    function owner() external view returns (address _owner);

    function setOwner(address _owner) external;

    function mint(address recipient, uint256 amount) external;

    function burn(address recipient, uint256 amount) external;
}

File 10 of 25 : IGovernedProxy.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

import { IGovernedContract } from './IGovernedContract.sol';
import { IUpgradeProposal } from './IUpgradeProposal.sol';

interface IGovernedProxy {
    event UpgradeProposal(IGovernedContract indexed impl, IUpgradeProposal proposal);

    event Upgraded(IGovernedContract indexed impl, IUpgradeProposal proposal);

    function impl() external view returns (IGovernedContract);

    function proposeUpgrade(IGovernedContract _newImpl, uint256 _period)
        external
        payable
        returns (IUpgradeProposal);

    function upgrade(IUpgradeProposal _proposal) external;

    function upgradeProposalImpl(IUpgradeProposal _proposal)
        external
        view
        returns (IGovernedContract new_impl);

    function listUpgradeProposals() external view returns (IUpgradeProposal[] memory proposals);

    function collectUpgradeProposal(IUpgradeProposal _proposal) external;

    function() external payable;
}

File 11 of 25 : IGovernedERC20Storage.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

interface IGovernedERC20Storage {
    function setBalance(address _owner, uint256 _amount) external;

    function setAllowance(
        address _owner,
        address _spender,
        uint256 _amount
    ) external;

    function setTotalSupply(uint256 _amount) external;

    function getBalance(address _account) external view returns (uint256 balance);

    function getAllowance(address _owner, address _spender)
        external
        view
        returns (uint256 allowance);

    function getTotalSupply() external view returns (uint256 totalSupply);
}

File 12 of 25 : IGovernedERC20.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IGovernedERC20 {
    function erc20Storage() external view returns (address _erc20Storage);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function transfer(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function approve(
        address owner,
        address spender,
        uint256 amount
    ) external returns (bool);

    function transferFrom(
        address spender,
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function increaseAllowance(
        address sender,
        address spender,
        uint256 addedValue
    ) external returns (bool);

    function decreaseAllowance(
        address sender,
        address spender,
        uint256 subtractedValue
    ) external returns (bool);
}

File 13 of 25 : IGovernedContract.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

/**
 * Genesis version of GovernedContract interface.
 *
 * Base Consensus interface for upgradable contracts.
 * Unlike common approach, the implementation is NOT expected to be
 * called through delegatecall() to minimize risks of shared storage.
 *
 * NOTE: it MUST NOT change after blockchain launch!
 */

interface IGovernedContract {
    // Return actual proxy address for secure validation
    function proxy() external view returns (address);

    // It must check that the caller is the proxy
    // and copy all required data from the old address.
    function migrate(IGovernedContract _oldImpl) external;

    // It must check that the caller is the proxy
    // and self destruct to the new address.
    function destroy(IGovernedContract _newImpl) external;

    // function () external payable; // This line (from original Energi IGovernedContract) is commented because it
    // makes truffle migrations fail
}

File 14 of 25 : IERC20TokenStorage.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

interface IERC20TokenStorage {
    function getName() external view returns (string memory _name);

    function getSymbol() external view returns (string memory _symbol);

    function getDecimals() external view returns (uint8 _decimals);

    function getAirdropService() external view returns (address _airdropService);

    function getAirdropLastClaimNonce(bytes4 airdropId, address _user)
        external
        view
        returns (uint256 _lastClaimNonce);

    function getERC721ManagerProxy() external view returns (address _eRC721ManagerProxy);

    function setName(string calldata _name) external;

    function setSymbol(string calldata _symbol) external;

    function setDecimals(uint8 _decimals) external;

    function setAirdropService(address _airdropService) external;

    function setAirdropLastClaimNonce(
        bytes4 airdropId,
        address _user,
        uint256 _lastClaimNonce
    ) external;

    function setERC721ManagerProxy(address _eRC721ManagerProxy) external;
}

File 15 of 25 : IERC20TokenGovernedProxy.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

interface IERC20TokenGovernedProxy {
    event AirdropRewardsClaimed(
        address indexed recipient,
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce,
        bytes airdropServiceSignature
    );

    // ERC20 events
    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function setSporkProxy(address payable _sporkProxy) external;

    function emitAirdropRewardsClaimed(
        address recipient,
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce,
        bytes calldata airdropServiceSignature
    ) external;

    function emitTransfer(
        address from,
        address to,
        uint256 value
    ) external;

    // ERC20 standard interface
    function name() external view returns (string memory _name);

    function symbol() external view returns (string memory _symbol);

    function decimals() external view returns (uint256 _decimals);

    function balanceOf(address account) external view returns (uint256 _balance);

    function allowance(address owner, address spender) external view returns (uint256 _allowance);

    function totalSupply() external view returns (uint256 _totalSupply);

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

    function transfer(address to, uint256 value) external returns (bool result);

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

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool result);

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool result);
}

File 16 of 25 : IERC20Token.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

interface IERC20Token {
    function eRC20TokenStorage() external view returns (address _eRC20TokenStorage);

    function name() external view returns (string memory _name);

    function symbol() external view returns (string memory _symbol);

    function decimals() external view returns (uint8 _decimals);

    function getAirdropService() external view returns (address _airdropService);

    function getAirdropLastClaimNonce(bytes4 airdropId, address _user)
        external
        view
        returns (uint256 _lastClaimNonce);

    // Setter functions
    //
    function setName(string calldata _name) external;

    function setSymbol(string calldata _symbol) external;

    function setDecimals(uint8 _decimals) external;

    function setAirdropService(address _airdropService) external;

    function setERC721ManagerProxy(address _eRC721ManagerProxy) external;

    // Mint/burn functions
    //
    function mint(address recipient, uint256 amount) external;

    function burn(address account, uint256 amount) external;

    // ERC20 airdrop and airdrop referral rewards claim function
    function claimAirdrop(
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce,
        bytes calldata airdropServiceSignature
    ) external;
}

File 17 of 25 : StorageBase.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

import { IGovernedContract } from './interfaces/IGovernedContract.sol';

/**
 * Base for contract storage (SC-14).
 *
 * NOTE: it MUST NOT change after blockchain launch!
 */

contract StorageBase {
    address payable internal owner;

    modifier requireOwner() {
        require(msg.sender == address(owner), 'Not owner!');
        _;
    }

    constructor() public {
        owner = msg.sender;
    }

    function setOwner(IGovernedContract _newOwner) external requireOwner {
        owner = address(uint160(address(_newOwner)));
    }

    function kill() external requireOwner {
        selfdestruct(msg.sender);
    }
}

File 18 of 25 : Pausable.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

import { Context } from './Context.sol';
import { Ownable } from './Ownable.sol';

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Context, Ownable {
    /**
     * @dev Emitted when pause() is called.
     * @param account of contract owner issuing the event.
     * @param unpauseBlock block number when contract will be unpaused.
     */
    event Paused(address account, uint256 unpauseBlock);

    /**
     * @dev Emitted when pause is lifted by unpause() by
     * @param account.
     */
    event Unpaused(address account);

    /**
     * @dev state variable
     */
    uint256 public blockNumberWhenToUnpause = 0;

    constructor(address _owner) public Ownable(_owner) {}

    /**
     * @dev Modifier to make a function callable only when the contract is not
     *      paused. It checks whether the current block number
     *      has already reached blockNumberWhenToUnpause.
     */
    modifier whenNotPaused() {
        require(
            block.number >= blockNumberWhenToUnpause,
            'Pausable: Revert - Code execution is still paused'
        );
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(
            block.number < blockNumberWhenToUnpause,
            'Pausable: Revert - Code execution is not paused'
        );
        _;
    }

    /**
     * @dev Triggers or extends pause state.
     *
     * Requirements:
     *
     * - @param blocks needs to be greater than 0.
     */
    function pause(uint256 blocks) external onlyOwner {
        require(
            blocks > 0,
            'Pausable: Revert - Pause did not activate. Please enter a positive integer.'
        );
        blockNumberWhenToUnpause = block.number + blocks;
        emit Paused(_msgSender(), blockNumberWhenToUnpause);
    }

    /**
     * @dev Returns to normal code execution.
     */
    function unpause() external onlyOwner {
        blockNumberWhenToUnpause = block.number;
        emit Unpaused(_msgSender());
    }
}

File 19 of 25 : Ownable.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of 'user permissions'.
 */
contract Ownable {
    address public owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor(address _owner) public {
        owner = _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner, 'Ownable: Not owner');
        _;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), 'Ownable: Zero address not allowed');
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}

File 20 of 25 : NonReentrant.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

/**
 * A little helper to protect contract from being re-entrant in state
 * modifying functions.
 */

contract NonReentrant {
    uint256 private entry_guard;

    modifier noReentry() {
        require(entry_guard == 0, 'Reentry');
        entry_guard = 1;
        _;
        entry_guard = 0;
    }
}

File 21 of 25 : GovernedERC20.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

import { Pausable } from './Pausable.sol';
import { GovernedContract } from './GovernedContract.sol';
import { StorageBase } from './StorageBase.sol';
import { Context } from './Context.sol';

import { IGovernedERC20 } from './interfaces/IGovernedERC20.sol';
import { IGovernedContract } from './interfaces/IGovernedContract.sol';
import { IGovernedERC20Storage } from './interfaces/IGovernedERC20Storage.sol';
import { SafeMath } from './libraries/SafeMath.sol';

/**
 * Permanent storage of GovernedERC20 data.
 */

contract GovernedERC20Storage is StorageBase, IGovernedERC20Storage {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    function setBalance(address _owner, uint256 _amount) external requireOwner {
        _balances[_owner] = _amount;
    }

    function setAllowance(
        address _owner,
        address _spender,
        uint256 _amount
    ) external requireOwner {
        _allowances[_owner][_spender] = _amount;
    }

    function setTotalSupply(uint256 _amount) external requireOwner {
        _totalSupply = _amount;
    }

    function getBalance(address _account) external view returns (uint256 balance) {
        balance = _balances[_account];
    }

    function getAllowance(address _owner, address _spender)
        external
        view
        returns (uint256 allowance)
    {
        allowance = _allowances[_owner][_spender];
    }

    function getTotalSupply() external view returns (uint256 totalSupply) {
        totalSupply = _totalSupply;
    }
}

contract GovernedERC20 is Pausable, GovernedContract, IGovernedERC20 {
    using SafeMath for uint256;

    // Data for migration
    //---------------------------------
    GovernedERC20Storage public erc20Storage;

    //---------------------------------

    constructor(address _proxy, address _owner) public Pausable(_owner) GovernedContract(_proxy) {
        erc20Storage = new GovernedERC20Storage();
    }

    // IGovernedContract
    //---------------------------------
    // This function would be called by GovernedProxy on an old implementation to replace it with a new one
    function _destroyERC20(IGovernedContract _newImpl) internal {
        erc20Storage.setOwner(_newImpl);
    }

    //---------------------------------
    // This function would be called on the new implementation if necessary for the upgrade
    function _migrateERC20(address _oldImpl) internal {
        erc20Storage = GovernedERC20Storage(IGovernedERC20(_oldImpl).erc20Storage());
    }

    // ERC20
    //---------------------------------
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() external view returns (uint256) {
        return erc20Storage.getTotalSupply();
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) external view returns (uint256) {
        return erc20Storage.getBalance(account);
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) external view returns (uint256) {
        return erc20Storage.getAllowance(owner, spender);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(
        address sender,
        address recipient,
        uint256 amount
    ) external requireProxy returns (bool) {
        _transfer(sender, recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address owner,
        address spender,
        uint256 amount
    ) external requireProxy returns (bool) {
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address spender,
        address sender,
        address recipient,
        uint256 amount
    ) external requireProxy returns (bool) {
        _transfer(sender, recipient, amount);
        uint256 approveAmount = erc20Storage.getAllowance(sender, spender).sub(
            amount,
            'ERC20Token ERC20: transfer amount exceeds allowance'
        );
        _approve(sender, spender, approveAmount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address owner,
        address spender,
        uint256 addedValue
    ) external requireProxy returns (bool) {
        uint256 approveAmount = erc20Storage.getAllowance(owner, spender).add(addedValue);
        _approve(owner, spender, approveAmount);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address owner,
        address spender,
        uint256 subtractedValue
    ) external requireProxy returns (bool) {
        uint256 approveAmount = erc20Storage.getAllowance(owner, spender).sub(
            subtractedValue,
            'ERC20Token ERC20: decreased allowance below zero'
        );
        _approve(owner, spender, approveAmount);
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal whenNotPaused {
        require(sender != address(0), 'ERC20Token ERC20: transfer from the zero address');
        require(recipient != address(0), 'ERC20Token ERC20: transfer to the zero address');

        erc20Storage.setBalance(
            sender,
            erc20Storage.getBalance(sender).sub(
                amount,
                'ERC20Token ERC20: transfer amount exceeds balance'
            )
        );
        erc20Storage.setBalance(recipient, erc20Storage.getBalance(recipient).add(amount));
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal whenNotPaused {
        require(account != address(0), 'ERC20Token ERC20: mint to the zero address');

        erc20Storage.setTotalSupply(erc20Storage.getTotalSupply().add(amount));
        erc20Storage.setBalance(account, erc20Storage.getBalance(account).add(amount));
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal whenNotPaused {
        require(account != address(0), 'ERC20Token ERC20: burn from the zero address');

        erc20Storage.setBalance(
            account,
            erc20Storage.getBalance(account).sub(
                amount,
                'ERC20Token ERC20: burn amount exceeds balance'
            )
        );
        erc20Storage.setTotalSupply(erc20Storage.getTotalSupply().sub(amount));
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal whenNotPaused {
        require(owner != address(0), 'ERC20Token ERC20: approve from the zero address');
        require(spender != address(0), 'ERC20Token ERC20: approve to the zero address');

        erc20Storage.setAllowance(owner, spender, amount);
    }
}

File 22 of 25 : GovernedContract.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

import { IGovernedContract } from './interfaces/IGovernedContract.sol';

/**
 * Genesis version of GovernedContract common base.
 *
 * Base Consensus interface for upgradable contracts.
 * Unlike common approach, the implementation is NOT expected to be
 * called through delegatecall() to minimize risks of shared storage.
 *
 * NOTE: it MUST NOT change after blockchain launch!
 */
contract GovernedContract is IGovernedContract {
    address public proxy;

    constructor(address _proxy) public {
        proxy = _proxy;
    }

    modifier requireProxy() {
        require(msg.sender == proxy, 'Governed Contract: Not proxy');
        _;
    }

    function getProxy() internal view returns (address _proxy) {
        _proxy = proxy;
    }

    // Function overridden in child contract
    function migrate(IGovernedContract _oldImpl) external requireProxy {
        _migrate(_oldImpl);
    }

    // Function overridden in child contract
    function destroy(IGovernedContract _newImpl) external requireProxy {
        _destroy(_newImpl);
    }

    // solium-disable-next-line no-empty-blocks
    function _migrate(IGovernedContract) internal {}

    function _destroy(IGovernedContract _newImpl) internal {
        selfdestruct(address(uint160(address(_newImpl))));
    }

    function _callerAddress() internal view returns (address payable) {
        if (msg.sender == proxy) {
            // This is guarantee of the GovernedProxy
            // solium-disable-next-line security/no-tx-origin
            return tx.origin;
        } else {
            return msg.sender;
        }
    }
}

File 23 of 25 : ERC20TokenGovernedProxy.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

// Energi Governance system is the fundamental part of Energi Core.

// NOTE: It's not allowed to change the compiler due to byte-to-byte
// match requirement.

pragma solidity 0.5.16;

import { NonReentrant } from './NonReentrant.sol';

import { SafeMath } from './libraries/SafeMath.sol';

import { IERC20TokenGovernedProxy } from './interfaces/IERC20TokenGovernedProxy.sol';
import { IGovernedContract } from './interfaces/IGovernedContract.sol';
import { IGovernedProxy } from './interfaces/IGovernedProxy.sol';
import { IUpgradeProposal } from './interfaces/IUpgradeProposal.sol';
import { ISporkRegistry } from './interfaces/ISporkRegistry.sol';
import { IGovernedERC20 } from './interfaces/IGovernedERC20.sol';
import { IOwnedERC20 } from './interfaces/IOwnedERC20.sol';
import { IERC20Token } from './interfaces/IERC20Token.sol';

/**
 * SC-9: This contract has no chance of being updated. It must be stupid simple.
 *
 * If another upgrade logic is required in the future - it can be done as proxy stage II.
 */
contract ERC20TokenGovernedProxy is IERC20TokenGovernedProxy, IGovernedProxy, NonReentrant {
    using SafeMath for uint256;

    IGovernedContract public impl;
    IGovernedContract public implementation; // only used for block explorers to detect contract as a proxy

    IGovernedProxy public spork_proxy;

    mapping(address => IGovernedContract) public upgrade_proposals;

    IUpgradeProposal[] public upgrade_proposal_list;

    modifier senderOrigin() {
        // Internal calls are expected to use impl directly.
        // That's due to use of call() instead of delegatecall() on purpose.
        // solium-disable-next-line security/no-tx-origin
        require(tx.origin == msg.sender, 'Only direct calls are allowed!');
        _;
    }

    modifier onlyImpl() {
        require(msg.sender == address(impl), 'Only calls from impl are allowed!');
        _;
    }

    constructor(IGovernedContract _impl) public {
        impl = _impl;
        implementation = _impl; // to allow block explorers to find the impl contract
    }

    function setSporkProxy(address payable _sporkProxy) external onlyImpl {
        spork_proxy = IGovernedProxy(_sporkProxy);
    }

    function emitAirdropRewardsClaimed(
        address recipient,
        uint256 claimAmountAirdrop,
        uint256 claimAmountReferral1,
        uint256 claimAmountReferral2,
        uint256 claimAmountReferral3,
        bytes4 airdropId,
        uint256 lastClaimNonce,
        uint256 claimNonce,
        bytes calldata airdropServiceSignature
    ) external onlyImpl {
        emit AirdropRewardsClaimed(
            recipient,
            claimAmountAirdrop,
            claimAmountReferral1,
            claimAmountReferral2,
            claimAmountReferral3,
            airdropId,
            lastClaimNonce,
            claimNonce,
            airdropServiceSignature
        );
    }

    function emitTransfer(
        address from,
        address to,
        uint256 value
    ) external onlyImpl {
        emit Transfer(from, to, value);
    }

    function emitApproval(
        address owner,
        address spender,
        uint256 value
    ) external onlyImpl {
        emit Approval(owner, spender, value);
    }

    // ERC20 standard functions
    //
    function name() external view returns (string memory _name) {
        _name = IERC20Token(address(uint160(address(impl)))).name();
    }

    function symbol() external view returns (string memory _symbol) {
        _symbol = IERC20Token(address(uint160(address(impl)))).symbol();
    }

    function decimals() external view returns (uint256 _decimals) {
        _decimals = IERC20Token(address(uint160(address(impl)))).decimals();
    }

    function balanceOf(address account) external view returns (uint256 _balance) {
        _balance = IGovernedERC20(address(uint160(address(impl)))).balanceOf(account);
    }

    function allowance(address owner, address spender) external view returns (uint256 _allowance) {
        _allowance = IGovernedERC20(address(uint160(address(impl)))).allowance(owner, spender);
    }

    function totalSupply() external view returns (uint256 _totalSupply) {
        _totalSupply = IGovernedERC20(address(uint160(address(impl)))).totalSupply();
    }

    function approve(address spender, uint256 value) external returns (bool result) {
        result = IGovernedERC20(address(uint160(address(impl)))).approve(
            msg.sender,
            spender,
            value
        );
        emit Approval(msg.sender, spender, value);
    }

    function transfer(address to, uint256 value) external returns (bool result) {
        result = IGovernedERC20(address(uint160(address(impl)))).transfer(msg.sender, to, value);
        emit Transfer(msg.sender, to, value);
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool result) {
        result = IGovernedERC20(address(uint160(address(impl)))).transferFrom(
            msg.sender,
            from,
            to,
            value
        );
        emit Transfer(from, to, value);
        uint256 newApproveAmount = IGovernedERC20(address(uint160(address(impl)))).allowance(
            from,
            msg.sender
        );
        emit Approval(from, msg.sender, newApproveAmount);
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool result) {
        result = IGovernedERC20(address(uint160(address(impl)))).increaseAllowance(
            msg.sender,
            spender,
            addedValue
        );
        uint256 newApproveAmount = IGovernedERC20(address(uint160(address(impl)))).allowance(
            msg.sender,
            spender
        );
        emit Approval(msg.sender, spender, newApproveAmount);
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool result)
    {
        result = IGovernedERC20(address(uint160(address(impl)))).decreaseAllowance(
            msg.sender,
            spender,
            subtractedValue
        );
        uint256 newApproveAmount = IGovernedERC20(address(uint160(address(impl)))).allowance(
            msg.sender,
            spender
        );
        emit Approval(msg.sender, spender, newApproveAmount);
    }

    // OwnedERC20 functions
    //
    function mint(address recipient, uint256 amount) external {
        IOwnedERC20(address(uint160(address(impl)))).mint(recipient, amount);
    }

    function burn(address recipient, uint256 amount) external {
        IOwnedERC20(address(uint160(address(impl)))).burn(recipient, amount);
    }

    // Governance functions
    //
    /**
     * Pre-create a new contract first.
     * Then propose upgrade based on that.
     */
    function proposeUpgrade(IGovernedContract _newImpl, uint256 _period)
        external
        payable
        senderOrigin
        noReentry
        returns (IUpgradeProposal)
    {
        require(_newImpl != impl, 'Already active!');
        require(_newImpl.proxy() == address(this), 'Wrong proxy!');

        ISporkRegistry spork_reg = ISporkRegistry(address(spork_proxy.impl()));
        IUpgradeProposal proposal = spork_reg.createUpgradeProposal.value(msg.value)(
            _newImpl,
            _period,
            msg.sender
        );

        upgrade_proposals[address(proposal)] = _newImpl;
        upgrade_proposal_list.push(proposal);

        emit UpgradeProposal(_newImpl, proposal);

        return proposal;
    }

    /**
     * Once proposal is accepted, anyone can activate that.
     */
    function upgrade(IUpgradeProposal _proposal) external noReentry {
        IGovernedContract new_impl = upgrade_proposals[address(_proposal)];
        require(new_impl != impl, 'Already active!'); // in case it changes in the flight
        require(address(new_impl) != address(0), 'Not registered!');
        require(_proposal.isAccepted(), 'Not accepted!');

        IGovernedContract old_impl = impl;

        new_impl.migrate(old_impl);
        impl = new_impl;
        implementation = new_impl;
        old_impl.destroy(new_impl);

        // SECURITY: prevent downgrade attack
        _cleanupProposal(_proposal);

        // Return fee ASAP
        _proposal.destroy();

        emit Upgraded(new_impl, _proposal);
    }

    /**
     * Map proposal to implementation
     */
    function upgradeProposalImpl(IUpgradeProposal _proposal)
        external
        view
        returns (IGovernedContract new_impl)
    {
        new_impl = upgrade_proposals[address(_proposal)];
    }

    /**
     * Lists all available upgrades
     */
    function listUpgradeProposals() external view returns (IUpgradeProposal[] memory proposals) {
        uint256 len = upgrade_proposal_list.length;
        proposals = new IUpgradeProposal[](len);

        for (uint256 i = 0; i < len; ++i) {
            proposals[i] = upgrade_proposal_list[i];
        }

        return proposals;
    }

    /**
     * Once proposal is reject, anyone can start collect procedure.
     */
    function collectUpgradeProposal(IUpgradeProposal _proposal) external noReentry {
        IGovernedContract new_impl = upgrade_proposals[address(_proposal)];
        require(address(new_impl) != address(0), 'Not registered!');
        _proposal.collect();
        delete upgrade_proposals[address(_proposal)];

        _cleanupProposal(_proposal);
    }

    function _cleanupProposal(IUpgradeProposal _proposal) internal {
        delete upgrade_proposals[address(_proposal)];

        uint256 len = upgrade_proposal_list.length;
        for (uint256 i = 0; i < len; ++i) {
            if (upgrade_proposal_list[i] == _proposal) {
                upgrade_proposal_list[i] = upgrade_proposal_list[len - 1];
                upgrade_proposal_list.pop();
                break;
            }
        }
    }

    /**
     * Related to above
     */
    function proxy() external view returns (address) {
        return address(this);
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function transferFrom(
        address,
        address,
        address,
        uint256
    ) external pure {
        revert('Good try');
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function increaseAllowance(
        address,
        address,
        uint256
    ) external pure {
        revert('Good try');
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function decreaseAllowance(
        address,
        address,
        uint256
    ) external pure {
        revert('Good try');
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function transfer(
        address,
        address,
        uint256
    ) external pure {
        revert('Good try');
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function approve(
        address,
        address,
        uint256
    ) external pure {
        revert('Good try');
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function migrate(IGovernedContract) external pure {
        revert('Good try');
    }

    /**
     * SECURITY: prevent on-behalf-of calls
     */
    function destroy(IGovernedContract) external pure {
        revert('Good try');
    }

    /**
     * Proxy all other calls to implementation.
     */
    function() external payable senderOrigin {
        // SECURITY: senderOrigin() modifier is mandatory

        // A dummy delegatecall opcode in the fallback function is necessary for
        // block explorers to pick up the Energi proxy-implementation pattern
        if (false) {
            (bool success, bytes memory data) = address(0).delegatecall(
                abi.encodeWithSignature('')
            );
            require(
                success && !success && data.length == 0 && data.length != 0,
                'ERC20TokenGovernedProxy: delegatecall cannot be used'
            );
        }

        IGovernedContract impl_m = impl;

        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize)

            let res := call(sub(gas, 10000), impl_m, callvalue, ptr, calldatasize, 0, 0)
            // NOTE: returndatasize should allow repeatable calls
            //       what should save one opcode.
            returndatacopy(ptr, 0, returndatasize)

            switch res
            case 0 {
                revert(ptr, returndatasize)
            }
            default {
                return(ptr, returndatasize)
            }
        }
    }
}

File 24 of 25 : ERC20TokenAutoProxy.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

import { IGovernedContract } from './interfaces/IGovernedContract.sol';
import { GovernedERC20 } from './GovernedERC20.sol';
import { ERC20TokenGovernedProxy } from './ERC20TokenGovernedProxy.sol';

contract ERC20TokenAutoProxy is GovernedERC20 {
    constructor(
        address _proxy,
        IGovernedContract _impl,
        address _owner
    ) public GovernedERC20(_proxy, _owner) {
        if (_proxy == address(0)) {
            _proxy = address(new ERC20TokenGovernedProxy(_impl));
        }
        proxy = _proxy;
    }
}

File 25 of 25 : Context.sol
// SPDX-License-Identifier: MIT

// Copyright 2023 Energi Core

pragma solidity 0.5.16;

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

contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _txOrigin() internal view returns (address payable) {
        return tx.origin;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxy","type":"address"},{"internalType":"address","name":"_airdropService","type":"address"},{"internalType":"address","name":"_eRC721ManagerProxy","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"unpauseBlock","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blockNumberWhenToUnpause","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"claimAmountAirdrop","type":"uint256"},{"internalType":"uint256","name":"claimAmountReferral1","type":"uint256"},{"internalType":"uint256","name":"claimAmountReferral2","type":"uint256"},{"internalType":"uint256","name":"claimAmountReferral3","type":"uint256"},{"internalType":"bytes4","name":"airdropId","type":"bytes4"},{"internalType":"uint256","name":"lastClaimNonce","type":"uint256"},{"internalType":"uint256","name":"claimNonce","type":"uint256"},{"internalType":"bytes","name":"airdropServiceSignature","type":"bytes"}],"name":"claimAirdrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IGovernedContract","name":"_newImpl","type":"address"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eRC20TokenStorage","outputs":[{"internalType":"contract ERC20TokenStorage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"erc20Storage","outputs":[{"internalType":"contract GovernedERC20Storage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"airdropId","type":"bytes4"},{"internalType":"address","name":"_user","type":"address"}],"name":"getAirdropLastClaimNonce","outputs":[{"internalType":"uint256","name":"_lastClaimNonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAirdropService","outputs":[{"internalType":"address","name":"_airdropService","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IGovernedContract","name":"_oldImpl","type":"address"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proxy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_airdropService","type":"address"}],"name":"setAirdropService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"setDecimals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_eRC721ManagerProxy","type":"address"}],"name":"setERC721ManagerProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_sporkProxy","type":"address"}],"name":"setSporkProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260006002553480156200001657600080fd5b506040516200693638038062006936833981810160405260e08110156200003c57600080fd5b81516020830151604080850151606086015160808701805193519597949692959194919392820192846401000000008211156200007857600080fd5b9083019060208201858111156200008e57600080fd5b8251640100000000811182820188101715620000a957600080fd5b82525081516020918201929091019080838360005b83811015620000d8578181015183820152602001620000be565b50505050905090810190601f168015620001065780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200012a57600080fd5b9083019060208201858111156200014057600080fd5b82516401000000008111828201881017156200015b57600080fd5b82525081516020918201929091019080838360005b838110156200018a57818101518382015260200162000170565b50505050905090810190601f168015620001b85780820380516001836020036101000a031916815260200191505b50604081905260209190910151600180546001600160a01b03808a166001600160a01b03199283161790925560038054928d1692909116919091179055925088915030908690839082906200020d906200041d565b604051809103906000f0801580156200022a573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b03928316179055851615159150620002959050578160405162000263906200042b565b6001600160a01b03909116815260405190819003602001906000f08015801562000291573d6000803e3d6000fd5b5092505b82600360006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050508585848484604051620002d29062000439565b6001600160a01b038087168252851660208083019190915260ff8316608083015260a06040830181815286519184019190915285519091606084019160c085019188019080838360005b83811015620003365781810151838201526020016200031c565b50505050905090810190601f168015620003645780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015620003995781810151838201526020016200037f565b50505050905090810190601f168015620003c75780820380516001836020036101000a031916815260200191505b50975050505050505050604051809103906000f080158015620003ee573d6000803e3d6000fd5b50600580546001600160a01b0319166001600160a01b0392909216919091179055506200044795505050505050565b61043e806200376683390190565b6121878062003ba483390190565b610c0b8062005d2b83390190565b61330f80620004576000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c80638d2c45f51161010f578063ce5494bb116100a2578063e62c204d11610071578063e62c204d14610757578063ec5568891461077d578063f2fde38b14610785578063fee24e50146107ab576101ef565b8063ce5494bb14610697578063d73b1dc9146106bd578063dd62ed3e146106f3578063e1f21c6714610721576101ef565b8063b51fa167116100de578063b51fa1671461057d578063b84c824614610585578063beabacc8146105f3578063c47f002714610629576101ef565b80638d2c45f51461051b5780638da5cb5b1461054157806395d89b41146105495780639dc29fac14610551576101ef565b806340c10f19116101875780636d5af8bc116101565780636d5af8bc1461040a57806370a08231146104305780637a1395aa146104565780638002a4d214610476576101ef565b806340c10f191461037c5780634bc597b9146103a8578063590d9ac3146103cc5780636c43a2ca146103d4576101ef565b806318160ddd116101c357806318160ddd14610306578063236cfcdd14610320578063313ce567146103565780633f4ba83a14610374576101ef565b8062f55d9d146101f457806306fdde031461021c578063136439dd1461029957806315dacbea146102b6575b600080fd5b61021a6004803603602081101561020a57600080fd5b50356001600160a01b03166107b3565b005b61022461087b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025e578181015183820152602001610246565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61021a600480360360208110156102af57600080fd5b50356109b0565b6102f2600480360360808110156102cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610a9a565b604080519115158252519081900360200190f35b61030e610bbf565b60408051918252519081900360200190f35b61030e6004803603604081101561033657600080fd5b5080356001600160e01b03191690602001356001600160a01b0316610c41565b61035e610cd5565b6040805160ff9092168252519081900360200190f35b61021a610d1a565b61021a6004803603604081101561039257600080fd5b506001600160a01b038135169060200135610db8565b6103b0610e94565b604080516001600160a01b039092168252519081900360200190f35b6103b0610ea3565b6102f2600480360360608110156103ea57600080fd5b506001600160a01b03813581169160208101359091169060400135610eb2565b61021a6004803603602081101561042057600080fd5b50356001600160a01b0316610fb2565b61030e6004803603602081101561044657600080fd5b50356001600160a01b0316611078565b61021a6004803603602081101561046c57600080fd5b503560ff166110fd565b61021a600480360361010081101561048d57600080fd5b8135916020810135916040820135916060810135916001600160e01b03196080830135169160a08101359160c08201359190810190610100810160e0820135600160201b8111156104dd57600080fd5b8201836020820111156104ef57600080fd5b803590602001918460018302840111600160201b8311171561051057600080fd5b5090925090506111a9565b61021a6004803603602081101561053157600080fd5b50356001600160a01b031661155a565b6103b0611605565b610224611614565b61021a6004803603604081101561056757600080fd5b506001600160a01b038135169060200135611659565b61030e611814565b61021a6004803603602081101561059b57600080fd5b810190602081018135600160201b8111156105b557600080fd5b8201836020820111156105c757600080fd5b803590602001918460018302840111600160201b831117156105e857600080fd5b50909250905061181a565b6102f26004803603606081101561060957600080fd5b506001600160a01b038135811691602081013590911690604001356118ee565b61021a6004803603602081101561063f57600080fd5b810190602081018135600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460018302840111600160201b8311171561068c57600080fd5b509092509050611953565b61021a600480360360208110156106ad57600080fd5b50356001600160a01b0316611a27565b6102f2600480360360608110156106d357600080fd5b506001600160a01b03813581169160208101359091169060400135611a86565b61030e6004803603604081101561070957600080fd5b506001600160a01b0381358116916020013516611b4e565b6102f26004803603606081101561073757600080fd5b506001600160a01b03813581169160208101359091169060400135611ba9565b61021a6004803603602081101561076d57600080fd5b50356001600160a01b0316611c04565b6103b0611caf565b61021a6004803603602081101561079b57600080fd5b50356001600160a01b0316611cbe565b6103b0611db3565b6003546001600160a01b03163314610800576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b600554604080516313af403560e01b81526001600160a01b038481166004830152915191909216916313af403591602480830192600092919082900301818387803b15801561084e57600080fd5b505af1158015610862573d6000803e3d6000fd5b5050505061086f81611df8565b61087881611e4a565b50565b600554604080516305f5f79f60e21b815290516060926001600160a01b0316916317d7de7c916004808301926000929190829003018186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156108fd57600080fd5b8101908080516040519392919084600160201b82111561091c57600080fd5b90830190602082018581111561093157600080fd5b8251600160201b81118282018810171561094a57600080fd5b82525081516020918201929091019080838360005b8381101561097757818101518382015260200161095f565b50505050905090810190601f1680156109a45780820380516001836020036101000a031916815260200191505b50604052505050905090565b6001546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b60008111610a435760405162461bcd60e51b815260040180806020018281038252604b815260200180612eb2604b913960600191505060405180910390fd5b4381016002557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d610a72611e56565b600254604080516001600160a01b03909316835260208301919091528051918290030190a150565b6003546000906001600160a01b03163314610aea576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b610af5848484611e5a565b6000610ba683604051806060016040528060338152602001612dbc603391396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528c8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b505afa158015610b81573d6000803e3d6000fd5b505050506040513d6020811015610b9757600080fd5b5051919063ffffffff6120de16565b9050610bb3858783612175565b50600195945050505050565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4e41b226040518163ffffffff1660e01b815260040160206040518083038186803b158015610c0f57600080fd5b505afa158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b505190505b90565b6005546040805163236cfcdd60e01b81526001600160e01b0319851660048201526001600160a01b0384811660248301529151600093929092169163236cfcdd91604480820192602092909190829003018186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d6020811015610ccc57600080fd5b50519392505050565b60055460408051633c05076160e21b815290516000926001600160a01b03169163f0141d84916004808301926020929190829003018186803b158015610c0f57600080fd5b6001546001600160a01b03163314610d6e576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b436002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610d9b611e56565b604080516001600160a01b039092168252519081900360200190a1565b6001546001600160a01b0316610dcc6122a1565b6001600160a01b031614610e15576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b610e1f82826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b03868116602484015260448301869052925192909316926323de66519260648084019382900301818387803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050505050565b6004546001600160a01b031681565b6005546001600160a01b031681565b6003546000906001600160a01b03163314610f02576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6004805460408051630af4187d60e01b81526001600160a01b038881169482019490945286841660248201529051600093610f9a938793911691630af4187d91604480820192602092909190829003018186803b158015610f6257600080fd5b505afa158015610f76573d6000803e3d6000fd5b505050506040513d6020811015610f8c57600080fd5b50519063ffffffff61249816565b9050610fa7858583612175565b506001949350505050565b6001546001600160a01b0316610fc66122a1565b6001600160a01b03161461100f576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051631b56be2f60e21b81526001600160a01b03848116600483015291519190921691636d5af8bc91602480830192600092919082900301818387803b15801561105d57600080fd5b505af1158015611071573d6000803e3d6000fd5b5050505050565b600480546040805163f8b2cb4f60e01b81526001600160a01b038581169482019490945290516000939092169163f8b2cb4f91602480820192602092909190829003018186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d60208110156110f557600080fd5b505192915050565b6001546001600160a01b03166111116122a1565b6001600160a01b03161461115a576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051633d09cad560e11b815260ff8416600482015290516001600160a01b0390921691637a1395aa9160248082019260009290919082900301818387803b15801561105d57600080fd5b600054156111e8576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160009081556111f76122a1565b6005546040805163236cfcdd60e01b81526001600160e01b03198a1660048201526001600160a01b038085166024830152915193945091169163236cfcdd91604480820192602092909190829003018186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d602081101561128057600080fd5b505185146112bf5760405162461bcd60e51b8152600401808060200182810382526028815260200180612e8a6028913960400191505060405180910390fd5b8385106112fd5760405162461bcd60e51b815260040180806020018281038252603981526020018061308a6039913960400191505060405180910390fd5b6113bb818b8b8b8b8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060035460055460408051630fee24e560e41b815290516001600160a01b03938416955092909116925063fee24e50916004808301926020929190829003018186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d60208110156113b457600080fd5b50516124f9565b60055460408051635521f9b960e01b81526001600160e01b0319891660048201526001600160a01b0384811660248301526044820188905291519190921691635521f9b991606480830192600092919082900301818387803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b50505050611445818b8b8b8b61257d565b600360009054906101000a90046001600160a01b03166001600160a01b03166390d6001a828c8c8c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401808b6001600160a01b03166001600160a01b031681526020018a8152602001898152602001888152602001878152602001866001600160e01b0319166001600160e01b0319168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509b505050505050505050505050600060405180830381600087803b15801561153257600080fd5b505af1158015611546573d6000803e3d6000fd5b505060008055505050505050505050505050565b6001546001600160a01b031661156e6122a1565b6001600160a01b0316146115b7576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60035460408051638d2c45f560e01b81526001600160a01b03848116600483015291519190921691638d2c45f591602480830192600092919082900301818387803b15801561105d57600080fd5b6001546001600160a01b031681565b60055460408051631507040160e01b815290516060926001600160a01b0316916315070401916004808301926000929190829003018186803b1580156108c057600080fd5b6001546001600160a01b031661166d6122a1565b6001600160a01b031614806117715750600560009054906101000a90046001600160a01b03166001600160a01b031663925c5b626040518163ffffffff1660e01b815260040160206040518083038186803b1580156116cb57600080fd5b505afa1580156116df573d6000803e3d6000fd5b505050506040513d60208110156116f557600080fd5b505160408051638abf607760e01b815290516001600160a01b0390921691638abf607791600480820192602092909190829003018186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d602081101561176357600080fd5b50516001600160a01b031633145b6117b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6117ba8282612626565b600354604080516323de665160e01b81526001600160a01b0385811660048301526000602483018190526044830186905292519316926323de66519260648084019391929182900301818387803b158015610e7857600080fd5b60025481565b6001546001600160a01b031661182e6122a1565b6001600160a01b031614611877576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b600554604051635c26412360e11b8152602060048201908152602482018490526001600160a01b039092169163b84c824691859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546000906001600160a01b0316331461193e576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484611e5a565b5060019392505050565b6001546001600160a01b03166119676122a1565b6001600160a01b0316146119b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460405163c47f002760e01b8152602060048201908152602482018490526001600160a01b039092169163c47f002791859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546001600160a01b03163314611a74576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611a7d81612859565b61087881610878565b6003546000906001600160a01b03163314611ad6576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6000610f9a83604051806060016040528060308152602001612f48603091396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528a8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b6004805460408051630af4187d60e01b81526001600160a01b03868116948201949094528484166024820152905160009390921691630af4187d91604480820192602092909190829003018186803b158015610ca257600080fd5b6003546000906001600160a01b03163314611bf9576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484612175565b6001546001600160a01b0316611c186122a1565b6001600160a01b031614611c61576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6005546040805163e62c204d60e01b81526001600160a01b0384811660048301529151919092169163e62c204d91602480830192600092919082900301818387803b15801561105d57600080fd5b6003546001600160a01b031681565b6001546001600160a01b03163314611d12576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b6001600160a01b038116611d575760405162461bcd60e51b8152600401808060200182810382526021815260200180612efd6021913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60055460408051630fee24e560e41b815290516000926001600160a01b03169163fee24e50916004808301926020929190829003018186803b158015610c0f57600080fd5b60048054604080516313af403560e01b81526001600160a01b0385811694820194909452905192909116916313af40359160248082019260009290919082900301818387803b15801561105d57600080fd5b806001600160a01b0316ff5b3390565b600254431015611e9b5760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b038316611ee05760405162461bcd60e51b81526004018080602001828103825260308152602001806131156030913960400191505060405180910390fd5b6001600160a01b038216611f255760405162461bcd60e51b815260040180806020018281038252602e8152602001806131e3602e913960400191505060405180910390fd5b600454604080516060810190915260318082526001600160a01b039092169163e30443bc918691611fab918691612f786020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038d8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612072918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156120c157600080fd5b505af11580156120d5573d6000803e3d6000fd5b50505050505050565b6000818484111561216d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213257818101518382015260200161211a565b50505050905090810190601f16801561215f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6002544310156121b65760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0383166121fb5760405162461bcd60e51b815260040180806020018281038252602f815260200180612ffb602f913960400191505060405180910390fd5b6001600160a01b0382166122405760405162461bcd60e51b815260040180806020018281038252602d8152602001806130e8602d913960400191505060405180910390fd5b6004805460408051633691826360e21b81526001600160a01b03878116948201949094528584166024820152604481018590529051929091169163da46098c9160648082019260009290919082900301818387803b1580156120c157600080fd5b6003546000906001600160a01b03163314156122be575032610c3e565b5033610c3e565b6002544310156123065760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b03821661234b5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f1e602a913960400191505060405180910390fd5b60048054604080516362720d9160e11b815290516001600160a01b039092169263f7ea7a3d9261239b928692869263c4e41b22928083019260209291829003018186803b158015610f6257600080fd5b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123d157600080fd5b505af11580156123e5573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612449918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e7857600080fd5b6000828201838110156124f2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600061250b8c8c8c8c8c8c8c8c6128e0565b9050816001600160a01b031661252a6125248386612970565b86612a7e565b6001600160a01b03161461256f5760405162461bcd60e51b81526004018080602001828103825260458152602001806131456045913960600191505060405180910390fd5b505050505050505050505050565b60006125a1826125958581898963ffffffff61249816565b9063ffffffff61249816565b90506125ad86826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b038a8116602484015260448301869052925192909316926323de66519260648084019382900301818387803b15801561260657600080fd5b505af115801561261a573d6000803e3d6000fd5b50505050505050505050565b6002544310156126675760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0382166126ac5760405162461bcd60e51b815260040180806020018281038252602c81526020018061318a602c913960400191505060405180910390fd5b6004546040805160608101909152602d8082526001600160a01b039092169163e30443bc9185916127329186916131b66020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038c8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b505060048054604080516362720d9160e11b815290516001600160a01b03909216945063f7ea7a3d9350612823928692869263c4e41b229281810192602092909190829003018186803b1580156127eb57600080fd5b505afa1580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b50519063ffffffff612ae816565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e7857600080fd5b806001600160a01b0316634bc597b96040518163ffffffff1660e01b815260040160206040518083038186803b15801561289257600080fd5b505afa1580156128a6573d6000803e3d6000fd5b505050506040513d60208110156128bc57600080fd5b5051600480546001600160a01b0319166001600160a01b0390921691909117905550565b6000604051808061321160ca9139604080519182900360ca0182206020808401919091526001600160a01b039c909c1682820152606082019a909a526080810198909852505060a086019490945260c08501929092526001600160e01b03191660e08401526101008301526101208083019190915282518083039091018152610140909101909152805191012090565b60405160009046908290806052612fa982396040805191829003605201822082820182526006835265456e6572676960d01b6020938401528151808301835260018152603160f81b908401528151808401919091527fab646ac92b857c23e54eb792495c5eb5881f612f4dfd8c0ad27072e703f1e8c9818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101959095526001600160a01b0390961660a0808601919091528651808603909101815260c08501875280519082012061190160f01b60e086015260e2850152610102808501979097528551808503909701875261012290930190945250835193019290922092915050565b60008151604114612ac05760405162461bcd60e51b815260040180806020018281038252602c815260200180612e0f602c913960400191505060405180910390fd5b60208201516040830151606084015160001a612ade86828585612b2a565b9695505050505050565b60006124f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120de565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612b8b5760405162461bcd60e51b815260040180806020018281038252602f815260200180612e5b602f913960400191505060405180910390fd5b6000601e8560ff161115612c68576004850360ff16601b1480612bb457506004850360ff16601c145b612bef5760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6001612bfa87612d6a565b60048703868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612c57573d6000803e3d6000fd5b505050602060405103519050612d1c565b8460ff16601b1480612c7d57508460ff16601c145b612cb85760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6040805160008152602080820180845289905260ff8816828401526060820187905260808201869052915160019260a0808401939192601f1981019281900390910190855afa158015612d0f573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116612d615760405162461bcd60e51b81526004018080602001828103825260258152602001806130c36025913960400191505060405180910390fd5b95945050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c90910190915281519101209056fe4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433230546f6b656e3a20464f5242494444454e00000000000000000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206c656e677468476f7665726e656420436f6e74726163743a204e6f742070726f7879000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206073602076616c75654552433230546f6b656e3a20696e76616c6964206c617374436c61696d4e6f6e63652076616c75655061757361626c653a20526576657274202d20506175736520646964206e6f742061637469766174652e20506c6561736520656e746572206120706f73697469766520696e74656765722e4f776e61626c653a205a65726f2061646472657373206e6f7420616c6c6f7765644552433230546f6b656e2045524332303a206d696e7420746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294552433230546f6b656e2045524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206076602076616c75655061757361626c653a20526576657274202d20436f646520657865637574696f6e206973207374696c6c207061757365644552433230546f6b656e3a20636c61696d4e6f6e6365206d757374206265206c6172676572207468616e206c617374436c61696d4e6f6e63654c69625369676e61747572653a20696e76616c6964204543445341207369676e61747572654552433230546f6b656e2045524332303a20617070726f766520746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734c6962436c61696d41697264726f703a204549502d3731322061697264726f702073657276696365207369676e617475726520766572696669636174696f6e206572726f724552433230546f6b656e2045524332303a206275726e2066726f6d20746865207a65726f20616464726573734552433230546f6b656e2045524332303a206275726e20616d6f756e7420657863656564732062616c616e63654552433230546f6b656e2045524332303a207472616e7366657220746f20746865207a65726f20616464726573734552433230436c61696d286164647265737320726563697069656e742c75696e7432353620636c61696d416d6f756e7441697264726f702c75696e7432353620636c61696d416d6f756e74526566657272616c312c75696e7432353620636c61696d416d6f756e74526566657272616c322c75696e7432353620636c61696d416d6f756e74526566657272616c332c6279746573342061697264726f7049642c75696e74323536206c617374436c61696d4e6f6e63652c75696e7432353620636c61696d4e6f6e636529a265627a7a723158203708bd5c1812477eed2284dbba068121108ec29e81ed5e93fd2b454d46bbb7b964736f6c634300051000326080604052600080546001600160a01b03191633179055610419806100256000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063da46098c1161005b578063da46098c14610105578063e30443bc1461013b578063f7ea7a3d14610167578063f8b2cb4f1461018457610088565b80630af4187d1461008d57806313af4035146100cd57806341c0e1b5146100f5578063c4e41b22146100fd575b600080fd5b6100bb600480360360408110156100a357600080fd5b506001600160a01b03813581169160200135166101aa565b60408051918252519081900360200190f35b6100f3600480360360208110156100e357600080fd5b50356001600160a01b03166101d5565b005b6100f3610243565b6100bb610292565b6100f36004803603606081101561011b57600080fd5b506001600160a01b03813581169160208101359091169060400135610298565b6100f36004803603604081101561015157600080fd5b506001600160a01b038135169060200135610310565b6100f36004803603602081101561017d57600080fd5b5035610378565b6100bb6004803603602081101561019a57600080fd5b50356001600160a01b03166103c9565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b03163314610221576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461028f576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b33ff5b60035490565b6000546001600160a01b031633146102e4576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6001600160a01b0392831660009081526002602090815260408083209490951682529290925291902055565b6000546001600160a01b0316331461035c576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6001600160a01b03909116600090815260016020526040902055565b6000546001600160a01b031633146103c4576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600355565b6001600160a01b03166000908152600160205260409020549056fea265627a7a72315820a96c05ad5e9e2e183e1e9275f4eb5f365b33d20a3c9e68a7ac47d6516bcdfda464736f6c63430005100032608060405234801561001057600080fd5b506040516121873803806121878339818101604052602081101561003357600080fd5b5051600180546001600160a01b039092166001600160a01b03199283168117909155600280549092161790556121198061006e6000396000f3fe6080604052600436106102035760003560e01c80636fa09ab011610118578063a9059cbb116100a0578063d73b1dc91161006f578063d73b1dc91461070c578063dd62ed3e14610a42578063dd6a851d14610a7d578063e1f21c671461070c578063ec55688914610a9257610203565b8063a9059cbb146109a4578063b364595e146109dd578063beabacc81461070c578063ce5494bb1461037d57610203565b806390d6001a116100e757806390d6001a1461082757806395d89b41146108ea5780639dc29fac146108ff578063a1b0e47614610938578063a457c2d71461096b57610203565b80636fa09ab01461078257806370a08231146107ac5780638abf6077146107df5780638d2c45f5146107f457610203565b8063313ce5671161019b5780635687f2b81161016a5780635687f2b8146106885780635b6dee4c146106cb5780635c60da1b146106f75780636c43a2ca1461070c5780636d5b6c441461074f57610203565b8063313ce567146105b257806332e3a905146105c7578063395093511461061657806340c10f191461064f57610203565b806315dacbea116101d757806315dacbea146104bc57806318160ddd1461050557806323b872dd1461052c57806323de66511461056f57610203565b8062f55d9d1461037d57806306fdde03146103b25780630900f0101461043c578063095ea7b31461046f575b323314610257576040805162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206469726563742063616c6c732061726520616c6c6f776564210000604482015290519081900360640190fd5b610345565b6020831061027b5780518252601f19909201916020918201910161025c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146102db576040519150601f19603f3d011682016040523d82523d6000602084013e6102e0565b606091505b50915091508180156102f0575081155b80156102fb57508051155b80156103075750805115155b6103425760405162461bcd60e51b81526004018080602001828103825260348152602001806120706034913960400191505060405180910390fd5b50505b6001546040516001600160a01b03909116903660008237600080368334866127105a03f13d6000833e808015610379573d83f35b3d83fd5b34801561038957600080fd5b506103b0600480360360208110156103a057600080fd5b50356001600160a01b0316610aa7565b005b3480156103be57600080fd5b506103c7610adf565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104015781810151838201526020016103e9565b50505050905090810190601f16801561042e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044857600080fd5b506103b06004803603602081101561045f57600080fd5b50356001600160a01b0316610c16565b34801561047b57600080fd5b506104a86004803603604081101561049257600080fd5b506001600160a01b038135169060200135610f46565b604080519115158252519081900360200190f35b3480156104c857600080fd5b506103b0600480360360808110156104df57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610aa7565b34801561051157600080fd5b5061051a611009565b60408051918252519081900360200190f35b34801561053857600080fd5b506104a86004803603606081101561054f57600080fd5b506001600160a01b0381358116916020810135909116906040013561107f565b34801561057b57600080fd5b506103b06004803603606081101561059257600080fd5b506001600160a01b03813581169160208101359091169060400135611216565b3480156105be57600080fd5b5061051a6112af565b3480156105d357600080fd5b506105fa600480360360208110156105ea57600080fd5b50356001600160a01b0316611328565b604080516001600160a01b039092168252519081900360200190f35b34801561062257600080fd5b506104a86004803603604081101561063957600080fd5b506001600160a01b038135169060200135611343565b34801561065b57600080fd5b506103b06004803603604081101561067257600080fd5b506001600160a01b03813516906020013561148c565b34801561069457600080fd5b506103b0600480360360608110156106ab57600080fd5b506001600160a01b038135811691602081013590911690604001356114fd565b6105fa600480360360408110156106e157600080fd5b506001600160a01b038135169060200135611584565b34801561070357600080fd5b506105fa6118d7565b34801561071857600080fd5b506103b06004803603606081101561072f57600080fd5b506001600160a01b03813581169160208101359091169060400135610aa7565b34801561075b57600080fd5b506105fa6004803603602081101561077257600080fd5b50356001600160a01b03166118e6565b34801561078e57600080fd5b506105fa600480360360208110156107a557600080fd5b5035611904565b3480156107b857600080fd5b5061051a600480360360208110156107cf57600080fd5b50356001600160a01b031661192b565b3480156107eb57600080fd5b506105fa6119ae565b34801561080057600080fd5b506103b06004803603602081101561081757600080fd5b50356001600160a01b03166119bd565b34801561083357600080fd5b506103b0600480360361012081101561084b57600080fd5b6001600160a01b03823516916020810135916040820135916060810135916080820135916001600160e01b031960a0820135169160c08201359160e08101359181019061012081016101008201356401000000008111156108ab57600080fd5b8201836020820111156108bd57600080fd5b803590602001918460018302840111640100000000831117156108df57600080fd5b509092509050611a28565b3480156108f657600080fd5b506103c7611b33565b34801561090b57600080fd5b506103b06004803603604081101561092257600080fd5b506001600160a01b038135169060200135611b78565b34801561094457600080fd5b506103b06004803603602081101561095b57600080fd5b50356001600160a01b0316611bcd565b34801561097757600080fd5b506104a86004803603604081101561098e57600080fd5b506001600160a01b038135169060200135611cfa565b3480156109b057600080fd5b506104a8600480360360408110156109c757600080fd5b506001600160a01b038135169060200135611d59565b3480156109e957600080fd5b506109f2611e2e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a2e578181015183820152602001610a16565b505050509050019250505060405180910390f35b348015610a4e57600080fd5b5061051a60048036036040811015610a6557600080fd5b506001600160a01b0381358116916020013516611ec8565b348015610a8957600080fd5b506105fa611f54565b348015610a9e57600080fd5b506105fa611f63565b6040805162461bcd60e51b8152602060048201526008602482015267476f6f642074727960c01b604482015290519081900360640190fd5b600154604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610b6157600080fd5b8101908080516040519392919084640100000000821115610b8157600080fd5b908301906020820185811115610b9657600080fd5b8251640100000000811182820188101715610bb057600080fd5b82525081516020918201929091019080838360005b83811015610bdd578181015183820152602001610bc5565b50505050905090810190601f168015610c0a5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60005415610c55576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160008181556001600160a01b038084168252600460205260409091205491549181169116811415610cc1576040805162461bcd60e51b815260206004820152600f60248201526e416c7265616479206163746976652160881b604482015290519081900360640190fd5b6001600160a01b038116610d0e576040805162461bcd60e51b815260206004820152600f60248201526e4e6f7420726567697374657265642160881b604482015290519081900360640190fd5b816001600160a01b0316635051a5ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d4757600080fd5b505afa158015610d5b573d6000803e3d6000fd5b505050506040513d6020811015610d7157600080fd5b5051610db4576040805162461bcd60e51b815260206004820152600d60248201526c4e6f742061636365707465642160981b604482015290519081900360640190fd5b6001546040805163ce5494bb60e01b81526001600160a01b03928316600482018190529151919284169163ce5494bb9160248082019260009290919082900301818387803b158015610e0557600080fd5b505af1158015610e19573d6000803e3d6000fd5b5050600180546001600160a01b038087166001600160a01b031992831681179093556002805490921683179091556040805162f55d9d60e01b8152600481019390935251908516935062f55d9d9250602480830192600092919082900301818387803b158015610e8857600080fd5b505af1158015610e9c573d6000803e3d6000fd5b50505050610ea983611f67565b826001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ee457600080fd5b505af1158015610ef8573d6000803e3d6000fd5b5050604080516001600160a01b038781168252915191861693507f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7925081900360200190a250506000805550565b6001546040805163e1f21c6760e01b81523360048201526001600160a01b038581166024830152604482018590529151600093929092169163e1f21c679160648082019260209290919082900301818787803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d6020811015610fcf57600080fd5b50516040805184815290519192506001600160a01b0385169133916000805160206120c5833981519152919081900360200190a392915050565b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561104e57600080fd5b505afa158015611062573d6000803e3d6000fd5b505050506040513d602081101561107857600080fd5b5051919050565b60015460408051630aed65f560e11b81523360048201526001600160a01b038681166024830152858116604483015260648201859052915160009392909216916315dacbea9160848082019260209290919082900301818787803b1580156110e657600080fd5b505af11580156110fa573d6000803e3d6000fd5b505050506040513d602081101561111057600080fd5b50516040805184815290519192506001600160a01b0380861692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a360015460408051636eb1769f60e11b81526001600160a01b0387811660048301523360248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b1580156111b057600080fd5b505afa1580156111c4573d6000803e3d6000fd5b505050506040513d60208110156111da57600080fd5b505160408051828152905191925033916001600160a01b038816916000805160206120c5833981519152919081900360200190a3509392505050565b6001546001600160a01b0316331461125f5760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d602081101561131e57600080fd5b505160ff16919050565b6004602052600090815260409020546001600160a01b031681565b60015460408051633621d16560e11b81523360048201526001600160a01b0385811660248301526044820185905291516000939290921691636c43a2ca9160648082019260209290919082900301818787803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b505050506040513d60208110156113cc57600080fd5b505160015460408051636eb1769f60e11b81523360048201526001600160a01b0387811660248301529151939450600093919092169163dd62ed3e916044808301926020929190829003018186803b15801561142757600080fd5b505afa15801561143b573d6000803e3d6000fd5b505050506040513d602081101561145157600080fd5b50516040805182815290519192506001600160a01b0386169133916000805160206120c5833981519152919081900360200190a35092915050565b600154604080516340c10f1960e01b81526001600160a01b03858116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b505050505050565b6001546001600160a01b031633146115465760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b03166000805160206120c5833981519152836040518082815260200191505060405180910390a3505050565b60003233146115da576040805162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206469726563742063616c6c732061726520616c6c6f776564210000604482015290519081900360640190fd5b60005415611619576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b60016000819055546001600160a01b0384811691161415611673576040805162461bcd60e51b815260206004820152600f60248201526e416c7265616479206163746976652160881b604482015290519081900360640190fd5b306001600160a01b0316836001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b657600080fd5b505afa1580156116ca573d6000803e3d6000fd5b505050506040513d60208110156116e057600080fd5b50516001600160a01b03161461172c576040805162461bcd60e51b815260206004820152600c60248201526b57726f6e672070726f78792160a01b604482015290519081900360640190fd5b60035460408051638abf607760e01b815290516000926001600160a01b031691638abf6077916004808301926020929190829003018186803b15801561177157600080fd5b505afa158015611785573d6000803e3d6000fd5b505050506040513d602081101561179b57600080fd5b5051604080516362877ccd60e01b81526001600160a01b038781166004830152602482018790523360448301529151929350600092918416916362877ccd913491606480830192602092919082900301818588803b1580156117fc57600080fd5b505af1158015611810573d6000803e3d6000fd5b50505050506040513d602081101561182757600080fd5b50516001600160a01b0380821660008181526004602090815260408083208054958c166001600160a01b031996871681179091556005805460018101825594527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09093018054909516841790945583519283529251939450927f812eb2689eecf94cfb55caf4a123ea76c6d93eef07dd54a5273b7a4949f7d763929181900390910190a260008055949350505050565b6002546001600160a01b031681565b6001600160a01b039081166000908152600460205260409020541690565b6005818154811061191157fe5b6000918252602090912001546001600160a01b0316905081565b600154604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561197c57600080fd5b505afa158015611990573d6000803e3d6000fd5b505050506040513d60208110156119a657600080fd5b505192915050565b6001546001600160a01b031681565b6001546001600160a01b03163314611a065760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314611a715760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b896001600160a01b03167f928751aabde843c1f88d22d1392d97ac696d9d71f6904a5a195bd37c489939348a8a8a8a8a8a8a8a8a604051808a8152602001898152602001888152602001878152602001866001600160e01b0319166001600160e01b0319168152602001858152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039c50909a5050505050505050505050a250505050505050505050565b600154604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b158015610b2457600080fd5b60015460408051632770a7eb60e21b81526001600160a01b0385811660048301526024820185905291519190921691639dc29fac91604480830192600092919082900301818387803b1580156114e157600080fd5b60005415611c0c576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160009081556001600160a01b03808316825260046020526040909120541680611c70576040805162461bcd60e51b815260206004820152600f60248201526e4e6f7420726567697374657265642160881b604482015290519081900360640190fd5b816001600160a01b031663e52253816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b5050506001600160a01b038316600090815260046020526040902080546001600160a01b031916905550611cf282611f67565b505060008055565b6001546040805163d73b1dc960e01b81523360048201526001600160a01b038581166024830152604482018590529151600093929092169163d73b1dc99160648082019260209290919082900301818787803b1580156113a257600080fd5b600154604080516317d5759960e31b81523360048201526001600160a01b038581166024830152604482018590529151600093929092169163beabacc89160648082019260209290919082900301818787803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b505050506040513d6020811015611de257600080fd5b50516040805184815290519192506001600160a01b0385169133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a392915050565b60055460408051828152602080840282010190915260609190818015611e5e578160200160208202803883390190505b50915060005b81811015611ec35760058181548110611e7957fe5b9060005260206000200160009054906101000a90046001600160a01b0316838281518110611ea357fe5b6001600160a01b0390921660209283029190910190910152600101611e64565b505090565b60015460408051636eb1769f60e11b81526001600160a01b03858116600483015284811660248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b50519392505050565b6003546001600160a01b031681565b3090565b6001600160a01b038116600090815260046020526040812080546001600160a01b0319169055600554905b8181101561206a57826001600160a01b031660058281548110611fb157fe5b6000918252602090912001546001600160a01b031614156120625760056001830381548110611fdc57fe5b600091825260209091200154600580546001600160a01b03909216918390811061200257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600580548061203b57fe5b600082815260209020810160001990810180546001600160a01b031916905501905561206a565b600101611f92565b50505056fe4552433230546f6b656e476f7665726e656450726f78793a2064656c656761746563616c6c2063616e6e6f7420626520757365644f6e6c792063616c6c732066726f6d20696d706c2061726520616c6c6f776564218c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a723158202a0e4f802cfdc1a7b12d8d094db9ece470d5e9adedbbfef5cbce0c72c988f84064736f6c6343000510003260806040523480156200001157600080fd5b5060405162000c0b38038062000c0b833981810160405260a08110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b50604052602090810151600080546001600160a01b03199081163317909155600380546001600160a01b038b811661010002610100600160a81b03199092169190911790915560048054918a169190921617905585519093506200020e925060019186019062000244565b5081516200022490600290602085019062000244565b506003805460ff191660ff9290921691909117905550620002e992505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028757805160ff1916838001178555620002b7565b82800160010185558215620002b7579182015b82811115620002b75782518255916020019190600101906200029a565b50620002c5929150620002c9565b5090565b620002e691905b80821115620002c55760008155600101620002d0565b90565b61091280620002f96000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80637a1395aa1161008c578063c47f002711610066578063c47f002714610302578063e62c204d14610372578063f0141d8414610398578063fee24e50146103b6576100ea565b80637a1395aa1461024e578063925c5b621461026e578063b84c824614610292576100ea565b8063236cfcdd116100c8578063236cfcdd1461019c57806341c0e1b5146101e45780635521f9b9146101ec5780636d5af8bc14610228576100ea565b806313af4035146100ef578063150704011461011757806317d7de7c14610194575b600080fd5b6101156004803603602081101561010557600080fd5b50356001600160a01b03166103be565b005b61011f61042c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610159578181015183820152602001610141565b50505050905090810190601f1680156101865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61011f6104bf565b6101d2600480360360408110156101b257600080fd5b5080356001600160e01b03191690602001356001600160a01b031661051f565b60408051918252519081900360200190f35b610115610551565b6101156004803603606081101561020257600080fd5b506001600160e01b0319813516906001600160a01b0360208201351690604001356105a0565b6101156004803603602081101561023e57600080fd5b50356001600160a01b031661061d565b6101156004803603602081101561026457600080fd5b503560ff16610691565b6102766106f3565b604080516001600160a01b039092168252519081900360200190f35b610115600480360360208110156102a857600080fd5b8101906020810181356401000000008111156102c357600080fd5b8201836020820111156102d557600080fd5b803590602001918460018302840111640100000000831117156102f757600080fd5b509092509050610702565b6101156004803603602081101561031857600080fd5b81019060208101813564010000000081111561033357600080fd5b82018360208201111561034557600080fd5b8035906020019184600183028401116401000000008311171561036757600080fd5b50909250905061075f565b6101156004803603602081101561038857600080fd5b50356001600160a01b03166107b7565b6103a0610825565b6040805160ff9092168252519081900360200190f35b61027661082e565b6000546001600160a01b0316331461040a576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156104b55780601f1061048a576101008083540402835291602001916104b5565b820191906000526020600020905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104b55780601f1061048a576101008083540402835291602001916104b5565b6001600160e01b031990911660009081526005602090815260408083206001600160a01b039094168352929052205490565b6000546001600160a01b0316331461059d576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b33ff5b6000546001600160a01b031633146105ec576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6001600160e01b031990921660009081526005602090815260408083206001600160a01b0390941683529290522055565b6000546001600160a01b03163314610669576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146106dd576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6003805460ff191660ff92909216919091179055565b6004546001600160a01b031690565b6000546001600160a01b0316331461074e576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b61075a60028383610842565b505050565b6000546001600160a01b031633146107ab576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b61075a60018383610842565b6000546001600160a01b03163314610803576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60035460ff1690565b60035461010090046001600160a01b031690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106108835782800160ff198235161785556108b0565b828001600101855582156108b0579182015b828111156108b0578235825591602001919060010190610895565b506108bc9291506108c0565b5090565b6108da91905b808211156108bc57600081556001016108c6565b9056fea265627a7a723158200fc338f9d34cf0ecc1b4331aa199443966291e3abc3efcfde170fc91bbbf87b864736f6c63430005100032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f8f9c3ff6d89671fcbc0b97c815dd77d83e541000000000000000000000000746d6afd192a9b2caa1fd437c5053c9f441e0eea000000000000000000000000069994c2670428aae9990c041ffbbd589952377700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c447261676f6e20426c6f6f64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024442000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c80638d2c45f51161010f578063ce5494bb116100a2578063e62c204d11610071578063e62c204d14610757578063ec5568891461077d578063f2fde38b14610785578063fee24e50146107ab576101ef565b8063ce5494bb14610697578063d73b1dc9146106bd578063dd62ed3e146106f3578063e1f21c6714610721576101ef565b8063b51fa167116100de578063b51fa1671461057d578063b84c824614610585578063beabacc8146105f3578063c47f002714610629576101ef565b80638d2c45f51461051b5780638da5cb5b1461054157806395d89b41146105495780639dc29fac14610551576101ef565b806340c10f19116101875780636d5af8bc116101565780636d5af8bc1461040a57806370a08231146104305780637a1395aa146104565780638002a4d214610476576101ef565b806340c10f191461037c5780634bc597b9146103a8578063590d9ac3146103cc5780636c43a2ca146103d4576101ef565b806318160ddd116101c357806318160ddd14610306578063236cfcdd14610320578063313ce567146103565780633f4ba83a14610374576101ef565b8062f55d9d146101f457806306fdde031461021c578063136439dd1461029957806315dacbea146102b6575b600080fd5b61021a6004803603602081101561020a57600080fd5b50356001600160a01b03166107b3565b005b61022461087b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025e578181015183820152602001610246565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61021a600480360360208110156102af57600080fd5b50356109b0565b6102f2600480360360808110156102cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610a9a565b604080519115158252519081900360200190f35b61030e610bbf565b60408051918252519081900360200190f35b61030e6004803603604081101561033657600080fd5b5080356001600160e01b03191690602001356001600160a01b0316610c41565b61035e610cd5565b6040805160ff9092168252519081900360200190f35b61021a610d1a565b61021a6004803603604081101561039257600080fd5b506001600160a01b038135169060200135610db8565b6103b0610e94565b604080516001600160a01b039092168252519081900360200190f35b6103b0610ea3565b6102f2600480360360608110156103ea57600080fd5b506001600160a01b03813581169160208101359091169060400135610eb2565b61021a6004803603602081101561042057600080fd5b50356001600160a01b0316610fb2565b61030e6004803603602081101561044657600080fd5b50356001600160a01b0316611078565b61021a6004803603602081101561046c57600080fd5b503560ff166110fd565b61021a600480360361010081101561048d57600080fd5b8135916020810135916040820135916060810135916001600160e01b03196080830135169160a08101359160c08201359190810190610100810160e0820135600160201b8111156104dd57600080fd5b8201836020820111156104ef57600080fd5b803590602001918460018302840111600160201b8311171561051057600080fd5b5090925090506111a9565b61021a6004803603602081101561053157600080fd5b50356001600160a01b031661155a565b6103b0611605565b610224611614565b61021a6004803603604081101561056757600080fd5b506001600160a01b038135169060200135611659565b61030e611814565b61021a6004803603602081101561059b57600080fd5b810190602081018135600160201b8111156105b557600080fd5b8201836020820111156105c757600080fd5b803590602001918460018302840111600160201b831117156105e857600080fd5b50909250905061181a565b6102f26004803603606081101561060957600080fd5b506001600160a01b038135811691602081013590911690604001356118ee565b61021a6004803603602081101561063f57600080fd5b810190602081018135600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460018302840111600160201b8311171561068c57600080fd5b509092509050611953565b61021a600480360360208110156106ad57600080fd5b50356001600160a01b0316611a27565b6102f2600480360360608110156106d357600080fd5b506001600160a01b03813581169160208101359091169060400135611a86565b61030e6004803603604081101561070957600080fd5b506001600160a01b0381358116916020013516611b4e565b6102f26004803603606081101561073757600080fd5b506001600160a01b03813581169160208101359091169060400135611ba9565b61021a6004803603602081101561076d57600080fd5b50356001600160a01b0316611c04565b6103b0611caf565b61021a6004803603602081101561079b57600080fd5b50356001600160a01b0316611cbe565b6103b0611db3565b6003546001600160a01b03163314610800576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b600554604080516313af403560e01b81526001600160a01b038481166004830152915191909216916313af403591602480830192600092919082900301818387803b15801561084e57600080fd5b505af1158015610862573d6000803e3d6000fd5b5050505061086f81611df8565b61087881611e4a565b50565b600554604080516305f5f79f60e21b815290516060926001600160a01b0316916317d7de7c916004808301926000929190829003018186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156108fd57600080fd5b8101908080516040519392919084600160201b82111561091c57600080fd5b90830190602082018581111561093157600080fd5b8251600160201b81118282018810171561094a57600080fd5b82525081516020918201929091019080838360005b8381101561097757818101518382015260200161095f565b50505050905090810190601f1680156109a45780820380516001836020036101000a031916815260200191505b50604052505050905090565b6001546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b60008111610a435760405162461bcd60e51b815260040180806020018281038252604b815260200180612eb2604b913960600191505060405180910390fd5b4381016002557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d610a72611e56565b600254604080516001600160a01b03909316835260208301919091528051918290030190a150565b6003546000906001600160a01b03163314610aea576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b610af5848484611e5a565b6000610ba683604051806060016040528060338152602001612dbc603391396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528c8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b505afa158015610b81573d6000803e3d6000fd5b505050506040513d6020811015610b9757600080fd5b5051919063ffffffff6120de16565b9050610bb3858783612175565b50600195945050505050565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4e41b226040518163ffffffff1660e01b815260040160206040518083038186803b158015610c0f57600080fd5b505afa158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b505190505b90565b6005546040805163236cfcdd60e01b81526001600160e01b0319851660048201526001600160a01b0384811660248301529151600093929092169163236cfcdd91604480820192602092909190829003018186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d6020811015610ccc57600080fd5b50519392505050565b60055460408051633c05076160e21b815290516000926001600160a01b03169163f0141d84916004808301926020929190829003018186803b158015610c0f57600080fd5b6001546001600160a01b03163314610d6e576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b436002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610d9b611e56565b604080516001600160a01b039092168252519081900360200190a1565b6001546001600160a01b0316610dcc6122a1565b6001600160a01b031614610e15576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b610e1f82826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b03868116602484015260448301869052925192909316926323de66519260648084019382900301818387803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050505050565b6004546001600160a01b031681565b6005546001600160a01b031681565b6003546000906001600160a01b03163314610f02576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6004805460408051630af4187d60e01b81526001600160a01b038881169482019490945286841660248201529051600093610f9a938793911691630af4187d91604480820192602092909190829003018186803b158015610f6257600080fd5b505afa158015610f76573d6000803e3d6000fd5b505050506040513d6020811015610f8c57600080fd5b50519063ffffffff61249816565b9050610fa7858583612175565b506001949350505050565b6001546001600160a01b0316610fc66122a1565b6001600160a01b03161461100f576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051631b56be2f60e21b81526001600160a01b03848116600483015291519190921691636d5af8bc91602480830192600092919082900301818387803b15801561105d57600080fd5b505af1158015611071573d6000803e3d6000fd5b5050505050565b600480546040805163f8b2cb4f60e01b81526001600160a01b038581169482019490945290516000939092169163f8b2cb4f91602480820192602092909190829003018186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d60208110156110f557600080fd5b505192915050565b6001546001600160a01b03166111116122a1565b6001600160a01b03161461115a576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051633d09cad560e11b815260ff8416600482015290516001600160a01b0390921691637a1395aa9160248082019260009290919082900301818387803b15801561105d57600080fd5b600054156111e8576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160009081556111f76122a1565b6005546040805163236cfcdd60e01b81526001600160e01b03198a1660048201526001600160a01b038085166024830152915193945091169163236cfcdd91604480820192602092909190829003018186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d602081101561128057600080fd5b505185146112bf5760405162461bcd60e51b8152600401808060200182810382526028815260200180612e8a6028913960400191505060405180910390fd5b8385106112fd5760405162461bcd60e51b815260040180806020018281038252603981526020018061308a6039913960400191505060405180910390fd5b6113bb818b8b8b8b8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060035460055460408051630fee24e560e41b815290516001600160a01b03938416955092909116925063fee24e50916004808301926020929190829003018186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d60208110156113b457600080fd5b50516124f9565b60055460408051635521f9b960e01b81526001600160e01b0319891660048201526001600160a01b0384811660248301526044820188905291519190921691635521f9b991606480830192600092919082900301818387803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b50505050611445818b8b8b8b61257d565b600360009054906101000a90046001600160a01b03166001600160a01b03166390d6001a828c8c8c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401808b6001600160a01b03166001600160a01b031681526020018a8152602001898152602001888152602001878152602001866001600160e01b0319166001600160e01b0319168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509b505050505050505050505050600060405180830381600087803b15801561153257600080fd5b505af1158015611546573d6000803e3d6000fd5b505060008055505050505050505050505050565b6001546001600160a01b031661156e6122a1565b6001600160a01b0316146115b7576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60035460408051638d2c45f560e01b81526001600160a01b03848116600483015291519190921691638d2c45f591602480830192600092919082900301818387803b15801561105d57600080fd5b6001546001600160a01b031681565b60055460408051631507040160e01b815290516060926001600160a01b0316916315070401916004808301926000929190829003018186803b1580156108c057600080fd5b6001546001600160a01b031661166d6122a1565b6001600160a01b031614806117715750600560009054906101000a90046001600160a01b03166001600160a01b031663925c5b626040518163ffffffff1660e01b815260040160206040518083038186803b1580156116cb57600080fd5b505afa1580156116df573d6000803e3d6000fd5b505050506040513d60208110156116f557600080fd5b505160408051638abf607760e01b815290516001600160a01b0390921691638abf607791600480820192602092909190829003018186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d602081101561176357600080fd5b50516001600160a01b031633145b6117b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6117ba8282612626565b600354604080516323de665160e01b81526001600160a01b0385811660048301526000602483018190526044830186905292519316926323de66519260648084019391929182900301818387803b158015610e7857600080fd5b60025481565b6001546001600160a01b031661182e6122a1565b6001600160a01b031614611877576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b600554604051635c26412360e11b8152602060048201908152602482018490526001600160a01b039092169163b84c824691859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546000906001600160a01b0316331461193e576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484611e5a565b5060019392505050565b6001546001600160a01b03166119676122a1565b6001600160a01b0316146119b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460405163c47f002760e01b8152602060048201908152602482018490526001600160a01b039092169163c47f002791859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546001600160a01b03163314611a74576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611a7d81612859565b61087881610878565b6003546000906001600160a01b03163314611ad6576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6000610f9a83604051806060016040528060308152602001612f48603091396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528a8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b6004805460408051630af4187d60e01b81526001600160a01b03868116948201949094528484166024820152905160009390921691630af4187d91604480820192602092909190829003018186803b158015610ca257600080fd5b6003546000906001600160a01b03163314611bf9576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484612175565b6001546001600160a01b0316611c186122a1565b6001600160a01b031614611c61576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6005546040805163e62c204d60e01b81526001600160a01b0384811660048301529151919092169163e62c204d91602480830192600092919082900301818387803b15801561105d57600080fd5b6003546001600160a01b031681565b6001546001600160a01b03163314611d12576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b6001600160a01b038116611d575760405162461bcd60e51b8152600401808060200182810382526021815260200180612efd6021913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60055460408051630fee24e560e41b815290516000926001600160a01b03169163fee24e50916004808301926020929190829003018186803b158015610c0f57600080fd5b60048054604080516313af403560e01b81526001600160a01b0385811694820194909452905192909116916313af40359160248082019260009290919082900301818387803b15801561105d57600080fd5b806001600160a01b0316ff5b3390565b600254431015611e9b5760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b038316611ee05760405162461bcd60e51b81526004018080602001828103825260308152602001806131156030913960400191505060405180910390fd5b6001600160a01b038216611f255760405162461bcd60e51b815260040180806020018281038252602e8152602001806131e3602e913960400191505060405180910390fd5b600454604080516060810190915260318082526001600160a01b039092169163e30443bc918691611fab918691612f786020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038d8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612072918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156120c157600080fd5b505af11580156120d5573d6000803e3d6000fd5b50505050505050565b6000818484111561216d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213257818101518382015260200161211a565b50505050905090810190601f16801561215f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6002544310156121b65760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0383166121fb5760405162461bcd60e51b815260040180806020018281038252602f815260200180612ffb602f913960400191505060405180910390fd5b6001600160a01b0382166122405760405162461bcd60e51b815260040180806020018281038252602d8152602001806130e8602d913960400191505060405180910390fd5b6004805460408051633691826360e21b81526001600160a01b03878116948201949094528584166024820152604481018590529051929091169163da46098c9160648082019260009290919082900301818387803b1580156120c157600080fd5b6003546000906001600160a01b03163314156122be575032610c3e565b5033610c3e565b6002544310156123065760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b03821661234b5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f1e602a913960400191505060405180910390fd5b60048054604080516362720d9160e11b815290516001600160a01b039092169263f7ea7a3d9261239b928692869263c4e41b22928083019260209291829003018186803b158015610f6257600080fd5b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123d157600080fd5b505af11580156123e5573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612449918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e7857600080fd5b6000828201838110156124f2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600061250b8c8c8c8c8c8c8c8c6128e0565b9050816001600160a01b031661252a6125248386612970565b86612a7e565b6001600160a01b03161461256f5760405162461bcd60e51b81526004018080602001828103825260458152602001806131456045913960600191505060405180910390fd5b505050505050505050505050565b60006125a1826125958581898963ffffffff61249816565b9063ffffffff61249816565b90506125ad86826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b038a8116602484015260448301869052925192909316926323de66519260648084019382900301818387803b15801561260657600080fd5b505af115801561261a573d6000803e3d6000fd5b50505050505050505050565b6002544310156126675760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0382166126ac5760405162461bcd60e51b815260040180806020018281038252602c81526020018061318a602c913960400191505060405180910390fd5b6004546040805160608101909152602d8082526001600160a01b039092169163e30443bc9185916127329186916131b66020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038c8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b505060048054604080516362720d9160e11b815290516001600160a01b03909216945063f7ea7a3d9350612823928692869263c4e41b229281810192602092909190829003018186803b1580156127eb57600080fd5b505afa1580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b50519063ffffffff612ae816565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e7857600080fd5b806001600160a01b0316634bc597b96040518163ffffffff1660e01b815260040160206040518083038186803b15801561289257600080fd5b505afa1580156128a6573d6000803e3d6000fd5b505050506040513d60208110156128bc57600080fd5b5051600480546001600160a01b0319166001600160a01b0390921691909117905550565b6000604051808061321160ca9139604080519182900360ca0182206020808401919091526001600160a01b039c909c1682820152606082019a909a526080810198909852505060a086019490945260c08501929092526001600160e01b03191660e08401526101008301526101208083019190915282518083039091018152610140909101909152805191012090565b60405160009046908290806052612fa982396040805191829003605201822082820182526006835265456e6572676960d01b6020938401528151808301835260018152603160f81b908401528151808401919091527fab646ac92b857c23e54eb792495c5eb5881f612f4dfd8c0ad27072e703f1e8c9818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101959095526001600160a01b0390961660a0808601919091528651808603909101815260c08501875280519082012061190160f01b60e086015260e2850152610102808501979097528551808503909701875261012290930190945250835193019290922092915050565b60008151604114612ac05760405162461bcd60e51b815260040180806020018281038252602c815260200180612e0f602c913960400191505060405180910390fd5b60208201516040830151606084015160001a612ade86828585612b2a565b9695505050505050565b60006124f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120de565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612b8b5760405162461bcd60e51b815260040180806020018281038252602f815260200180612e5b602f913960400191505060405180910390fd5b6000601e8560ff161115612c68576004850360ff16601b1480612bb457506004850360ff16601c145b612bef5760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6001612bfa87612d6a565b60048703868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612c57573d6000803e3d6000fd5b505050602060405103519050612d1c565b8460ff16601b1480612c7d57508460ff16601c145b612cb85760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6040805160008152602080820180845289905260ff8816828401526060820187905260808201869052915160019260a0808401939192601f1981019281900390910190855afa158015612d0f573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116612d615760405162461bcd60e51b81526004018080602001828103825260258152602001806130c36025913960400191505060405180910390fd5b95945050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c90910190915281519101209056fe4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433230546f6b656e3a20464f5242494444454e00000000000000000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206c656e677468476f7665726e656420436f6e74726163743a204e6f742070726f7879000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206073602076616c75654552433230546f6b656e3a20696e76616c6964206c617374436c61696d4e6f6e63652076616c75655061757361626c653a20526576657274202d20506175736520646964206e6f742061637469766174652e20506c6561736520656e746572206120706f73697469766520696e74656765722e4f776e61626c653a205a65726f2061646472657373206e6f7420616c6c6f7765644552433230546f6b656e2045524332303a206d696e7420746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294552433230546f6b656e2045524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206076602076616c75655061757361626c653a20526576657274202d20436f646520657865637574696f6e206973207374696c6c207061757365644552433230546f6b656e3a20636c61696d4e6f6e6365206d757374206265206c6172676572207468616e206c617374436c61696d4e6f6e63654c69625369676e61747572653a20696e76616c6964204543445341207369676e61747572654552433230546f6b656e2045524332303a20617070726f766520746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734c6962436c61696d41697264726f703a204549502d3731322061697264726f702073657276696365207369676e617475726520766572696669636174696f6e206572726f724552433230546f6b656e2045524332303a206275726e2066726f6d20746865207a65726f20616464726573734552433230546f6b656e2045524332303a206275726e20616d6f756e7420657863656564732062616c616e63654552433230546f6b656e2045524332303a207472616e7366657220746f20746865207a65726f20616464726573734552433230436c61696d286164647265737320726563697069656e742c75696e7432353620636c61696d416d6f756e7441697264726f702c75696e7432353620636c61696d416d6f756e74526566657272616c312c75696e7432353620636c61696d416d6f756e74526566657272616c322c75696e7432353620636c61696d416d6f756e74526566657272616c332c6279746573342061697264726f7049642c75696e74323536206c617374436c61696d4e6f6e63652c75696e7432353620636c61696d4e6f6e636529a265627a7a723158203708bd5c1812477eed2284dbba068121108ec29e81ed5e93fd2b454d46bbb7b964736f6c63430005100032

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

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f8f9c3ff6d89671fcbc0b97c815dd77d83e541000000000000000000000000746d6afd192a9b2caa1fd437c5053c9f441e0eea000000000000000000000000069994c2670428aae9990c041ffbbd589952377700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c447261676f6e20426c6f6f64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024442000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _proxy (address): 0x0000000000000000000000000000000000000000
Arg [1] : _airdropService (address): 0x21F8F9c3Ff6D89671fcBC0b97c815dD77D83E541
Arg [2] : _eRC721ManagerProxy (address): 0x746D6Afd192a9b2caA1fd437C5053c9F441e0EEa
Arg [3] : _owner (address): 0x069994C2670428AAE9990C041FFbBD5899523777
Arg [4] : _name (string): Dragon Blood
Arg [5] : _symbol (string): DB
Arg [6] : _decimals (uint8): 18

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000021f8f9c3ff6d89671fcbc0b97c815dd77d83e541
Arg [2] : 000000000000000000000000746d6afd192a9b2caa1fd437c5053c9f441e0eea
Arg [3] : 000000000000000000000000069994c2670428aae9990c041ffbbd5899523777
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [8] : 447261676f6e20426c6f6f640000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 4442000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.