ETH Price: $2,800.43 (-0.24%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer215112732024-12-29 23:00:1137 days ago1735513211IN
0x516D813b...3aCDD7D8F
0 ETH0.000194164.17297694
Approve200431412024-06-07 23:10:35242 days ago1717801835IN
0x516D813b...3aCDD7D8F
0 ETH0.000376588.09740271
Claim200224162024-06-05 1:43:35245 days ago1717551815IN
0x516D813b...3aCDD7D8F
0 ETH0.01062527.13639205
Approve197179272024-04-23 11:54:23288 days ago1713873263IN
0x516D813b...3aCDD7D8F
0 ETH0.000463369.96339275
Claim196278992024-04-10 21:25:11300 days ago1712784311IN
0x516D813b...3aCDD7D8F
0 ETH0.0017160215.94407432
Approve195422532024-03-29 21:13:35312 days ago1711746815IN
0x516D813b...3aCDD7D8F
0 ETH0.0011193924.21926478
Claim194971422024-03-23 11:56:35319 days ago1711194995IN
0x516D813b...3aCDD7D8F
0 ETH0.0055297219.57896591
Approve194612572024-03-18 11:02:59324 days ago1710759779IN
0x516D813b...3aCDD7D8F
0 ETH0.0031330767.36774665
Claim193378422024-03-01 4:08:35341 days ago1709266115IN
0x516D813b...3aCDD7D8F
0 ETH0.0044662841.49739101
Claim193023202024-02-25 4:49:59346 days ago1708836599IN
0x516D813b...3aCDD7D8F
0 ETH0.002723525.30478945
Claim192603362024-02-19 7:35:59352 days ago1708328159IN
0x516D813b...3aCDD7D8F
0 ETH0.002654124.65994478
Claim192430282024-02-16 21:08:23354 days ago1708117703IN
0x516D813b...3aCDD7D8F
0 ETH0.0036873634.26025039
Claim192139022024-02-12 19:02:35358 days ago1707764555IN
0x516D813b...3aCDD7D8F
0 ETH0.0074205347.83768452
Claim191986992024-02-10 15:51:11360 days ago1707580271IN
0x516D813b...3aCDD7D8F
0 ETH0.0084775833.8357855
Claim191818192024-02-08 7:00:23363 days ago1707375623IN
0x516D813b...3aCDD7D8F
0 ETH0.0036376133.80116492
Claim191733302024-02-07 2:24:23364 days ago1707272663IN
0x516D813b...3aCDD7D8F
0 ETH0.0056985828.12558406
Claim191732372024-02-07 2:05:23364 days ago1707271523IN
0x516D813b...3aCDD7D8F
0 ETH0.0031887329.62739065
Claim191729792024-02-07 1:13:35364 days ago1707268415IN
0x516D813b...3aCDD7D8F
0 ETH0.0045970129.63083986
Claim191655822024-02-06 0:18:47365 days ago1707178727IN
0x516D813b...3aCDD7D8F
0 ETH0.0018755417.42617252
Claim191641432024-02-05 19:28:59365 days ago1707161339IN
0x516D813b...3aCDD7D8F
0 ETH0.0035093822.62031892
Claim191612012024-02-05 9:32:11366 days ago1707125531IN
0x516D813b...3aCDD7D8F
0 ETH0.0019768818.36774146
Claim191599462024-02-05 5:18:23366 days ago1707110303IN
0x516D813b...3aCDD7D8F
0 ETH0.0020602510.16616486
Claim191590592024-02-05 2:19:23366 days ago1707099563IN
0x516D813b...3aCDD7D8F
0 ETH0.0129690213.46815333
Claim191582452024-02-04 23:35:47366 days ago1707089747IN
0x516D813b...3aCDD7D8F
0 ETH0.0015382214.29204814
Claim191577082024-02-04 21:47:47366 days ago1707083267IN
0x516D813b...3aCDD7D8F
0 ETH0.0013353112.40678697
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
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


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  ]

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.