ETH Price: $2,938.77 (+2.33%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw171948412023-05-05 13:50:59935 days ago1683294659IN
0x80b9a167...348322809
0 ETH0.02246287171.41214049
Emergency Withdr...165575472023-02-04 19:36:471025 days ago1675539407IN
0x80b9a167...348322809
0 ETH0.0070460126.33286424
Emergency Withdr...165575282023-02-04 19:32:591025 days ago1675539179IN
0x80b9a167...348322809
0 ETH0.0163558326.91002651
Claim Rewards165527122023-02-04 3:22:471026 days ago1675480967IN
0x80b9a167...348322809
0 ETH0.0064935323.29820686
Claim Rewards165242722023-01-31 3:58:471030 days ago1675137527IN
0x80b9a167...348322809
0 ETH0.0045360716.39263527
Claim Rewards165178142023-01-30 6:21:231031 days ago1675059683IN
0x80b9a167...348322809
0 ETH0.0043861815.73722358
Claim Rewards164836672023-01-25 11:54:351035 days ago1674647675IN
0x80b9a167...348322809
0 ETH0.0052154717.75095694
Claim Rewards164521972023-01-21 2:28:591040 days ago1674268139IN
0x80b9a167...348322809
0 ETH0.0039919414.32271972
Claim Rewards164390192023-01-19 6:19:231042 days ago1674109163IN
0x80b9a167...348322809
0 ETH0.0046344116.62784463
Claim Rewards164206442023-01-16 16:47:591044 days ago1673887679IN
0x80b9a167...348322809
0 ETH0.0069599724.97174922
Claim Rewards164206242023-01-16 16:43:591044 days ago1673887439IN
0x80b9a167...348322809
0 ETH0.0065436523.47803782
Claim Rewards164187872023-01-16 10:35:591044 days ago1673865359IN
0x80b9a167...348322809
0 ETH0.0044594216
Claim Rewards163505272023-01-06 21:47:591054 days ago1673041679IN
0x80b9a167...348322809
0 ETH0.0055286419.83627639
Claim Rewards162763652022-12-27 13:25:111064 days ago1672147511IN
0x80b9a167...348322809
0 ETH0.008235213.68265518
Claim Rewards162670352022-12-26 6:08:111066 days ago1672034891IN
0x80b9a167...348322809
0 ETH0.0041353814.83738277
Claim Rewards162655792022-12-26 1:15:111066 days ago1672017311IN
0x80b9a167...348322809
0 ETH0.0033929512.17362355
Stake162370122022-12-22 1:40:111070 days ago1671673211IN
0x80b9a167...348322809
0 ETH0.0031181813.75182327
Claim Rewards161922842022-12-15 19:48:351076 days ago1671133715IN
0x80b9a167...348322809
0 ETH0.0070784425.39681533
Claim Rewards161875912022-12-15 4:04:111077 days ago1671077051IN
0x80b9a167...348322809
0 ETH0.0039697114.34591645
Claim Rewards161811262022-12-14 6:23:471078 days ago1670999027IN
0x80b9a167...348322809
0 ETH0.0043374415.56236355
Claim Rewards161598812022-12-11 7:09:471081 days ago1670742587IN
0x80b9a167...348322809
0 ETH0.0044008215.78929364
Claim Rewards161508612022-12-10 0:56:111082 days ago1670633771IN
0x80b9a167...348322809
0 ETH0.0034051612.21706403
Claim Rewards161450582022-12-09 5:26:471083 days ago1670563607IN
0x80b9a167...348322809
0 ETH0.0041603314.9269139
Claim Rewards161450462022-12-09 5:24:231083 days ago1670563463IN
0x80b9a167...348322809
0 ETH0.0043042515.44327178
Claim Rewards161309912022-12-07 6:11:471085 days ago1670393507IN
0x80b9a167...348322809
0 ETH0.0080027313.29640894
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721Staking

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-08-24
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;


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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


interface IERC20 {

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

    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IERC20Permit {
    
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

library Address {
    
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool _approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


contract ERC721Staking is Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    // Interfaces for ERC20 and ERC721
    IERC20 public immutable rewardsToken;
    IERC721 public immutable nftCollection;

    uint256 public bonusEndTimestamp = 1677268800;

    event BonusEndTimestampUpdated(uint256 oldBonusEndTimestamp, uint256 newBonusEndTimestamp);
    event RewardsPerHourUpdated(uint256 oldRewardsPerHour, uint256 newRewardsPerHour);

    // Constructor function to set the rewards token and the NFT collection addresses
    constructor(IERC721 _nftCollection, IERC20 _rewardsToken) {
        nftCollection = _nftCollection;
        rewardsToken = _rewardsToken;
    }

    struct StakedToken {
        address staker;
        uint256 tokenId;
    }
    
    // Staker info
    struct Staker {
        // Amount of tokens staked by the staker
        uint256 amountStaked;

        // Staked token ids
        StakedToken[] stakedTokens;

        // Last time of the rewards were calculated for this user
        uint256 timeOfLastUpdate;

        // Calculated, but unclaimed rewards for the User. The rewards are
        // calculated each time the user writes to the Smart Contract
        uint256 unclaimedRewards;
    }

    // Rewards per hour per token deposited in wei.
    uint256 public rewardsPerHour = 613181151618000000000;

    // Mapping of User Address to Staker info
    mapping(address => Staker) public stakers;

    // Mapping of Token Id to staker. Made for the SC to remeber
    // who to send back the ERC721 Token to.
    mapping(uint256 => address) public stakerAddress;

    // If address already has ERC721 Token/s staked, calculate the rewards.
    // Increment the amountStaked and map msg.sender to the Token Id of the staked
    // Token to later send back on withdrawal. Finally give timeOfLastUpdate the
    // value of now.
    function stake(uint256 _tokenId) external nonReentrant {
        // If wallet has tokens staked, calculate the rewards before adding the new token
        if (stakers[msg.sender].amountStaked > 0) {
            uint256 rewards = calculateRewards(msg.sender);
            stakers[msg.sender].unclaimedRewards += rewards;
        }

        // Wallet must own the token they are trying to stake
        require(
            nftCollection.ownerOf(_tokenId) == msg.sender,
            "You don't own this token!"
        );

        // Transfer the token from the wallet to the Smart contract
        nftCollection.transferFrom(msg.sender, address(this), _tokenId);

        // Create StakedToken
        StakedToken memory stakedToken = StakedToken(msg.sender, _tokenId);

        // Add the token to the stakedTokens array
        stakers[msg.sender].stakedTokens.push(stakedToken);

        // Increment the amount staked for this wallet
        stakers[msg.sender].amountStaked++;

        // Update the mapping of the tokenId to the staker's address
        stakerAddress[_tokenId] = msg.sender;

        // Update the timeOfLastUpdate for the staker   
        stakers[msg.sender].timeOfLastUpdate = block.timestamp;
    }
    
    // Check if user has any ERC721 Tokens Staked and if they tried to withdraw,
    // calculate the rewards and store them in the unclaimedRewards
    // decrement the amountStaked of the user and transfer the ERC721 token back to them
    function withdraw(uint256 _tokenId) external nonReentrant {
        require(block.timestamp >= bonusEndTimestamp, "NFTs are locked");
        // Make sure the user has at least one token staked before withdrawing
        require(
            stakers[msg.sender].amountStaked > 0,
            "You have no tokens staked"
        );
        
        // Wallet must own the token they are trying to withdraw
        require(stakerAddress[_tokenId] == msg.sender, "You don't own this token!");

        // Update the rewards for this user, as the amount of rewards decreases with less tokens.
        uint256 rewards = calculateRewards(msg.sender);
        stakers[msg.sender].unclaimedRewards += rewards;

        // Find the index of this token id in the stakedTokens array
        uint256 index = 0;
        for (uint256 i = 0; i < stakers[msg.sender].stakedTokens.length; i++) {
            if (
                stakers[msg.sender].stakedTokens[i].tokenId == _tokenId 
                && 
                stakers[msg.sender].stakedTokens[i].staker != address(0)
            ) {
                index = i;
                break;
            }
        }

        // Set this token's .staker to be address 0 to mark it as no longer staked
        stakers[msg.sender].stakedTokens[index].staker = address(0);

        // Decrement the amount staked for this wallet
        stakers[msg.sender].amountStaked--;

        // Update the mapping of the tokenId to the be address(0) to indicate that the token is no longer staked
        stakerAddress[_tokenId] = address(0);

        // Transfer the token back to the withdrawer
        nftCollection.transferFrom(address(this), msg.sender, _tokenId);

        // Update the timeOfLastUpdate for the withdrawer   
        stakers[msg.sender].timeOfLastUpdate = block.timestamp;
    }

    // Calculate rewards for the msg.sender, check if there are any rewards
    // claim, set unclaimedRewards to 0 and transfer the ERC20 Reward token
    // to the user.
    function claimRewards() external {
        uint256 rewards = calculateRewards(msg.sender) +
            stakers[msg.sender].unclaimedRewards;
        require(rewards > 0, "You have no rewards to claim");
        stakers[msg.sender].timeOfLastUpdate = block.timestamp;
        stakers[msg.sender].unclaimedRewards = 0;
        rewardsToken.safeTransfer(msg.sender, rewards);
    }


    //////////
    // View //
    //////////

    function availableRewards(address _staker) public view returns (uint256) {
        uint256 rewards = calculateRewards(_staker) +
            stakers[_staker].unclaimedRewards;
        return rewards;
    }

    function getStakedTokens(address _user) public view returns (uint256[] memory) {
        // Check if we know this user
        if (stakers[_user].amountStaked > 0) {
            // Return all the tokens in the stakedToken Array for this user that are not -1
            uint256[] memory _stakedTokens = new uint256[](stakers[_user].amountStaked);
            uint256 _index = 0;

            for (uint256 j = 0; j < stakers[_user].stakedTokens.length; j++) {
                if (stakers[_user].stakedTokens[j].staker != (address(0))) {
                    _stakedTokens[_index] = stakers[_user].stakedTokens[j].tokenId;
                    _index++;
                }
            }

            return _stakedTokens;
        }
        
        // Otherwise, return empty array
        else {
            return new uint256[](0);
        }
    }

    function updateBonusEndTimestamp(uint256 timestamp) external onlyOwner {
        uint256 oldBonusEndTimestamp = bonusEndTimestamp;
        bonusEndTimestamp = timestamp;

        emit BonusEndTimestampUpdated(oldBonusEndTimestamp, timestamp);
    }

    function emergencyWithdraw(IERC20 token, uint256 amount) external onlyOwner {
        token.safeTransfer(owner(), amount);
    }

    function updateRewardPerHour(uint256 newRewardsPerHour) external onlyOwner {
        uint256 oldRewardsPerHour = rewardsPerHour;
        rewardsPerHour = newRewardsPerHour;

        emit RewardsPerHourUpdated(oldRewardsPerHour, newRewardsPerHour);
    }

    /////////////
    // Internal//
    /////////////

    // Calculate rewards for param _staker by calculating the time passed
    // since last update in hours and mulitplying it to ERC721 Tokens Staked
    // and rewardsPerHour.
    function calculateRewards(address _staker)
        internal
        view
        returns (uint256 _rewards)
    {
        if (block.timestamp <= bonusEndTimestamp)
            return (((
                ((block.timestamp - stakers[_staker].timeOfLastUpdate) *
                    stakers[_staker].amountStaked)
            ) * rewardsPerHour) / 3600);
        
        else if(stakers[_staker].timeOfLastUpdate >= bonusEndTimestamp) {
            return 0;
        }
        return (((
            ((bonusEndTimestamp - stakers[_staker].timeOfLastUpdate) *
                stakers[_staker].amountStaked)
        ) * rewardsPerHour) / 3600);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC721","name":"_nftCollection","type":"address"},{"internalType":"contract IERC20","name":"_rewardsToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBonusEndTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBonusEndTimestamp","type":"uint256"}],"name":"BonusEndTimestampUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRewardsPerHour","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsPerHour","type":"uint256"}],"name":"RewardsPerHourUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"availableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCollection","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsPerHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"amountStaked","type":"uint256"},{"internalType":"uint256","name":"timeOfLastUpdate","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"updateBonusEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardsPerHour","type":"uint256"}],"name":"updateRewardPerHour","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526363f9174060025568213d99109fa3d4940060035534801561002557600080fd5b50604051620014e5380380620014e5833981016040819052610046916100c1565b61004f33610071565b600180556001600160601b0319606092831b811660a052911b16608052610113565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100d457600080fd5b82516100df816100fb565b60208401519092506100f0816100fb565b809150509250929050565b6001600160a01b038116811461011057600080fd5b50565b60805160601c60a05160601c61138a6200015b6000396000818161015b0152818161059a015281816109bd0152610aab01526000818161028901526106b4015261138a6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80639168ae72116100a2578063a694fc3a11610071578063a694fc3a14610271578063d1af0c7d14610284578063e4a337f3146102ab578063f2fde38b146102b4578063f854a27f146102c757600080fd5b80639168ae72146101d8578063940670451461022257806395ccea671461024b578063a1bb5cd81461025e57600080fd5b8063715018a6116100de578063715018a61461019557806374baefcf1461019d5780638da5cb5b146101b05780638e7271fa146101c157600080fd5b80632e1a7d4d14610110578063372500ab1461012557806363c28db11461012d5780636588103b14610156575b600080fd5b61012361011e36600461117f565b6102da565b005b61012361061b565b61014061013b3660046110f7565b6106e3565b60405161014d91906111b4565b60405180910390f35b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014d565b61012361086d565b6101236101ab36600461117f565b610881565b6000546001600160a01b031661017d565b6101ca60035481565b60405190815260200161014d565b6102076101e63660046110f7565b60046020526000908152604090208054600282015460039092015490919083565b6040805193845260208401929092529082015260600161014d565b61017d61023036600461117f565b6005602052600090815260409020546001600160a01b031681565b610123610259366004611153565b6108cf565b61012361026c36600461117f565b610901565b61012361027f36600461117f565b610947565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6101ca60025481565b6101236102c23660046110f7565b610bc7565b6101ca6102d53660046110f7565b610c3d565b6102e2610c75565b60025442101561032b5760405162461bcd60e51b815260206004820152600f60248201526e1391951cc8185c99481b1bd8dad959608a1b60448201526064015b60405180910390fd5b336000908152600460205260409020546103875760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b6564000000000000006044820152606401610322565b6000818152600560205260409020546001600160a01b031633146103e95760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b60006103f433610ccf565b3360009081526004602052604081206003018054929350839290919061041b90849061122b565b9091555060009050805b336000908152600460205260409020600101548110156104e05733600090815260046020526040902060010180548591908390811061046657610466611313565b9060005260206000209060020201600101541480156104c157503360009081526004602052604081206001018054839081106104a4576104a4611313565b60009182526020909120600290910201546001600160a01b031614155b156104ce578091506104e0565b806104d8816112e2565b915050610425565b5033600090815260046020526040812060010180548390811061050557610505611313565b6000918252602080832060029290920290910180546001600160a01b0319166001600160a01b03949094169390931790925533815260049091526040812080549161054f836112cb565b90915550506000838152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018490526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b1580156105de57600080fd5b505af11580156105f2573d6000803e3d6000fd5b505033600090815260046020526040902042600290910155506106189250610d91915050565b50565b33600081815260046020526040812060030154909161063990610ccf565b610643919061122b565b9050600081116106955760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d000000006044820152606401610322565b33600081815260046020526040812042600282015560030155610618907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169083610d97565b6001600160a01b03811660009081526004602052604090205460609015610859576001600160a01b03821660009081526004602052604081205467ffffffffffffffff81111561073557610735611329565b60405190808252806020026020018201604052801561075e578160200160208202803683370190505b5090506000805b6001600160a01b038516600090815260046020526040902060010154811015610850576001600160a01b03851660009081526004602052604081206001018054839081106107b5576107b5611313565b60009182526020909120600290910201546001600160a01b03161461083e576001600160a01b038516600090815260046020526040902060010180548290811061080157610801611313565b90600052602060002090600202016001015483838151811061082557610825611313565b60209081029190910101528161083a816112e2565b9250505b80610848816112e2565b915050610765565b50909392505050565b505060408051600081526020810190915290565b610875610dee565b61087f6000610e48565b565b610889610dee565b600380549082905560408051828152602081018490527f2e48a9d59ca3fc8b64b9dd84783ada19b9b4240c23b4e87f3ff21a1ba1f320d391015b60405180910390a15050565b6108d7610dee565b6108fd6108ec6000546001600160a01b031690565b6001600160a01b0384169083610d97565b5050565b610909610dee565b600280549082905560408051828152602081018490527f71ffeabd1c4634f619be28486143538a8255c59b257708a84a258b78d3b8ca4091016108c3565b61094f610c75565b336000908152600460205260409020541561099d57600061096f33610ccf565b3360009081526004602052604081206003018054929350839290919061099690849061122b565b9091555050505b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b1580156109ff57600080fd5b505afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a379190611114565b6001600160a01b031614610a895760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b5050604080518082018252338082526020808301878152600083815260048352948520600180820180548083018255908852938720865160029095020180546001600160a01b0319166001600160a01b0390951694909417845591519290910191909155908352805491945090925090610b84836112e2565b909155505050600081815260056020908152604080832080546001600160a01b031916339081179091558352600490915290204260029091015561061860018055565b610bcf610dee565b6001600160a01b038116610c345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610322565b61061881610e48565b6001600160a01b0381166000908152600460205260408120600301548190610c6484610ccf565b610c6e919061122b565b9392505050565b60026001541415610cc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610322565b6002600155565b60006002544211610d31576003546001600160a01b03831660009081526004602052604090208054600290910154610e10929190610d0d9042611284565b610d179190611265565b610d219190611265565b610d2b9190611243565b92915050565b600280546001600160a01b03841660009081526004602052604090209091015410610d5e57506000919050565b6003546001600160a01b038316600090815260046020526040902080546002918201549154610e109392610d0d91611284565b60018055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610de9908490610e98565b505050565b6000546001600160a01b0316331461087f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610322565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610eed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610f6a9092919063ffffffff16565b805190915015610de95780806020019051810190610f0b9190611131565b610de95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610322565b6060610f798484600085610f81565b949350505050565b606082471015610fe25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610322565b600080866001600160a01b03168587604051610ffe9190611198565b60006040518083038185875af1925050503d806000811461103b576040519150601f19603f3d011682016040523d82523d6000602084013e611040565b606091505b50915091506110518783838761105c565b979650505050505050565b606083156110c85782516110c1576001600160a01b0385163b6110c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610322565b5081610f79565b610f7983838151156110dd5781518083602001fd5b8060405162461bcd60e51b815260040161032291906111f8565b60006020828403121561110957600080fd5b8135610c6e8161133f565b60006020828403121561112657600080fd5b8151610c6e8161133f565b60006020828403121561114357600080fd5b81518015158114610c6e57600080fd5b6000806040838503121561116657600080fd5b82356111718161133f565b946020939093013593505050565b60006020828403121561119157600080fd5b5035919050565b600082516111aa81846020870161129b565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156111ec578351835292840192918401916001016111d0565b50909695505050505050565b602081526000825180602084015261121781604085016020870161129b565b601f01601f19169190910160400192915050565b6000821982111561123e5761123e6112fd565b500190565b60008261126057634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561127f5761127f6112fd565b500290565b600082821015611296576112966112fd565b500390565b60005b838110156112b657818101518382015260200161129e565b838111156112c5576000848401525b50505050565b6000816112da576112da6112fd565b506000190190565b60006000198214156112f6576112f66112fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461061857600080fdfea264697066735822122060371a3a62463447bb8c64431c4e278422d71fd1e3083f1cc29c22e3be050dd364736f6c634300080700330000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd16

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80639168ae72116100a2578063a694fc3a11610071578063a694fc3a14610271578063d1af0c7d14610284578063e4a337f3146102ab578063f2fde38b146102b4578063f854a27f146102c757600080fd5b80639168ae72146101d8578063940670451461022257806395ccea671461024b578063a1bb5cd81461025e57600080fd5b8063715018a6116100de578063715018a61461019557806374baefcf1461019d5780638da5cb5b146101b05780638e7271fa146101c157600080fd5b80632e1a7d4d14610110578063372500ab1461012557806363c28db11461012d5780636588103b14610156575b600080fd5b61012361011e36600461117f565b6102da565b005b61012361061b565b61014061013b3660046110f7565b6106e3565b60405161014d91906111b4565b60405180910390f35b61017d7f0000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b81565b6040516001600160a01b03909116815260200161014d565b61012361086d565b6101236101ab36600461117f565b610881565b6000546001600160a01b031661017d565b6101ca60035481565b60405190815260200161014d565b6102076101e63660046110f7565b60046020526000908152604090208054600282015460039092015490919083565b6040805193845260208401929092529082015260600161014d565b61017d61023036600461117f565b6005602052600090815260409020546001600160a01b031681565b610123610259366004611153565b6108cf565b61012361026c36600461117f565b610901565b61012361027f36600461117f565b610947565b61017d7f00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd1681565b6101ca60025481565b6101236102c23660046110f7565b610bc7565b6101ca6102d53660046110f7565b610c3d565b6102e2610c75565b60025442101561032b5760405162461bcd60e51b815260206004820152600f60248201526e1391951cc8185c99481b1bd8dad959608a1b60448201526064015b60405180910390fd5b336000908152600460205260409020546103875760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b6564000000000000006044820152606401610322565b6000818152600560205260409020546001600160a01b031633146103e95760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b60006103f433610ccf565b3360009081526004602052604081206003018054929350839290919061041b90849061122b565b9091555060009050805b336000908152600460205260409020600101548110156104e05733600090815260046020526040902060010180548591908390811061046657610466611313565b9060005260206000209060020201600101541480156104c157503360009081526004602052604081206001018054839081106104a4576104a4611313565b60009182526020909120600290910201546001600160a01b031614155b156104ce578091506104e0565b806104d8816112e2565b915050610425565b5033600090815260046020526040812060010180548390811061050557610505611313565b6000918252602080832060029290920290910180546001600160a01b0319166001600160a01b03949094169390931790925533815260049091526040812080549161054f836112cb565b90915550506000838152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018490526001600160a01b037f0000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b16906323b872dd90606401600060405180830381600087803b1580156105de57600080fd5b505af11580156105f2573d6000803e3d6000fd5b505033600090815260046020526040902042600290910155506106189250610d91915050565b50565b33600081815260046020526040812060030154909161063990610ccf565b610643919061122b565b9050600081116106955760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d000000006044820152606401610322565b33600081815260046020526040812042600282015560030155610618907f00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd166001600160a01b03169083610d97565b6001600160a01b03811660009081526004602052604090205460609015610859576001600160a01b03821660009081526004602052604081205467ffffffffffffffff81111561073557610735611329565b60405190808252806020026020018201604052801561075e578160200160208202803683370190505b5090506000805b6001600160a01b038516600090815260046020526040902060010154811015610850576001600160a01b03851660009081526004602052604081206001018054839081106107b5576107b5611313565b60009182526020909120600290910201546001600160a01b03161461083e576001600160a01b038516600090815260046020526040902060010180548290811061080157610801611313565b90600052602060002090600202016001015483838151811061082557610825611313565b60209081029190910101528161083a816112e2565b9250505b80610848816112e2565b915050610765565b50909392505050565b505060408051600081526020810190915290565b610875610dee565b61087f6000610e48565b565b610889610dee565b600380549082905560408051828152602081018490527f2e48a9d59ca3fc8b64b9dd84783ada19b9b4240c23b4e87f3ff21a1ba1f320d391015b60405180910390a15050565b6108d7610dee565b6108fd6108ec6000546001600160a01b031690565b6001600160a01b0384169083610d97565b5050565b610909610dee565b600280549082905560408051828152602081018490527f71ffeabd1c4634f619be28486143538a8255c59b257708a84a258b78d3b8ca4091016108c3565b61094f610c75565b336000908152600460205260409020541561099d57600061096f33610ccf565b3360009081526004602052604081206003018054929350839290919061099690849061122b565b9091555050505b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b1690636352211e9060240160206040518083038186803b1580156109ff57600080fd5b505afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a379190611114565b6001600160a01b031614610a895760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f0000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b6001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b5050604080518082018252338082526020808301878152600083815260048352948520600180820180548083018255908852938720865160029095020180546001600160a01b0319166001600160a01b0390951694909417845591519290910191909155908352805491945090925090610b84836112e2565b909155505050600081815260056020908152604080832080546001600160a01b031916339081179091558352600490915290204260029091015561061860018055565b610bcf610dee565b6001600160a01b038116610c345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610322565b61061881610e48565b6001600160a01b0381166000908152600460205260408120600301548190610c6484610ccf565b610c6e919061122b565b9392505050565b60026001541415610cc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610322565b6002600155565b60006002544211610d31576003546001600160a01b03831660009081526004602052604090208054600290910154610e10929190610d0d9042611284565b610d179190611265565b610d219190611265565b610d2b9190611243565b92915050565b600280546001600160a01b03841660009081526004602052604090209091015410610d5e57506000919050565b6003546001600160a01b038316600090815260046020526040902080546002918201549154610e109392610d0d91611284565b60018055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610de9908490610e98565b505050565b6000546001600160a01b0316331461087f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610322565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610eed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610f6a9092919063ffffffff16565b805190915015610de95780806020019051810190610f0b9190611131565b610de95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610322565b6060610f798484600085610f81565b949350505050565b606082471015610fe25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610322565b600080866001600160a01b03168587604051610ffe9190611198565b60006040518083038185875af1925050503d806000811461103b576040519150601f19603f3d011682016040523d82523d6000602084013e611040565b606091505b50915091506110518783838761105c565b979650505050505050565b606083156110c85782516110c1576001600160a01b0385163b6110c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610322565b5081610f79565b610f7983838151156110dd5781518083602001fd5b8060405162461bcd60e51b815260040161032291906111f8565b60006020828403121561110957600080fd5b8135610c6e8161133f565b60006020828403121561112657600080fd5b8151610c6e8161133f565b60006020828403121561114357600080fd5b81518015158114610c6e57600080fd5b6000806040838503121561116657600080fd5b82356111718161133f565b946020939093013593505050565b60006020828403121561119157600080fd5b5035919050565b600082516111aa81846020870161129b565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156111ec578351835292840192918401916001016111d0565b50909695505050505050565b602081526000825180602084015261121781604085016020870161129b565b601f01601f19169190910160400192915050565b6000821982111561123e5761123e6112fd565b500190565b60008261126057634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561127f5761127f6112fd565b500290565b600082821015611296576112966112fd565b500390565b60005b838110156112b657818101518382015260200161129e565b838111156112c5576000848401525b50505050565b6000816112da576112da6112fd565b506000190190565b60006000198214156112f6576112f66112fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461061857600080fdfea264697066735822122060371a3a62463447bb8c64431c4e278422d71fd1e3083f1cc29c22e3be050dd364736f6c63430008070033

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

0000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd16

-----Decoded View---------------
Arg [0] : _nftCollection (address): 0x5C2644775F0EF7a23D682D03028f739f6AdbCC0B
Arg [1] : _rewardsToken (address): 0x57c411e9a358e2d2d0a6b058cEDb709175e8fd16

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c2644775f0ef7a23d682d03028f739f6adbcc0b
Arg [1] : 00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd16


Deployed Bytecode Sourcemap

12832:8591:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16267:1865;;;;;;:::i;:::-;;:::i;:::-;;18315:386;;;:::i;18978:865::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13008:38;;;;;;;;-1:-1:-1;;;;;1766:32:1;;;1748:51;;1736:2;1721:18;13008:38:0;1602:203:1;1006:103:0;;;:::i;20250:258::-;;;;;;:::i;:::-;;:::i;771:87::-;817:7;844:6;-1:-1:-1;;;;;844:6:0;771:87;;14167:53;;;;;;;;;7798:25:1;;;7786:2;7771:18;14167:53:0;7652:177:1;14276:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8289:25:1;;;8345:2;8330:18;;8323:34;;;;8373:18;;;8366:34;8277:2;8262:18;14276:41:0;8087:319:1;14438:48:0;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14438:48:0;;;20112:130;;;;;;:::i;:::-;;:::i;19851:253::-;;;;;;:::i;:::-;;:::i;14760:1254::-;;;;;;:::i;:::-;;:::i;12965:36::-;;;;;13055:45;;;;;;1117:201;;;;;;:::i;:::-;;:::i;18761:209::-;;;;;;:::i;:::-;;:::i;16267:1865::-;1791:21;:19;:21::i;:::-;16363:17:::1;;16344:15;:36;;16336:64;;;::::0;-1:-1:-1;;;16336:64:0;;6381:2:1;16336:64:0::1;::::0;::::1;6363:21:1::0;6420:2;6400:18;;;6393:30;-1:-1:-1;;;6439:18:1;;;6432:45;6494:18;;16336:64:0::1;;;;;;;;;16521:10;16548:1;16513:19:::0;;;:7:::1;:19;::::0;;;;:32;16491:111:::1;;;::::0;-1:-1:-1;;;16491:111:0;;4902:2:1;16491:111:0::1;::::0;::::1;4884:21:1::0;4941:2;4921:18;;;4914:30;4980:27;4960:18;;;4953:55;5025:18;;16491:111:0::1;4700:349:1::0;16491:111:0::1;16697:23;::::0;;;:13:::1;:23;::::0;;;;;-1:-1:-1;;;;;16697:23:0::1;16724:10;16697:37;16689:75;;;::::0;-1:-1:-1;;;16689:75:0;;4141:2:1;16689:75:0::1;::::0;::::1;4123:21:1::0;4180:2;4160:18;;;4153:30;-1:-1:-1;;;4199:18:1;;;4192:55;4264:18;;16689:75:0::1;3939:349:1::0;16689:75:0::1;16876:15;16894:28;16911:10;16894:16;:28::i;:::-;16941:10;16933:19;::::0;;;:7:::1;:19;::::0;;;;:36:::1;;:47:::0;;16876:46;;-1:-1:-1;16876:46:0;;16933:36;;:19;:47:::1;::::0;16876:46;;16933:47:::1;:::i;:::-;::::0;;;-1:-1:-1;17063:13:0::1;::::0;-1:-1:-1;17063:13:0;17091:353:::1;17123:10;17115:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;:39:::0;17111:43;::::1;17091:353;;;17206:10;17198:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;:35:::0;;17245:8;;17198:32;17231:1;;17198:35;::::1;;;;;:::i;:::-;;;;;;;;;;;:43;;;:55;:151;;;;-1:-1:-1::0;17301:10:0::1;17347:1;17293:19:::0;;;:7:::1;:19;::::0;;;;:32:::1;;:35:::0;;17326:1;;17293:35;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:42:::0;-1:-1:-1;;;;;17293:42:0::1;:56;;17198:151;17176:257;;;17392:1;17384:9;;17412:5;;17176:257;17156:3:::0;::::1;::::0;::::1;:::i;:::-;;;;17091:353;;;-1:-1:-1::0;17548:10:0::1;17597:1;17540:19:::0;;;:7:::1;:19;::::0;;;;:32:::1;;:39:::0;;17573:5;;17540:39;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;:59:::0;;-1:-1:-1;;;;;;17540:59:0::1;-1:-1:-1::0;;;;;17540:59:0;;;::::1;::::0;;;::::1;::::0;;;17676:10:::1;17668:19:::0;;:7:::1;:19:::0;;;;;;:34;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;17863:1:0::1;17829:23:::0;;;:13:::1;:23;::::0;;;;;;:36;;-1:-1:-1;;;;;;17829:36:0::1;::::0;;17932:63;-1:-1:-1;;;17932:63:0;;17967:4:::1;17932:63;::::0;::::1;2050:34:1::0;17974:10:0::1;2100:18:1::0;;;2093:43;2152:18;;;2145:34;;;-1:-1:-1;;;;;17932:13:0::1;:26;::::0;::::1;::::0;1985:18:1;;17932:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18078:10:0::1;18070:19;::::0;;;:7:::1;:19;::::0;;;;18109:15:::1;18070:36;::::0;;::::1;:54:::0;-1:-1:-1;1835:20:0;;-1:-1:-1;1835:18:0;;-1:-1:-1;;1835:20:0:i;:::-;16267:1865;:::o;18315:386::-;18429:10;18359:15;18421:19;;;:7;:19;;;;;:36;;;18359:15;;18377:28;;:16;:28::i;:::-;:80;;;;:::i;:::-;18359:98;;18486:1;18476:7;:11;18468:52;;;;-1:-1:-1;;;18468:52:0;;6024:2:1;18468:52:0;;;6006:21:1;6063:2;6043:18;;;6036:30;6102;6082:18;;;6075:58;6150:18;;18468:52:0;5822:352:1;18468:52:0;18539:10;18531:19;;;;:7;:19;;;;;18570:15;18531:36;;;:54;18596:36;;:40;18647:46;;:12;-1:-1:-1;;;;;18647:25:0;;18685:7;18647:25;:46::i;18978:865::-;-1:-1:-1;;;;;19111:14:0;;19141:1;19111:14;;;:7;:14;;;;;:27;19039:16;;19111:31;19107:729;;-1:-1:-1;;;;;19299:14:0;;19252:30;19299:14;;;:7;:14;;;;;:27;19285:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19285:42:0;;19252:75;;19342:14;19382:9;19377:294;-1:-1:-1;;;;;19401:14:0;;;;;;:7;:14;;;;;:27;;:34;19397:38;;19377:294;;;-1:-1:-1;;;;;19465:14:0;;19515:1;19465:14;;;:7;:14;;;;;:27;;:30;;19493:1;;19465:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;-1:-1:-1;;;;;19465:37:0;:53;19461:195;;-1:-1:-1;;;;;19567:14:0;;;;;;:7;:14;;;;;:27;;:30;;19595:1;;19567:30;;;;;;:::i;:::-;;;;;;;;;;;:38;;;19543:13;19557:6;19543:21;;;;;;;;:::i;:::-;;;;;;;;;;:62;19628:8;;;;:::i;:::-;;;;19461:195;19437:3;;;;:::i;:::-;;;;19377:294;;;-1:-1:-1;19694:13:0;;18978:865;-1:-1:-1;;;18978:865:0:o;19107:729::-;-1:-1:-1;;19808:16:0;;;19822:1;19808:16;;;;;;;;;18978:865::o;1006:103::-;730:13;:11;:13::i;:::-;1071:30:::1;1098:1;1071:18;:30::i;:::-;1006:103::o:0;20250:258::-;730:13;:11;:13::i;:::-;20364:14:::1;::::0;;20389:34;;;;20441:59:::1;::::0;;8008:25:1;;;8064:2;8049:18;;8042:34;;;20441:59:0::1;::::0;7981:18:1;20441:59:0::1;;;;;;;;20325:183;20250:258:::0;:::o;20112:130::-;730:13;:11;:13::i;:::-;20199:35:::1;20218:7;817::::0;844:6;-1:-1:-1;;;;;844:6:0;;771:87;20218:7:::1;-1:-1:-1::0;;;;;20199:18:0;::::1;::::0;20227:6;20199:18:::1;:35::i;:::-;20112:130:::0;;:::o;19851:253::-;730:13;:11;:13::i;:::-;19964:17:::1;::::0;;19992:29;;;;20039:57:::1;::::0;;8008:25:1;;;8064:2;8049:18;;8042:34;;;20039:57:0::1;::::0;7981:18:1;20039:57:0::1;7834:248:1::0;14760:1254:0;1791:21;:19;:21::i;:::-;14929:10:::1;14956:1;14921:19:::0;;;:7:::1;:19;::::0;;;;:32;:36;14917:177:::1;;14974:15;14992:28;15009:10;14992:16;:28::i;:::-;15043:10;15035:19;::::0;;;:7:::1;:19;::::0;;;;:36:::1;;:47:::0;;14974:46;;-1:-1:-1;14974:46:0;;15035:36;;:19;:47:::1;::::0;14974:46;;15035:47:::1;:::i;:::-;::::0;;;-1:-1:-1;;;14917:177:0::1;15191:31;::::0;-1:-1:-1;;;15191:31:0;;::::1;::::0;::::1;7798:25:1::0;;;15226:10:0::1;::::0;-1:-1:-1;;;;;15191:13:0::1;:21;::::0;::::1;::::0;7771:18:1;;15191:31:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15191:45:0::1;;15169:120;;;::::0;-1:-1:-1;;;15169:120:0;;4141:2:1;15169:120:0::1;::::0;::::1;4123:21:1::0;4180:2;4160:18;;;4153:30;-1:-1:-1;;;4199:18:1;;;4192:55;4264:18;;15169:120:0::1;3939:349:1::0;15169:120:0::1;15371:63;::::0;-1:-1:-1;;;15371:63:0;;15398:10:::1;15371:63;::::0;::::1;2050:34:1::0;15418:4:0::1;2100:18:1::0;;;2093:43;2152:18;;;2145:34;;;15371:13:0::1;-1:-1:-1::0;;;;;15371:26:0::1;::::0;::::1;::::0;1985:18:1;;15371:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;15511:33:0::1;::::0;;;;::::1;::::0;;15523:10:::1;15511:33:::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;15609:19:0;;;:7:::1;:19:::0;;;;;:32:::1;::::0;;::::1;:50:::0;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;15609:50:0::1;-1:-1:-1::0;;;;;15609:50:0;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;;;;15728:19;;;:34;;15511:33;;-1:-1:-1;15728:34:0;;-1:-1:-1;15609:19:0;15728:34:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;15845:23:0::1;::::0;;;:13:::1;:23;::::0;;;;;;;:36;;-1:-1:-1;;;;;;15845:36:0::1;15871:10;15845:36:::0;;::::1;::::0;;;15952:19;;:7:::1;:19:::0;;;;;15991:15:::1;15952:36;::::0;;::::1;:54:::0;1835:20;1607:1;2351:22;;2168:213;1117:201;730:13;:11;:13::i;:::-;-1:-1:-1;;;;;1206:22:0;::::1;1198:73;;;::::0;-1:-1:-1;;;1198:73:0;;4495:2:1;1198:73:0::1;::::0;::::1;4477:21:1::0;4534:2;4514:18;;;4507:30;4573:34;4553:18;;;4546:62;-1:-1:-1;;;4624:18:1;;;4617:36;4670:19;;1198:73:0::1;4293:402:1::0;1198:73:0::1;1282:28;1301:8;1282:18;:28::i;18761:209::-:0;-1:-1:-1;;;;;18904:16:0;;18825:7;18904:16;;;:7;:16;;;;;:33;;;18825:7;;18863:25;18912:7;18863:16;:25::i;:::-;:74;;;;:::i;:::-;18845:92;18761:209;-1:-1:-1;;;18761:209:0:o;1871:289::-;1651:1;2001:7;;:19;;1993:63;;;;-1:-1:-1;;;1993:63:0;;7494:2:1;1993:63:0;;;7476:21:1;7533:2;7513:18;;;7506:30;7572:33;7552:18;;;7545:61;7623:18;;1993:63:0;7292:355:1;1993:63:0;1651:1;2134:7;:18;1871:289::o;20756:664::-;20849:16;20906:17;;20887:15;:36;20883:352;;21092:14;;-1:-1:-1;;;;;21044:16:0;;;;;;:7;:16;;;;;:29;;20986:33;;;;;21110:4;;21092:14;21044:29;20968:51;;:15;:51;:::i;:::-;20967:106;;;;:::i;:::-;20947:159;;;;:::i;:::-;20946:168;;;;:::i;:::-;20938:177;20756:664;-1:-1:-1;;20756:664:0:o;20883:352::-;21181:17;;;-1:-1:-1;;;;;21144:16:0;;;;;;:7;:16;;;;;:33;;;;:54;21141:94;;-1:-1:-1;21222:1:0;;20756:664;-1:-1:-1;20756:664:0:o;21141:94::-;21389:14;;-1:-1:-1;;;;;21345:16:0;;;;;;:7;:16;;;;;:29;;21291:33;;;;;21271:17;;21407:4;;21389:14;21271:53;;;:::i;2168:213::-;1607:1;2351:22;;2168:213::o;8509:211::-;8653:58;;;-1:-1:-1;;;;;2382:32:1;;8653:58:0;;;2364:51:1;2431:18;;;;2424:34;;;8653:58:0;;;;;;;;;;2337:18:1;;;;8653:58:0;;;;;;;;-1:-1:-1;;;;;8653:58:0;-1:-1:-1;;;8653:58:0;;;8626:86;;8646:5;;8626:19;:86::i;:::-;8509:211;;;:::o;866:132::-;817:7;844:6;-1:-1:-1;;;;;844:6:0;191:10;930:23;922:68;;;;-1:-1:-1;;;922:68:0;;5663:2:1;922:68:0;;;5645:21:1;;;5682:18;;;5675:30;5741:34;5721:18;;;5714:62;5793:18;;922:68:0;5461:356:1;1326:191:0;1400:16;1419:6;;-1:-1:-1;;;;;1436:17:0;;;-1:-1:-1;;;;;;1436:17:0;;;;;;1469:40;;1419:6;;;;;;;1469:40;;1400:16;1469:40;1389:128;1326:191;:::o;10932:716::-;11356:23;11382:69;11410:4;11382:69;;;;;;;;;;;;;;;;;11390:5;-1:-1:-1;;;;;11382:27:0;;;:69;;;;;:::i;:::-;11466:17;;11356:95;;-1:-1:-1;11466:21:0;11462:179;;11563:10;11552:30;;;;;;;;;;;;:::i;:::-;11544:85;;;;-1:-1:-1;;;11544:85:0;;7083:2:1;11544:85:0;;;7065:21:1;7122:2;7102:18;;;7095:30;7161:34;7141:18;;;7134:62;-1:-1:-1;;;7212:18:1;;;7205:40;7262:19;;11544:85:0;6881:406:1;4860:229:0;4997:12;5029:52;5051:6;5059:4;5065:1;5068:12;5029:21;:52::i;:::-;5022:59;4860:229;-1:-1:-1;;;;4860:229:0:o;5365:455::-;5535:12;5593:5;5568:21;:30;;5560:81;;;;-1:-1:-1;;;5560:81:0;;5256:2:1;5560:81:0;;;5238:21:1;5295:2;5275:18;;;5268:30;5334:34;5314:18;;;5307:62;-1:-1:-1;;;5385:18:1;;;5378:36;5431:19;;5560:81:0;5054:402:1;5560:81:0;5653:12;5667:23;5694:6;-1:-1:-1;;;;;5694:11:0;5713:5;5720:4;5694:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5652:73;;;;5743:69;5770:6;5778:7;5787:10;5799:12;5743:26;:69::i;:::-;5736:76;5365:455;-1:-1:-1;;;;;;;5365:455:0:o;6924:644::-;7109:12;7138:7;7134:427;;;7166:17;;7162:290;;-1:-1:-1;;;;;4301:19:0;;;7376:60;;;;-1:-1:-1;;;7376:60:0;;6725:2:1;7376:60:0;;;6707:21:1;6764:2;6744:18;;;6737:30;6803:31;6783:18;;;6776:59;6852:18;;7376:60:0;6523:353:1;7376:60:0;-1:-1:-1;7473:10:0;7466:17;;7134:427;7516:33;7524:10;7536:12;8050:17;;:21;8046:388;;8282:10;8276:17;8339:15;8326:10;8322:2;8318:19;8311:44;8046:388;8409:12;8402:20;;-1:-1:-1;;;8402:20:0;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:277::-;589:6;642:2;630:9;621:7;617:23;613:32;610:52;;;658:1;655;648:12;610:52;690:9;684:16;743:5;736:13;729:21;722:5;719:32;709:60;;765:1;762;755:12;804:329;886:6;894;947:2;935:9;926:7;922:23;918:32;915:52;;;963:1;960;953:12;915:52;1002:9;989:23;1021:31;1046:5;1021:31;:::i;:::-;1071:5;1123:2;1108:18;;;;1095:32;;-1:-1:-1;;;804:329:1:o;1138:180::-;1197:6;1250:2;1238:9;1229:7;1225:23;1221:32;1218:52;;;1266:1;1263;1256:12;1218:52;-1:-1:-1;1289:23:1;;1138:180;-1:-1:-1;1138:180:1:o;1323:274::-;1452:3;1490:6;1484:13;1506:53;1552:6;1547:3;1540:4;1532:6;1528:17;1506:53;:::i;:::-;1575:16;;;;;1323:274;-1:-1:-1;;1323:274:1:o;2469:632::-;2640:2;2692:21;;;2762:13;;2665:18;;;2784:22;;;2611:4;;2640:2;2863:15;;;;2837:2;2822:18;;;2611:4;2906:169;2920:6;2917:1;2914:13;2906:169;;;2981:13;;2969:26;;3050:15;;;;3015:12;;;;2942:1;2935:9;2906:169;;;-1:-1:-1;3092:3:1;;2469:632;-1:-1:-1;;;;;;2469:632:1:o;3551:383::-;3700:2;3689:9;3682:21;3663:4;3732:6;3726:13;3775:6;3770:2;3759:9;3755:18;3748:34;3791:66;3850:6;3845:2;3834:9;3830:18;3825:2;3817:6;3813:15;3791:66;:::i;:::-;3918:2;3897:15;-1:-1:-1;;3893:29:1;3878:45;;;;3925:2;3874:54;;3551:383;-1:-1:-1;;3551:383:1:o;8411:128::-;8451:3;8482:1;8478:6;8475:1;8472:13;8469:39;;;8488:18;;:::i;:::-;-1:-1:-1;8524:9:1;;8411:128::o;8544:217::-;8584:1;8610;8600:132;;8654:10;8649:3;8645:20;8642:1;8635:31;8689:4;8686:1;8679:15;8717:4;8714:1;8707:15;8600:132;-1:-1:-1;8746:9:1;;8544:217::o;8766:168::-;8806:7;8872:1;8868;8864:6;8860:14;8857:1;8854:21;8849:1;8842:9;8835:17;8831:45;8828:71;;;8879:18;;:::i;:::-;-1:-1:-1;8919:9:1;;8766:168::o;8939:125::-;8979:4;9007:1;9004;9001:8;8998:34;;;9012:18;;:::i;:::-;-1:-1:-1;9049:9:1;;8939:125::o;9069:258::-;9141:1;9151:113;9165:6;9162:1;9159:13;9151:113;;;9241:11;;;9235:18;9222:11;;;9215:39;9187:2;9180:10;9151:113;;;9282:6;9279:1;9276:13;9273:48;;;9317:1;9308:6;9303:3;9299:16;9292:27;9273:48;;9069:258;;;:::o;9332:136::-;9371:3;9399:5;9389:39;;9408:18;;:::i;:::-;-1:-1:-1;;;9444:18:1;;9332:136::o;9473:135::-;9512:3;-1:-1:-1;;9533:17:1;;9530:43;;;9553:18;;:::i;:::-;-1:-1:-1;9600:1:1;9589:13;;9473:135::o;9613:127::-;9674:10;9669:3;9665:20;9662:1;9655:31;9705:4;9702:1;9695:15;9729:4;9726:1;9719:15;9745:127;9806:10;9801:3;9797:20;9794:1;9787:31;9837:4;9834:1;9827:15;9861:4;9858:1;9851:15;9877:127;9938:10;9933:3;9929:20;9926:1;9919:31;9969:4;9966:1;9959:15;9993:4;9990:1;9983:15;10009:131;-1:-1:-1;;;;;10084:31:1;;10074:42;;10064:70;;10130:1;10127;10120:12

Swarm Source

ipfs://60371a3a62463447bb8c64431c4e278422d71fd1e3083f1cc29c22e3be050dd3

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.