ETH Price: $3,847.57 (+6.36%)

Token

ERC-20: OKPC GOLD (OKGLD)
 

Overview

Max Total Supply

5,330,788 OKGLD

Holders

482

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
vniu.eth
Balance
5,120 OKGLD

Value
$0.00
0xea5ABc1a1689984EbFDC41130886BdAEB5c24078
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
OKPCGold

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : OKPCGold.sol
/*

          
            .oooooo.   oooo    oooo ooooooooo.     .oooooo.     
           d8P'  `Y8b  `888   .8P'  `888   `Y88.  d8P'  `Y8b    
          888      888  888  d8'     888   .d88' 888            
          888      888  88888[       888ooo88P'  888            
          888      888  888`88b.     888         888            
          `88b    d88'  888  `88b.   888         `88b    ooo    
           `Y8bood8P'  o888o  o888o o888o         `Y8bood8P'    
          
          
            .oooooo.      .oooooo.   ooooo        oooooooooo.   
           d8P'  `Y8b    d8P'  `Y8b  `888'        `888'   `Y8b  
          888           888      888  888          888      888 
          888           888      888  888          888      888 
          888     ooooo 888      888  888          888      888 
          `88.    .88'  `88b    d88'  888       o  888     d88' 
           `Y8bood8P'    `Y8bood8P'  o888ooooood8 o888bood8P'   
          
           
          
           𝙰𝙽 𝙴𝚇𝚃𝙴𝙽𝚂𝙸𝙾𝙽 𝚃𝙾 𝙾𝙺𝙿𝙲 𝙶𝙰𝙻𝙻𝙴𝚁𝚈 𝙰𝚁𝚃𝚆𝙾𝚁𝙺 #𝟼𝟿: "𝙰𝙸𝚁𝙳𝚁𝙾𝙿"

*/

// SPDX-License-Identifier: Unlicense

pragma solidity ^0.8.14;

import "solmate/tokens/ERC20.sol";
import "solmate/auth/Owned.sol";
import "./interfaces/IOKPC.sol";
import "./interfaces/IOKPCMarketplace.sol";

/** 
@title OKPC Gold
@author shahruz.eth
*/

contract OKPCGold is Owned, ERC20 {
    // @dev Core OKPC contract
    IOKPC public immutable OKPC;

    // @dev Claim config
    uint256 public constant OKPC_CLAIM_MAX = 1_024;
    uint256 public constant AIRDROP_CLAIM = 10_000;

    // @dev Screen staking config
    uint256 public SCREEN_STAKING_INTERVAL = 64 days;
    uint256 public SCREEN_STAKING_REWARD = 256;

    // @dev Claim registry
    bool public CLAIMABLE;
    struct OKPCClaim {
        bool okpcClaimed;
        bool artworkClaimed;
        uint128 stakingLastClaimed;
    }
    mapping(uint256 => OKPCClaim) public okpcClaims;
    error ClaimNotOpen();
    error NoOKGLDClaimable();

    // @dev Modifiers
    modifier ifClaimable() {
        if (!CLAIMABLE) revert ClaimNotOpen();
        _;
    }

    // @dev Constructor
    constructor(IOKPC okpcAddress)
        Owned(msg.sender)
        ERC20("OKPC GOLD", "OKGLD", 18)
    {
        OKPC = okpcAddress;
    }

    /* -------------------------------------------------------------------------- */
    /*                                  CLAIM ALL                                 */
    /* -------------------------------------------------------------------------- */

    // @notice Claim all eligible OKGLD for an OKPC.
    // @param pcId An OKPC tokenId. Reverts if the token is not owned by the caller.
    function claim(uint256 pcId) external ifClaimable {
        if (OKPC.ownerOf(pcId) != msg.sender) revert NoOKGLDClaimable();
        uint256 amount;
        amount += _claimForOKPC(pcId);
        amount += _claimForArtwork(pcId);
        amount += _claimForScreenStaking(pcId);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @notice Claim all eligible OKGLD for a set of OKPCs.
    // @param pcIds An array of OKPC tokenIds. Tokens not owned by the caller are skipped.
    function claim(uint256[] calldata pcIds) external ifClaimable {
        uint256 amount;
        for (uint256 i; i < pcIds.length; i++)
            if (OKPC.ownerOf(pcIds[i]) == msg.sender) {
                amount += _claimForOKPC(pcIds[i]);
                amount += _claimForArtwork(pcIds[i]);
                amount += _claimForScreenStaking(pcIds[i]);
            }
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @notice Calculate the total amount of OKGLD an OKPC is eligible to claim.
    // @param pcId An OKPC tokenId.
    function claimableAmount(uint256 pcId)
        public
        view
        returns (uint256 amount)
    {
        return
            claimableAmountForOKPC(pcId) +
            claimableAmountForArtwork(pcId) +
            claimableAmountForScreenStaking(pcId);
    }

    // @notice Calculate the total amount of OKGLD a set of OKPCs are eligible to claim.
    // @param pcIds An array of OKPC tokenIds.
    function claimableAmount(uint256[] calldata pcIds)
        public
        view
        returns (uint256 amount)
    {
        for (uint256 i; i < pcIds.length; i++)
            amount += claimableAmount(pcIds[i]);
    }

    /* -------------------------------------------------------------------------- */
    /*                                 OKPC CLAIM                                 */
    /* -------------------------------------------------------------------------- */

    // @notice Claim OKGLD for an OKPC, based on its clock speed and amount of art collected.
    // @param pcId An OKPC tokenId. Reverts if the token is not owned by the caller.
    function claimForOKPC(uint256 pcId) external ifClaimable {
        if (OKPC.ownerOf(pcId) != msg.sender) revert NoOKGLDClaimable();
        uint256 amount = _claimForOKPC(pcId);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @notice Claim OKGLD for a set of OKPCs, based on their clock speeds and amounts of art collected.
    // @param pcIds An array of OKPC tokenIds. Tokens not owned by the caller are skipped.
    function claimForOKPC(uint256[] calldata pcIds) external ifClaimable {
        uint256 amount;
        for (uint256 i; i < pcIds.length; i++)
            if (OKPC.ownerOf(pcIds[i]) == msg.sender)
                amount += _claimForOKPC(pcIds[i]);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @dev Calculate the amount of OKGLD an OKPC is eligible to claim, based on its clock speed and amount of art collected.
    // @dev Register the claimed OKPC using its tokenId to lock future claims.
    function _claimForOKPC(uint256 pcId) private returns (uint256 amount) {
        amount = claimableAmountForOKPC(pcId);
        if (amount > 0) okpcClaims[pcId].okpcClaimed = true;
    }

    // @notice Calculate the amount of OKGLD an OKPC is eligible to claim, based on its clock speed and amount of art collected.
    // @param pcId An OKPC tokenId.
    function claimableAmountForOKPC(uint256 pcId)
        public
        view
        returns (uint256 amount)
    {
        return claimableAmountForOKPC(pcId, 0);
    }

    // @notice Calculate the amount of OKGLD a set of OKPCs is eligible to claim, based on its clock speed and amount of art collected.
    // @param pcIds An array of OKPC tokenIds.
    function claimableAmountForOKPC(uint256[] calldata pcIds)
        public
        view
        returns (uint256 amount)
    {
        for (uint256 i; i < pcIds.length; i++)
            amount += claimableAmountForOKPC(pcIds[i], 0);
    }

    // @notice Calculate the projected amount of OKGLD a set of OKPCs will be eligible to claim after a specified number of blocks, based on their clock speeds and amount of art collected.
    // @param pcIds An array of OKPC tokenIds.
    // @param afterBlocks An optional number of blocks to skip ahead for projected clock speed scores.
    function claimableAmountForOKPC(
        uint256[] calldata pcIds,
        uint256 afterBlocks
    ) public view returns (uint256 amount) {
        for (uint256 i; i < pcIds.length; i++)
            amount += claimableAmountForOKPC(pcIds[i], afterBlocks);
    }

    // @notice Calculate the projected amount of OKGLD an OKPC will be eligible to claim after a specified number of blocks, based on its clock speed and amount of art collected.
    // @param pcId An OKPC tokenId.
    // @param afterBlocks An optional number of blocks to skip ahead for projected clock speed scores.
    function claimableAmountForOKPC(uint256 pcId, uint256 afterBlocks)
        public
        view
        returns (uint256 amount)
    {
        if (okpcClaims[pcId].okpcClaimed == false) {
            uint256 artCount = OKPC.artCountForOKPC(pcId);
            uint256 total = (clockSpeedProjected(pcId, afterBlocks) / 2) *
                2**(artCount > 3 ? 3 : artCount);
            amount = total > OKPC_CLAIM_MAX ? OKPC_CLAIM_MAX : total;
        }
    }

    // @notice Calculate the projected clock speed of an OKPC after a specified number of blocks.
    // @param pcId An OKPC tokenId.
    // @param afterBlocks A number of blocks to skip ahead.
    function clockSpeedProjected(uint256 pcId, uint256 afterBlocks)
        public
        view
        returns (uint256)
    {
        (uint256 savedSpeed, uint256 lastBlock, , ) = OKPC.clockSpeedData(pcId);
        if (lastBlock == 0) return 1;
        uint256 delta = block.number + afterBlocks - lastBlock;
        uint256 multiplier = delta / 200_000;
        uint256 clockSpeedMaxMultiplier = OKPC.clockSpeedMaxMultiplier();
        if (multiplier > clockSpeedMaxMultiplier)
            multiplier = clockSpeedMaxMultiplier;
        uint256 total = savedSpeed + ((delta * (multiplier + 1)) / 10_000);
        if (total < 1) total = 1;
        return total;
    }

    // @notice Calculate the projected clock speed of a set of OKPCs after a specified number of blocks.
    // @param pcIds An array of OKPC tokenIds.
    // @param afterBlocks A number of blocks to skip ahead.
    function clockSpeedProjected(uint256[] calldata pcIds, uint256 afterBlocks)
        public
        view
        returns (uint256[] memory)
    {
        uint256[] memory result = new uint256[](pcIds.length);
        for (uint256 i; i < pcIds.length; i++)
            result[i] = clockSpeedProjected(pcIds[i], afterBlocks);
        return result;
    }

    /* -------------------------------------------------------------------------- */
    /*                                ARTWORK CLAIM                               */
    /* -------------------------------------------------------------------------- */

    // @notice Claim OKGLD for an OKPC that has collected the AIRDROP artwork from the Gallery.
    // @param pcId An OKPC tokenId. Reverts if the token is not owned by the caller.
    function claimForArtwork(uint256 pcId) external ifClaimable {
        if (OKPC.ownerOf(pcId) != msg.sender) revert NoOKGLDClaimable();
        uint256 amount = _claimForArtwork(pcId);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @notice Claim OKGLD for a set of OKPCs that have collected the AIRDROP artwork from the Gallery.
    // @param pcIds An array of OKPC tokenIds. Tokens not owned by the caller are skipped.
    function claimForArtwork(uint256[] calldata pcIds) external ifClaimable {
        uint256 amount;
        for (uint256 i; i < pcIds.length; i++)
            if (OKPC.ownerOf(pcIds[i]) == msg.sender)
                amount += _claimForArtwork(pcIds[i]);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @dev Calculate the amount of OKGLD an OKPC is eligible to claim, based on collecting the AIRDROP artwork from the Gallery.
    // @dev Register the artwork claim using its tokenId to lock future claims.
    function _claimForArtwork(uint256 pcId) private returns (uint256 amount) {
        amount = claimableAmountForArtwork(pcId);
        if (amount > 0) okpcClaims[pcId].artworkClaimed = true;
    }

    // @notice Calculate the amount of OKGLD an OKPC is eligible to claim, based on collecting the AIRDROP artwork from the Gallery.
    // @param pcId An OKPC tokenId.
    function claimableAmountForArtwork(uint256 pcId)
        public
        view
        returns (uint256 amount)
    {
        if (
            okpcClaims[pcId].artworkClaimed == false &&
            OKPC.artCollectedByOKPC(pcId, 69)
        ) {
            if (
                OKPC.marketplaceAddress() == address(0) ||
                IOKPCMarketplace(OKPC.marketplaceAddress()).didMint(pcId, 69)
            ) amount = AIRDROP_CLAIM;
        }
    }

    // @notice Calculate the amount of OKGLD a set of OKPCs is eligible to claim, based on collecting the AIRDROP artwork from the Gallery.
    // @param pcId An array of OKPC tokenIds.
    function claimableAmountForArtwork(uint256[] calldata pcIds)
        public
        view
        returns (uint256 amount)
    {
        for (uint256 i; i < pcIds.length; i++)
            amount += claimableAmountForArtwork(pcIds[i]);
    }

    /* -------------------------------------------------------------------------- */
    /*                               SCREEN STAKING                               */
    /* -------------------------------------------------------------------------- */

    // @notice Claim OKGLD for an OKPC that is continuously displaying the AIRDROP artwork from the Gallery.
    // @param pcId An OKPC tokenId. Reverts if the token is not owned by the caller.
    function claimForScreenStaking(uint256 pcId) external ifClaimable {
        if (OKPC.ownerOf(pcId) != msg.sender) revert NoOKGLDClaimable();
        uint256 amount = _claimForScreenStaking(pcId);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @notice Claim OKGLD for a set of OKPCs that are continuously displaying the AIRDROP artwork from the Gallery.
    // @param pcIds A set of OKPC tokenIds. Tokens not owned by the caller are skipped.
    function claimForScreenStaking(uint256[] calldata pcIds)
        external
        ifClaimable
    {
        uint256 amount;
        for (uint256 i; i < pcIds.length; i++)
            if (OKPC.ownerOf(pcIds[i]) == msg.sender)
                amount += _claimForScreenStaking(pcIds[i]);
        if (amount == 0) revert NoOKGLDClaimable();
        _mint(msg.sender, amount * 10**decimals);
    }

    // @dev Calculate the amount of OKGLD an OKPC is eligible to claim, based on continuously displaying the AIRDROP artwork from the Gallery.
    // @dev Register the screen staking claim to reset the clock.
    function _claimForScreenStaking(uint256 pcId)
        private
        returns (uint256 amount)
    {
        amount = claimableAmountForScreenStaking(pcId);
        if (amount > 0)
            okpcClaims[pcId].stakingLastClaimed = uint128(block.timestamp);
    }

    // @notice Calculate the amount of OKGLD an OKPC is eligible to claim, based on continuously displaying the AIRDROP artwork from the Gallery.
    // @param pcId An OKPC tokenId.
    function claimableAmountForScreenStaking(uint256 pcId)
        public
        view
        returns (uint256 amount)
    {
        return claimableAmountForScreenStaking(pcId, 0);
    }

    // @notice Calculate the amount of OKGLD a set of OKPCs is eligible to claim, based on continuously displaying the AIRDROP artwork from the Gallery.
    // @param pcIds An array of OKPC tokenIds.
    function claimableAmountForScreenStaking(uint256[] calldata pcIds)
        public
        view
        returns (uint256 amount)
    {
        for (uint256 i; i < pcIds.length; i++)
            amount += claimableAmountForScreenStaking(pcIds[i]);
    }

    // @notice Calculate the projected amount of OKGLD an OKPC will be eligible to claim after a specified number of seconds, based on continuously displaying the AIRDROP artwork from the Gallery.
    // @param pcId An OKPC tokenId.
    // @param afterTime An optional number of seconds to skip ahead for projected screen staking rewards.
    function claimableAmountForScreenStaking(uint256 pcId, uint256 afterTime)
        public
        view
        returns (uint256 amount)
    {
        if (OKPC.activeArtForOKPC(pcId) != 69) return 0;
        (, , , uint256 artLastChanged) = OKPC.clockSpeedData(pcId);
        uint256 previous = (
            okpcClaims[pcId].stakingLastClaimed > artLastChanged
                ? okpcClaims[pcId].stakingLastClaimed
                : artLastChanged
        );
        if (block.timestamp + afterTime >= previous + SCREEN_STAKING_INTERVAL)
            amount =
                SCREEN_STAKING_REWARD *
                ((block.timestamp + afterTime - previous) /
                    SCREEN_STAKING_INTERVAL);
    }

    // @notice Calculate the projected amount of OKGLD a set of OKPCs will be eligible to claim after a specified number of seconds, based on continuously displaying the AIRDROP artwork from the Gallery.
    // @param pcIds An array of OKPC tokenIds.
    // @param afterTime An optional number of seconds to skip ahead for projected screen staking rewards.
    function claimableAmountForScreenStaking(
        uint256[] calldata pcIds,
        uint256 afterTime
    ) public view returns (uint256 amount) {
        for (uint256 i; i < pcIds.length; i++)
            amount += claimableAmountForScreenStaking(pcIds[i], afterTime);
    }

    /* -------------------------------------------------------------------------- */
    /*                               TOKEN FUNCTIONS                              */
    /* -------------------------------------------------------------------------- */

    // @notice Burn tokens and decrease the totalSupply.
    // @param amount An amount of tokens to burn.
    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    /* -------------------------------------------------------------------------- */
    /*                                    OWNER                                   */
    /* -------------------------------------------------------------------------- */

    // @notice Turn the ability to claim on or off. Owner only.
    function setClaimable(bool claimable) external onlyOwner {
        CLAIMABLE = claimable;
    }

    // @notice Adjust the screen staking configuration. Owner only.
    function setScreenStakingConfig(
        uint256 screenStakingInterval,
        uint256 screenStakingReward
    ) external onlyOwner {
        SCREEN_STAKING_INTERVAL = screenStakingInterval;
        SCREEN_STAKING_REWARD = screenStakingReward;
    }
}

File 2 of 5 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

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

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 3 of 5 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnerUpdated(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnerUpdated(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function setOwner(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnerUpdated(msg.sender, newOwner);
    }
}

File 4 of 5 : IOKPC.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.14;

interface IOKPC {
    function marketplaceAddress() external view returns (address);

    function owner() external view returns (address);

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

    function ownerOf(uint256 tokenId) external view returns (address);

    function artCountForOKPC(uint256) external view returns (uint256);

    function clockSpeed(uint256) external view returns (uint256);

    function clockSpeedMaxMultiplier() external view returns (uint256);

    function clockSpeedData(uint256 pcId)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        );

    function activeArtForOKPC(uint256 pcId) external view returns (uint256);

    function artCollectedByOKPC(uint256 pcId, uint256 artId)
        external
        view
        returns (bool);

    function setMarketplaceAddress(address marketplaceAddress) external;

    function transferArt(
        uint256 fromOKPC,
        uint256 toOKPC,
        uint256 artId
    ) external;
}

File 5 of 5 : IOKPCMarketplace.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.14;

interface IOKPCMarketplace {
    function didMint(uint256 pcId, uint256 artId) external view returns (bool);
}

Settings
{
  "remappings": [
    "ds-test/=lib/solmate/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/src/",
    "src/=src/",
    "test/=test/",
    "script/=script/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IOKPC","name":"okpcAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ClaimNotOpen","type":"error"},{"inputs":[],"name":"NoOKGLDClaimable","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AIRDROP_CLAIM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLAIMABLE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OKPC","outputs":[{"internalType":"contract IOKPC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OKPC_CLAIM_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCREEN_STAKING_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCREEN_STAKING_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimForArtwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimForArtwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimForOKPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimForOKPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimForScreenStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimForScreenStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimableAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimableAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimableAmountForArtwork","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimableAmountForArtwork","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimableAmountForOKPC","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimableAmountForOKPC","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"},{"internalType":"uint256","name":"afterBlocks","type":"uint256"}],"name":"claimableAmountForOKPC","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"},{"internalType":"uint256","name":"afterBlocks","type":"uint256"}],"name":"claimableAmountForOKPC","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"}],"name":"claimableAmountForScreenStaking","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"},{"internalType":"uint256","name":"afterTime","type":"uint256"}],"name":"claimableAmountForScreenStaking","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"},{"internalType":"uint256","name":"afterTime","type":"uint256"}],"name":"claimableAmountForScreenStaking","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"}],"name":"claimableAmountForScreenStaking","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pcIds","type":"uint256[]"},{"internalType":"uint256","name":"afterBlocks","type":"uint256"}],"name":"clockSpeedProjected","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pcId","type":"uint256"},{"internalType":"uint256","name":"afterBlocks","type":"uint256"}],"name":"clockSpeedProjected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"okpcClaims","outputs":[{"internalType":"bool","name":"okpcClaimed","type":"bool"},{"internalType":"bool","name":"artworkClaimed","type":"bool"},{"internalType":"uint128","name":"stakingLastClaimed","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"claimable","type":"bool"}],"name":"setClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"screenStakingInterval","type":"uint256"},{"internalType":"uint256","name":"screenStakingReward","type":"uint256"}],"name":"setScreenStakingConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

610100604052625460006007556101006008553480156200001f57600080fd5b5060405162002c8738038062002c87833981016040819052620000429162000261565b604080518082018252600981526813d2d410c811d3d31160ba1b60208083019190915282518084018452600581526413d2d1d31160da1b91810191909152600080546001600160a01b0319163390811782559351929391926012929182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3508251620000db906001906020860190620001bb565b508151620000f1906002906020850190620001bb565b5060ff81166080524660a052620001076200011f565b60c0525050506001600160a01b031660e05262000372565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6001604051620001539190620002cf565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b828054620001c99062000293565b90600052602060002090601f016020900481019282620001ed576000855562000238565b82601f106200020857805160ff191683800117855562000238565b8280016001018555821562000238579182015b82811115620002385782518255916020019190600101906200021b565b50620002469291506200024a565b5090565b5b808211156200024657600081556001016200024b565b6000602082840312156200027457600080fd5b81516001600160a01b03811681146200028c57600080fd5b9392505050565b600181811c90821680620002a857607f821691505b602082108103620002c957634e487b7160e01b600052602260045260246000fd5b50919050565b600080835481600182811c915080831680620002ec57607f831692505b602080841082036200030c57634e487b7160e01b86526022600452602486fd5b818015620003235760018114620003355762000364565b60ff1986168952848901965062000364565b60008a81526020902060005b868110156200035c5781548b82015290850190830162000341565b505084890196505b509498975050505050505050565b60805160a05160c05160e05161285d6200042a600039600081816105a10152818161087001528181610a0b01528181610e3b01528181610ff7015281816111e701528181611300015281816114960152818161151b015281816115ad015281816116e1015281816117f5015281816118ab0152818161194601528181611ce801528181611dd70152611eab01526000610d9901526000610d640152600081816103860152818161098e0152610ad4015261285d6000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80636ba4c1381161015c578063a9059cbb116100ce578063d505accf11610087578063d505accf14610638578063dd62ed3e1461064b578063ec937e7014610676578063f27e1ef314610689578063f700ae8b1461069c578063ff7b3446146106a557600080fd5b8063a9059cbb146105d0578063b140f644146105e3578063b4208bbf146105f6578063b778985b146105ff578063b81087fb14610612578063c640e9af1461062557600080fd5b80638c607c38116101205780638c607c38146105435780638da5cb5b14610556578063902604221461058157806395d89b4114610594578063980a04471461059c5780639b8799c8146105c357600080fd5b80636ba4c138146104ca5780636cfe0ad1146104dd57806370a08231146104f05780637ecebe00146105105780637f2d91021461053057600080fd5b8063313ce567116102005780634373853d116101b95780634373853d1461041b57806344dcb4d8146104245780634bdfc7361461042d5780634c64a52314610440578063503d154d146104a457806368939509146104b757600080fd5b8063313ce56714610381578063315d32aa146103ba5780633644e515146103da578063378c93ad146103e2578063379607f5146103f557806342966c681461040857600080fd5b806319859c641161025257806319859c641461030f5780631c836bcf1461032257806323b872dd1461033557806327c87a9b146103485780632b9727bf1461035b5780632ce4e4701461036e57600080fd5b806306fdde031461028f578063095ea7b3146102ad57806313af4035146102d057806314014565146102e557806318160ddd14610306575b600080fd5b6102976106b8565b6040516102a4919061218a565b60405180910390f35b6102c06102bb3660046121f4565b610746565b60405190151581526020016102a4565b6102e36102de366004612220565b6107b3565b005b6102f86102f3366004612244565b610831565b6040519081526020016102a4565b6102f860035481565b6102e361031d3660046122a9565b61083e565b6102e3610330366004612244565b6109c8565b6102c06103433660046122eb565b610afe565b6102f86103563660046122a9565b610bde565b6102f86103693660046122a9565b610c30565b6102e361037c36600461232c565b610c7d565b6103a87f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016102a4565b6103cd6103c836600461234e565b610cb2565b6040516102a4919061239a565b6102f8610d60565b6102e36103f03660046123ec565b610dbb565b6102e3610403366004612244565b610df8565b6102e3610416366004612244565b610f0c565b6102f860075481565b6102f861040081565b6102f861043b3660046122a9565b610f19565b61047e61044e366004612244565b600a6020526000908152604090205460ff808216916101008104909116906201000090046001600160801b031683565b60408051931515845291151560208401526001600160801b0316908201526060016102a4565b6102f86104b2366004612244565b610f64565b6102f86104c536600461234e565b610f71565b6102e36104d83660046122a9565b610fc5565b6102f86104eb366004612244565b611138565b6102f86104fe366004612220565b60046020526000908152604090205481565b6102f861051e366004612220565b60066020526000908152604090205481565b6102f861053e36600461234e565b611169565b6102e36105513660046122a9565b6111b5565b600054610569906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b6102e361058f3660046122a9565b6112ce565b6102976113e7565b6105697f000000000000000000000000000000000000000000000000000000000000000081565b6009546102c09060ff1681565b6102c06105de3660046121f4565b6113f4565b6102f86105f1366004612244565b61145a565b6102f861271081565b6102f861060d36600461232c565b6116ae565b6102e3610620366004612244565b6117b2565b6102f861063336600461232c565b611892565b6102e3610646366004612409565b611a61565b6102f8610659366004612480565b600560209081526000928352604080842090915290825290205481565b6102e3610684366004612244565b611ca5565b6102f86106973660046122a9565b611d85565b6102f860085481565b6102f86106b336600461232c565b611dd0565b600180546106c5906124b9565b80601f01602080910402602001604051908101604052809291908181526020018280546106f1906124b9565b801561073e5780601f106107135761010080835404028352916020019161073e565b820191906000526020600020905b81548152906001019060200180831161072157829003601f168201915b505050505081565b3360008181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107a19086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b031633146107e65760405162461bcd60e51b81526004016107dd906124f3565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b60006107ad826000611892565b60095460ff16610861576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e8686858181106108af576108af612519565b905060200201356040518263ffffffff1660e01b81526004016108d491815260200190565b602060405180830381865afa1580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610915919061252f565b6001600160a01b0316036109515761094484848381811061093857610938612519565b90506020020135611f82565b61094e9083612562565b91505b8061095b8161257a565b915050610865565b5080600003610985576040516344b4f38360e11b815260040160405180910390fd5b6109c3336109b47f0000000000000000000000000000000000000000000000000000000000000000600a612677565b6109be9084612686565b611fd0565b505050565b60095460ff166109eb576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a76919061252f565b6001600160a01b031614610a9d576040516344b4f38360e11b815260040160405180910390fd5b6000610aa88261202a565b905080600003610acb576040516344b4f38360e11b815260040160405180910390fd5b610afa336109b47f0000000000000000000000000000000000000000000000000000000000000000600a612677565b5050565b6001600160a01b03831660009081526005602090815260408083203384529091528120546000198114610b5a57610b3583826126a5565b6001600160a01b03861660009081526005602090815260408083203384529091529020555b6001600160a01b03851660009081526004602052604081208054859290610b829084906126a5565b90915550506001600160a01b038085166000818152600460205260409081902080548701905551909187169060008051602061280883398151915290610bcb9087815260200190565b60405180910390a3506001949350505050565b6000805b82811015610c2957610c0b848483818110610bff57610bff612519565b9050602002013561145a565b610c159083612562565b915080610c218161257a565b915050610be2565b5092915050565b6000805b82811015610c2957610c5f848483818110610c5157610c51612519565b9050602002013560006116ae565b610c699083612562565b915080610c758161257a565b915050610c34565b6000546001600160a01b03163314610ca75760405162461bcd60e51b81526004016107dd906124f3565b600791909155600855565b606060008367ffffffffffffffff811115610ccf57610ccf6126bc565b604051908082528060200260200182016040528015610cf8578160200160208202803683370190505b50905060005b84811015610d5757610d28868683818110610d1b57610d1b612519565b9050602002013585611dd0565b828281518110610d3a57610d3a612519565b602090810291909101015280610d4f8161257a565b915050610cfe565b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610d9657610d9161205b565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000546001600160a01b03163314610de55760405162461bcd60e51b81526004016107dd906124f3565b6009805460ff1916911515919091179055565b60095460ff16610e1b576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061252f565b6001600160a01b031614610ecd576040516344b4f38360e11b815260040160405180910390fd5b6000610ed88261202a565b610ee29082612562565b9050610eed826120f5565b610ef79082612562565b9050610f0282611f82565b610aa89082612562565b610f163382612128565b50565b6000805b82811015610c2957610f46848483818110610f3a57610f3a612519565b90506020020135611138565b610f509083612562565b915080610f5c8161257a565b915050610f1d565b60006107ad8260006116ae565b6000805b83811015610fbd57610f9f858583818110610f9257610f92612519565b9050602002013584611892565b610fa99083612562565b915080610fb58161257a565b915050610f75565b509392505050565b60095460ff16610fe8576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e86868581811061103657611036612519565b905060200201356040518263ffffffff1660e01b815260040161105b91815260200190565b602060405180830381865afa158015611078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109c919061252f565b6001600160a01b031603611126576110cb8484838181106110bf576110bf612519565b9050602002013561202a565b6110d59083612562565b91506110f88484838181106110ec576110ec612519565b905060200201356120f5565b6111029083612562565b915061111984848381811061093857610938612519565b6111239083612562565b91505b806111308161257a565b915050610fec565b600061114382610831565b61114c8361145a565b61115584610f64565b61115f9190612562565b6107ad9190612562565b6000805b83811015610fbd5761119785858381811061118a5761118a612519565b90506020020135846116ae565b6111a19083612562565b9150806111ad8161257a565b91505061116d565b60095460ff166111d8576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e86868581811061122657611226612519565b905060200201356040518263ffffffff1660e01b815260040161124b91815260200190565b602060405180830381865afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c919061252f565b6001600160a01b0316036112bc576112af8484838181106110ec576110ec612519565b6112b99083612562565b91505b806112c68161257a565b9150506111dc565b60095460ff166112f1576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e86868581811061133f5761133f612519565b905060200201356040518263ffffffff1660e01b815260040161136491815260200190565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a5919061252f565b6001600160a01b0316036113d5576113c88484838181106110bf576110bf612519565b6113d29083612562565b91505b806113df8161257a565b9150506112f5565b600280546106c5906124b9565b336000908152600460205260408120805483919083906114159084906126a5565b90915550506001600160a01b03831660008181526004602052604090819020805485019055513390600080516020612808833981519152906107a19086815260200190565b6000818152600a6020526040812054610100900460ff161580156115095750604051630458b6db60e01b815260048101839052604560248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630458b6db90604401602060405180830381865afa1580156114e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150991906126d2565b156116a95760006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663daa17f496040518163ffffffff1660e01b8152600401602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b919061252f565b6001600160a01b0316148061169f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663daa17f496040518163ffffffff1660e01b8152600401602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d919061252f565b604051638439043360e01b815260048101849052604560248201526001600160a01b039190911690638439043390604401602060405180830381865afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f91906126d2565b156116a957506127105b919050565b6000828152600a602052604081205460ff16151581036107ad57604051632129022960e11b8152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634252045290602401602060405180830381865afa158015611730573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175491906126ef565b90506000600382116117665781611769565b60035b611774906002612708565b60026117808787611dd0565b61178a9190612714565b6117949190612686565b905061040081116117a557806117a9565b6104005b95945050505050565b60095460ff166117d5576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa15801561183c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611860919061252f565b6001600160a01b031614611887576040516344b4f38360e11b815260040160405180910390fd5b6000610aa882611f82565b60405163b75f7e5160e01b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b75f7e5190602401602060405180830381865afa1580156118fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191e91906126ef565b60451461192d575060006107ad565b604051634b00b4cd60e11b8152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639601699a90602401608060405180830381865afa158015611995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b99190612736565b6000888152600a602052604081205491955093506201000090046001600160801b0316841091506119ec90505781611a0b565b6000858152600a60205260409020546201000090046001600160801b03165b905060075481611a1b9190612562565b611a258542612562565b10611a595760075481611a388642612562565b611a4291906126a5565b611a4c9190612714565b6008546117a99190612686565b505092915050565b42841015611ab15760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016107dd565b60006001611abd610d60565b6001600160a01b038a811660008181526006602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611bc9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611bff5750876001600160a01b0316816001600160a01b0316145b611c3c5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107dd565b6001600160a01b0390811660009081526005602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60095460ff16611cc8576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d53919061252f565b6001600160a01b031614611d7a576040516344b4f38360e11b815260040160405180910390fd5b6000610aa8826120f5565b6000805b82811015610c2957611db2848483818110611da657611da6612519565b90506020020135610831565b611dbc9083612562565b915080611dc88161257a565b915050611d89565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639601699a866040518263ffffffff1660e01b8152600401611e2391815260200190565b608060405180830381865afa158015611e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e649190612736565b50509150915080600003611e7d576001925050506107ad565b600081611e8a8643612562565b611e9491906126a5565b90506000611ea562030d4083612714565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638d774da86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2b91906126ef565b905080821115611f39578091505b6000612710611f49846001612562565b611f539086612686565b611f5d9190612714565b611f679087612562565b90506001811015611f76575060015b98975050505050505050565b6000611f8d82610831565b905080156116a9576000918252600a6020526040909120805471ffffffffffffffffffffffffffffffff0000191662010000426001600160801b03160217905590565b8060036000828254611fe29190612562565b90915550506001600160a01b03821660008181526004602090815260408083208054860190555184815260008051602061280883398151915291015b60405180910390a35050565b600061203582610f64565b905080156116a9576000828152600a60205260409020805460ff19166001179055919050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600160405161208d919061276c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006121008261145a565b905080156116a9576000828152600a60205260409020805461ff001916610100179055919050565b6001600160a01b038216600090815260046020526040812080548392906121509084906126a5565b90915550506003805482900390556040518181526000906001600160a01b038416906000805160206128088339815191529060200161201e565b600060208083528351808285015260005b818110156121b75785810183015185820160400152820161219b565b818111156121c9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610f1657600080fd5b6000806040838503121561220757600080fd5b8235612212816121df565b946020939093013593505050565b60006020828403121561223257600080fd5b813561223d816121df565b9392505050565b60006020828403121561225657600080fd5b5035919050565b60008083601f84011261226f57600080fd5b50813567ffffffffffffffff81111561228757600080fd5b6020830191508360208260051b85010111156122a257600080fd5b9250929050565b600080602083850312156122bc57600080fd5b823567ffffffffffffffff8111156122d357600080fd5b6122df8582860161225d565b90969095509350505050565b60008060006060848603121561230057600080fd5b833561230b816121df565b9250602084013561231b816121df565b929592945050506040919091013590565b6000806040838503121561233f57600080fd5b50508035926020909101359150565b60008060006040848603121561236357600080fd5b833567ffffffffffffffff81111561237a57600080fd5b6123868682870161225d565b909790965060209590950135949350505050565b6020808252825182820181905260009190848201906040850190845b818110156123d2578351835292840192918401916001016123b6565b50909695505050505050565b8015158114610f1657600080fd5b6000602082840312156123fe57600080fd5b813561223d816123de565b600080600080600080600060e0888a03121561242457600080fd5b873561242f816121df565b9650602088013561243f816121df565b95506040880135945060608801359350608088013560ff8116811461246357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561249357600080fd5b823561249e816121df565b915060208301356124ae816121df565b809150509250929050565b600181811c908216806124cd57607f821691505b6020821081036124ed57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561254157600080fd5b815161223d816121df565b634e487b7160e01b600052601160045260246000fd5b600082198211156125755761257561254c565b500190565b60006001820161258c5761258c61254c565b5060010190565b600181815b808511156125ce5781600019048211156125b4576125b461254c565b808516156125c157918102915b93841c9390800290612598565b509250929050565b6000826125e5575060016107ad565b816125f2575060006107ad565b816001811461260857600281146126125761262e565b60019150506107ad565b60ff8411156126235761262361254c565b50506001821b6107ad565b5060208310610133831016604e8410600b8410161715612651575081810a6107ad565b61265b8383612593565b806000190482111561266f5761266f61254c565b029392505050565b600061223d60ff8416836125d6565b60008160001904831182151516156126a0576126a061254c565b500290565b6000828210156126b7576126b761254c565b500390565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156126e457600080fd5b815161223d816123de565b60006020828403121561270157600080fd5b5051919050565b600061223d83836125d6565b60008261273157634e487b7160e01b600052601260045260246000fd5b500490565b6000806000806080858703121561274c57600080fd5b505082516020840151604085015160609095015191969095509092509050565b600080835481600182811c91508083168061278857607f831692505b602080841082036127a757634e487b7160e01b86526022600452602486fd5b8180156127bb57600181146127cc576127f9565b60ff198616895284890196506127f9565b60008a81526020902060005b868110156127f15781548b8201529085019083016127d8565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220125265282537218036d0d00bade8f34d825688ab94b2bc0ce1d2a97ee8c672bf64736f6c634300080e00330000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e8

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80636ba4c1381161015c578063a9059cbb116100ce578063d505accf11610087578063d505accf14610638578063dd62ed3e1461064b578063ec937e7014610676578063f27e1ef314610689578063f700ae8b1461069c578063ff7b3446146106a557600080fd5b8063a9059cbb146105d0578063b140f644146105e3578063b4208bbf146105f6578063b778985b146105ff578063b81087fb14610612578063c640e9af1461062557600080fd5b80638c607c38116101205780638c607c38146105435780638da5cb5b14610556578063902604221461058157806395d89b4114610594578063980a04471461059c5780639b8799c8146105c357600080fd5b80636ba4c138146104ca5780636cfe0ad1146104dd57806370a08231146104f05780637ecebe00146105105780637f2d91021461053057600080fd5b8063313ce567116102005780634373853d116101b95780634373853d1461041b57806344dcb4d8146104245780634bdfc7361461042d5780634c64a52314610440578063503d154d146104a457806368939509146104b757600080fd5b8063313ce56714610381578063315d32aa146103ba5780633644e515146103da578063378c93ad146103e2578063379607f5146103f557806342966c681461040857600080fd5b806319859c641161025257806319859c641461030f5780631c836bcf1461032257806323b872dd1461033557806327c87a9b146103485780632b9727bf1461035b5780632ce4e4701461036e57600080fd5b806306fdde031461028f578063095ea7b3146102ad57806313af4035146102d057806314014565146102e557806318160ddd14610306575b600080fd5b6102976106b8565b6040516102a4919061218a565b60405180910390f35b6102c06102bb3660046121f4565b610746565b60405190151581526020016102a4565b6102e36102de366004612220565b6107b3565b005b6102f86102f3366004612244565b610831565b6040519081526020016102a4565b6102f860035481565b6102e361031d3660046122a9565b61083e565b6102e3610330366004612244565b6109c8565b6102c06103433660046122eb565b610afe565b6102f86103563660046122a9565b610bde565b6102f86103693660046122a9565b610c30565b6102e361037c36600461232c565b610c7d565b6103a87f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016102a4565b6103cd6103c836600461234e565b610cb2565b6040516102a4919061239a565b6102f8610d60565b6102e36103f03660046123ec565b610dbb565b6102e3610403366004612244565b610df8565b6102e3610416366004612244565b610f0c565b6102f860075481565b6102f861040081565b6102f861043b3660046122a9565b610f19565b61047e61044e366004612244565b600a6020526000908152604090205460ff808216916101008104909116906201000090046001600160801b031683565b60408051931515845291151560208401526001600160801b0316908201526060016102a4565b6102f86104b2366004612244565b610f64565b6102f86104c536600461234e565b610f71565b6102e36104d83660046122a9565b610fc5565b6102f86104eb366004612244565b611138565b6102f86104fe366004612220565b60046020526000908152604090205481565b6102f861051e366004612220565b60066020526000908152604090205481565b6102f861053e36600461234e565b611169565b6102e36105513660046122a9565b6111b5565b600054610569906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b6102e361058f3660046122a9565b6112ce565b6102976113e7565b6105697f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e881565b6009546102c09060ff1681565b6102c06105de3660046121f4565b6113f4565b6102f86105f1366004612244565b61145a565b6102f861271081565b6102f861060d36600461232c565b6116ae565b6102e3610620366004612244565b6117b2565b6102f861063336600461232c565b611892565b6102e3610646366004612409565b611a61565b6102f8610659366004612480565b600560209081526000928352604080842090915290825290205481565b6102e3610684366004612244565b611ca5565b6102f86106973660046122a9565b611d85565b6102f860085481565b6102f86106b336600461232c565b611dd0565b600180546106c5906124b9565b80601f01602080910402602001604051908101604052809291908181526020018280546106f1906124b9565b801561073e5780601f106107135761010080835404028352916020019161073e565b820191906000526020600020905b81548152906001019060200180831161072157829003601f168201915b505050505081565b3360008181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107a19086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b031633146107e65760405162461bcd60e51b81526004016107dd906124f3565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b60006107ad826000611892565b60095460ff16610861576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b0316636352211e8686858181106108af576108af612519565b905060200201356040518263ffffffff1660e01b81526004016108d491815260200190565b602060405180830381865afa1580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610915919061252f565b6001600160a01b0316036109515761094484848381811061093857610938612519565b90506020020135611f82565b61094e9083612562565b91505b8061095b8161257a565b915050610865565b5080600003610985576040516344b4f38360e11b815260040160405180910390fd5b6109c3336109b47f0000000000000000000000000000000000000000000000000000000000000012600a612677565b6109be9084612686565b611fd0565b505050565b60095460ff166109eb576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e81690636352211e90602401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a76919061252f565b6001600160a01b031614610a9d576040516344b4f38360e11b815260040160405180910390fd5b6000610aa88261202a565b905080600003610acb576040516344b4f38360e11b815260040160405180910390fd5b610afa336109b47f0000000000000000000000000000000000000000000000000000000000000012600a612677565b5050565b6001600160a01b03831660009081526005602090815260408083203384529091528120546000198114610b5a57610b3583826126a5565b6001600160a01b03861660009081526005602090815260408083203384529091529020555b6001600160a01b03851660009081526004602052604081208054859290610b829084906126a5565b90915550506001600160a01b038085166000818152600460205260409081902080548701905551909187169060008051602061280883398151915290610bcb9087815260200190565b60405180910390a3506001949350505050565b6000805b82811015610c2957610c0b848483818110610bff57610bff612519565b9050602002013561145a565b610c159083612562565b915080610c218161257a565b915050610be2565b5092915050565b6000805b82811015610c2957610c5f848483818110610c5157610c51612519565b9050602002013560006116ae565b610c699083612562565b915080610c758161257a565b915050610c34565b6000546001600160a01b03163314610ca75760405162461bcd60e51b81526004016107dd906124f3565b600791909155600855565b606060008367ffffffffffffffff811115610ccf57610ccf6126bc565b604051908082528060200260200182016040528015610cf8578160200160208202803683370190505b50905060005b84811015610d5757610d28868683818110610d1b57610d1b612519565b9050602002013585611dd0565b828281518110610d3a57610d3a612519565b602090810291909101015280610d4f8161257a565b915050610cfe565b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000014614610d9657610d9161205b565b905090565b507fe134a87bef541d91c40b936eee45baca8cb255d4e02bfd10a1c05882daeeb61190565b6000546001600160a01b03163314610de55760405162461bcd60e51b81526004016107dd906124f3565b6009805460ff1916911515919091179055565b60095460ff16610e1b576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e81690636352211e90602401602060405180830381865afa158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea6919061252f565b6001600160a01b031614610ecd576040516344b4f38360e11b815260040160405180910390fd5b6000610ed88261202a565b610ee29082612562565b9050610eed826120f5565b610ef79082612562565b9050610f0282611f82565b610aa89082612562565b610f163382612128565b50565b6000805b82811015610c2957610f46848483818110610f3a57610f3a612519565b90506020020135611138565b610f509083612562565b915080610f5c8161257a565b915050610f1d565b60006107ad8260006116ae565b6000805b83811015610fbd57610f9f858583818110610f9257610f92612519565b9050602002013584611892565b610fa99083612562565b915080610fb58161257a565b915050610f75565b509392505050565b60095460ff16610fe8576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b0316636352211e86868581811061103657611036612519565b905060200201356040518263ffffffff1660e01b815260040161105b91815260200190565b602060405180830381865afa158015611078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109c919061252f565b6001600160a01b031603611126576110cb8484838181106110bf576110bf612519565b9050602002013561202a565b6110d59083612562565b91506110f88484838181106110ec576110ec612519565b905060200201356120f5565b6111029083612562565b915061111984848381811061093857610938612519565b6111239083612562565b91505b806111308161257a565b915050610fec565b600061114382610831565b61114c8361145a565b61115584610f64565b61115f9190612562565b6107ad9190612562565b6000805b83811015610fbd5761119785858381811061118a5761118a612519565b90506020020135846116ae565b6111a19083612562565b9150806111ad8161257a565b91505061116d565b60095460ff166111d8576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b0316636352211e86868581811061122657611226612519565b905060200201356040518263ffffffff1660e01b815260040161124b91815260200190565b602060405180830381865afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c919061252f565b6001600160a01b0316036112bc576112af8484838181106110ec576110ec612519565b6112b99083612562565b91505b806112c68161257a565b9150506111dc565b60095460ff166112f1576040516335b43c0360e11b815260040160405180910390fd5b6000805b8281101561096357337f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b0316636352211e86868581811061133f5761133f612519565b905060200201356040518263ffffffff1660e01b815260040161136491815260200190565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a5919061252f565b6001600160a01b0316036113d5576113c88484838181106110bf576110bf612519565b6113d29083612562565b91505b806113df8161257a565b9150506112f5565b600280546106c5906124b9565b336000908152600460205260408120805483919083906114159084906126a5565b90915550506001600160a01b03831660008181526004602052604090819020805485019055513390600080516020612808833981519152906107a19086815260200190565b6000818152600a6020526040812054610100900460ff161580156115095750604051630458b6db60e01b815260048101839052604560248201527f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b031690630458b6db90604401602060405180830381865afa1580156114e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150991906126d2565b156116a95760006001600160a01b03167f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b031663daa17f496040518163ffffffff1660e01b8152600401602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b919061252f565b6001600160a01b0316148061169f57507f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b031663daa17f496040518163ffffffff1660e01b8152600401602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d919061252f565b604051638439043360e01b815260048101849052604560248201526001600160a01b039190911690638439043390604401602060405180830381865afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f91906126d2565b156116a957506127105b919050565b6000828152600a602052604081205460ff16151581036107ad57604051632129022960e11b8152600481018490526000907f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b031690634252045290602401602060405180830381865afa158015611730573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175491906126ef565b90506000600382116117665781611769565b60035b611774906002612708565b60026117808787611dd0565b61178a9190612714565b6117949190612686565b905061040081116117a557806117a9565b6104005b95945050505050565b60095460ff166117d5576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e81690636352211e90602401602060405180830381865afa15801561183c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611860919061252f565b6001600160a01b031614611887576040516344b4f38360e11b815260040160405180910390fd5b6000610aa882611f82565b60405163b75f7e5160e01b8152600481018390526000907f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b03169063b75f7e5190602401602060405180830381865afa1580156118fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191e91906126ef565b60451461192d575060006107ad565b604051634b00b4cd60e11b8152600481018490526000907f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b031690639601699a90602401608060405180830381865afa158015611995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b99190612736565b6000888152600a602052604081205491955093506201000090046001600160801b0316841091506119ec90505781611a0b565b6000858152600a60205260409020546201000090046001600160801b03165b905060075481611a1b9190612562565b611a258542612562565b10611a595760075481611a388642612562565b611a4291906126a5565b611a4c9190612714565b6008546117a99190612686565b505092915050565b42841015611ab15760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016107dd565b60006001611abd610d60565b6001600160a01b038a811660008181526006602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611bc9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611bff5750876001600160a01b0316816001600160a01b0316145b611c3c5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107dd565b6001600160a01b0390811660009081526005602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60095460ff16611cc8576040516335b43c0360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e81690636352211e90602401602060405180830381865afa158015611d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d53919061252f565b6001600160a01b031614611d7a576040516344b4f38360e11b815260040160405180910390fd5b6000610aa8826120f5565b6000805b82811015610c2957611db2848483818110611da657611da6612519565b90506020020135610831565b611dbc9083612562565b915080611dc88161257a565b915050611d89565b60008060007f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b0316639601699a866040518263ffffffff1660e01b8152600401611e2391815260200190565b608060405180830381865afa158015611e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e649190612736565b50509150915080600003611e7d576001925050506107ad565b600081611e8a8643612562565b611e9491906126a5565b90506000611ea562030d4083612714565b905060007f0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e86001600160a01b0316638d774da86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2b91906126ef565b905080821115611f39578091505b6000612710611f49846001612562565b611f539086612686565b611f5d9190612714565b611f679087612562565b90506001811015611f76575060015b98975050505050505050565b6000611f8d82610831565b905080156116a9576000918252600a6020526040909120805471ffffffffffffffffffffffffffffffff0000191662010000426001600160801b03160217905590565b8060036000828254611fe29190612562565b90915550506001600160a01b03821660008181526004602090815260408083208054860190555184815260008051602061280883398151915291015b60405180910390a35050565b600061203582610f64565b905080156116a9576000828152600a60205260409020805460ff19166001179055919050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600160405161208d919061276c565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006121008261145a565b905080156116a9576000828152600a60205260409020805461ff001916610100179055919050565b6001600160a01b038216600090815260046020526040812080548392906121509084906126a5565b90915550506003805482900390556040518181526000906001600160a01b038416906000805160206128088339815191529060200161201e565b600060208083528351808285015260005b818110156121b75785810183015185820160400152820161219b565b818111156121c9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610f1657600080fd5b6000806040838503121561220757600080fd5b8235612212816121df565b946020939093013593505050565b60006020828403121561223257600080fd5b813561223d816121df565b9392505050565b60006020828403121561225657600080fd5b5035919050565b60008083601f84011261226f57600080fd5b50813567ffffffffffffffff81111561228757600080fd5b6020830191508360208260051b85010111156122a257600080fd5b9250929050565b600080602083850312156122bc57600080fd5b823567ffffffffffffffff8111156122d357600080fd5b6122df8582860161225d565b90969095509350505050565b60008060006060848603121561230057600080fd5b833561230b816121df565b9250602084013561231b816121df565b929592945050506040919091013590565b6000806040838503121561233f57600080fd5b50508035926020909101359150565b60008060006040848603121561236357600080fd5b833567ffffffffffffffff81111561237a57600080fd5b6123868682870161225d565b909790965060209590950135949350505050565b6020808252825182820181905260009190848201906040850190845b818110156123d2578351835292840192918401916001016123b6565b50909695505050505050565b8015158114610f1657600080fd5b6000602082840312156123fe57600080fd5b813561223d816123de565b600080600080600080600060e0888a03121561242457600080fd5b873561242f816121df565b9650602088013561243f816121df565b95506040880135945060608801359350608088013560ff8116811461246357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561249357600080fd5b823561249e816121df565b915060208301356124ae816121df565b809150509250929050565b600181811c908216806124cd57607f821691505b6020821081036124ed57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561254157600080fd5b815161223d816121df565b634e487b7160e01b600052601160045260246000fd5b600082198211156125755761257561254c565b500190565b60006001820161258c5761258c61254c565b5060010190565b600181815b808511156125ce5781600019048211156125b4576125b461254c565b808516156125c157918102915b93841c9390800290612598565b509250929050565b6000826125e5575060016107ad565b816125f2575060006107ad565b816001811461260857600281146126125761262e565b60019150506107ad565b60ff8411156126235761262361254c565b50506001821b6107ad565b5060208310610133831016604e8410600b8410161715612651575081810a6107ad565b61265b8383612593565b806000190482111561266f5761266f61254c565b029392505050565b600061223d60ff8416836125d6565b60008160001904831182151516156126a0576126a061254c565b500290565b6000828210156126b7576126b761254c565b500390565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156126e457600080fd5b815161223d816123de565b60006020828403121561270157600080fd5b5051919050565b600061223d83836125d6565b60008261273157634e487b7160e01b600052601260045260246000fd5b500490565b6000806000806080858703121561274c57600080fd5b505082516020840151604085015160609095015191969095509092509050565b600080835481600182811c91508083168061278857607f831692505b602080841082036127a757634e487b7160e01b86526022600452602486fd5b8180156127bb57600181146127cc576127f9565b60ff198616895284890196506127f9565b60008a81526020902060005b868110156127f15781548b8201529085019083016127d8565b505084890196505b50949897505050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220125265282537218036d0d00bade8f34d825688ab94b2bc0ce1d2a97ee8c672bf64736f6c634300080e0033

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

0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e8

-----Decoded View---------------
Arg [0] : okpcAddress (address): 0x7183209867489E1047f3A7c23ea1Aed9c4E236E8

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007183209867489e1047f3a7c23ea1aed9c4e236e8


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.