ETH Price: $1,638.58 (+1.81%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw167798432023-03-07 23:59:59775 days ago1678233599IN
0x4097Cf48...A265b0481
0 ETH0.0048683532.86187621
Emergency Withdr...165575602023-02-04 19:39:23806 days ago1675539563IN
0x4097Cf48...A265b0481
0 ETH0.0067051525.05897973
Claim Rewards165527152023-02-04 3:23:23807 days ago1675481003IN
0x4097Cf48...A265b0481
0 ETH0.0067221124.11832201
Claim Rewards165380822023-02-02 2:16:35809 days ago1675304195IN
0x4097Cf48...A265b0481
0 ETH0.0127427521.17187674
Claim Rewards165178052023-01-30 6:19:35811 days ago1675059575IN
0x4097Cf48...A265b0481
0 ETH0.003856113.83534895
Claim Rewards164972672023-01-27 9:30:47814 days ago1674811847IN
0x4097Cf48...A265b0481
0 ETH0.0038778113.91324483
Claim Rewards164765382023-01-24 12:02:23817 days ago1674561743IN
0x4097Cf48...A265b0481
0 ETH0.0043674815.67011854
Claim Rewards164521992023-01-21 2:29:23821 days ago1674268163IN
0x4097Cf48...A265b0481
0 ETH0.0042405615.21476039
Claim Rewards164390052023-01-19 6:16:35822 days ago1674108995IN
0x4097Cf48...A265b0481
0 ETH0.0047972617.21215059
Claim Rewards164241472023-01-17 4:32:47825 days ago1673929967IN
0x4097Cf48...A265b0481
0 ETH0.005460519.59179469
Claim Rewards164233232023-01-17 1:46:59825 days ago1673920019IN
0x4097Cf48...A265b0481
0 ETH0.0051426318.4512967
Claim Rewards164188562023-01-16 10:49:47825 days ago1673866187IN
0x4097Cf48...A265b0481
0 ETH0.0037217913.353445
Claim Rewards164187802023-01-16 10:34:35825 days ago1673865275IN
0x4097Cf48...A265b0481
0 ETH0.0044123715.83119624
Claim Rewards163620232023-01-08 12:18:47833 days ago1673180327IN
0x4097Cf48...A265b0481
0 ETH0.0039362914.1230607
Claim Rewards163612032023-01-08 9:33:35833 days ago1673170415IN
0x4097Cf48...A265b0481
0 ETH0.0042905215.50526632
Claim Rewards163579262023-01-07 22:35:23834 days ago1673130923IN
0x4097Cf48...A265b0481
0 ETH0.004642216.65581841
Claim Rewards163542822023-01-07 10:23:11834 days ago1673086991IN
0x4097Cf48...A265b0481
0 ETH0.003388612.158
Claim Rewards163539362023-01-07 9:13:23834 days ago1673082803IN
0x4097Cf48...A265b0481
0 ETH0.0041530214.90068572
Claim Rewards163505272023-01-06 21:47:59835 days ago1673041679IN
0x4097Cf48...A265b0481
0 ETH0.0055286419.83627639
Claim Rewards163300742023-01-04 1:14:59838 days ago1672794899IN
0x4097Cf48...A265b0481
0 ETH0.0058376520.94495307
Claim Rewards163212842023-01-02 19:49:35839 days ago1672688975IN
0x4097Cf48...A265b0481
0 ETH0.0045485716.31988058
Claim Rewards162886762022-12-29 6:38:23843 days ago1672295903IN
0x4097Cf48...A265b0481
0 ETH0.0043751915.69780094
Claim Rewards162681052022-12-26 9:42:35846 days ago1672047755IN
0x4097Cf48...A265b0481
0 ETH0.0028711610.30147874
Claim Rewards162655792022-12-26 1:15:11847 days ago1672017311IN
0x4097Cf48...A265b0481
0 ETH0.0033929512.17362355
Claim Rewards162622772022-12-25 14:12:35847 days ago1671977555IN
0x4097Cf48...A265b0481
0 ETH0.0065637810.90560927
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:
ERC721Staking

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-03
*/

// 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 = 1677873600;

    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 = 779872689182000000000;

    // 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"}]

60c060405263640251c0600255682a46e85ede51bbac0060035534801561002557600080fd5b50604051620014e5380380620014e5833981016040819052610046916100c1565b61004f33610071565b600180556001600160601b0319606092831b811660a052911b16608052610113565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156100d457600080fd5b82516100df816100fb565b60208401519092506100f0816100fb565b809150509250929050565b6001600160a01b038116811461011057600080fd5b50565b60805160601c60a05160601c61138a6200015b6000396000818161015b0152818161059a015281816109bd0152610aab01526000818161028901526106b4015261138a6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80639168ae72116100a2578063a694fc3a11610071578063a694fc3a14610271578063d1af0c7d14610284578063e4a337f3146102ab578063f2fde38b146102b4578063f854a27f146102c757600080fd5b80639168ae72146101d8578063940670451461022257806395ccea671461024b578063a1bb5cd81461025e57600080fd5b8063715018a6116100de578063715018a61461019557806374baefcf1461019d5780638da5cb5b146101b05780638e7271fa146101c157600080fd5b80632e1a7d4d14610110578063372500ab1461012557806363c28db11461012d5780636588103b14610156575b600080fd5b61012361011e36600461117f565b6102da565b005b61012361061b565b61014061013b3660046110f7565b6106e3565b60405161014d91906111b4565b60405180910390f35b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014d565b61012361086d565b6101236101ab36600461117f565b610881565b6000546001600160a01b031661017d565b6101ca60035481565b60405190815260200161014d565b6102076101e63660046110f7565b60046020526000908152604090208054600282015460039092015490919083565b6040805193845260208401929092529082015260600161014d565b61017d61023036600461117f565b6005602052600090815260409020546001600160a01b031681565b610123610259366004611153565b6108cf565b61012361026c36600461117f565b610901565b61012361027f36600461117f565b610947565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6101ca60025481565b6101236102c23660046110f7565b610bc7565b6101ca6102d53660046110f7565b610c3d565b6102e2610c75565b60025442101561032b5760405162461bcd60e51b815260206004820152600f60248201526e1391951cc8185c99481b1bd8dad959608a1b60448201526064015b60405180910390fd5b336000908152600460205260409020546103875760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b6564000000000000006044820152606401610322565b6000818152600560205260409020546001600160a01b031633146103e95760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b60006103f433610ccf565b3360009081526004602052604081206003018054929350839290919061041b90849061122b565b9091555060009050805b336000908152600460205260409020600101548110156104e05733600090815260046020526040902060010180548591908390811061046657610466611313565b9060005260206000209060020201600101541480156104c157503360009081526004602052604081206001018054839081106104a4576104a4611313565b60009182526020909120600290910201546001600160a01b031614155b156104ce578091506104e0565b806104d8816112e2565b915050610425565b5033600090815260046020526040812060010180548390811061050557610505611313565b6000918252602080832060029290920290910180546001600160a01b0319166001600160a01b03949094169390931790925533815260049091526040812080549161054f836112cb565b90915550506000838152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018490526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b1580156105de57600080fd5b505af11580156105f2573d6000803e3d6000fd5b505033600090815260046020526040902042600290910155506106189250610d91915050565b50565b33600081815260046020526040812060030154909161063990610ccf565b610643919061122b565b9050600081116106955760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d000000006044820152606401610322565b33600081815260046020526040812042600282015560030155610618907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169083610d97565b6001600160a01b03811660009081526004602052604090205460609015610859576001600160a01b03821660009081526004602052604081205467ffffffffffffffff81111561073557610735611329565b60405190808252806020026020018201604052801561075e578160200160208202803683370190505b5090506000805b6001600160a01b038516600090815260046020526040902060010154811015610850576001600160a01b03851660009081526004602052604081206001018054839081106107b5576107b5611313565b60009182526020909120600290910201546001600160a01b03161461083e576001600160a01b038516600090815260046020526040902060010180548290811061080157610801611313565b90600052602060002090600202016001015483838151811061082557610825611313565b60209081029190910101528161083a816112e2565b9250505b80610848816112e2565b915050610765565b50909392505050565b505060408051600081526020810190915290565b610875610dee565b61087f6000610e48565b565b610889610dee565b600380549082905560408051828152602081018490527f2e48a9d59ca3fc8b64b9dd84783ada19b9b4240c23b4e87f3ff21a1ba1f320d391015b60405180910390a15050565b6108d7610dee565b6108fd6108ec6000546001600160a01b031690565b6001600160a01b0384169083610d97565b5050565b610909610dee565b600280549082905560408051828152602081018490527f71ffeabd1c4634f619be28486143538a8255c59b257708a84a258b78d3b8ca4091016108c3565b61094f610c75565b336000908152600460205260409020541561099d57600061096f33610ccf565b3360009081526004602052604081206003018054929350839290919061099690849061122b565b9091555050505b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e9060240160206040518083038186803b1580156109ff57600080fd5b505afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a379190611114565b6001600160a01b031614610a895760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b5050604080518082018252338082526020808301878152600083815260048352948520600180820180548083018255908852938720865160029095020180546001600160a01b0319166001600160a01b0390951694909417845591519290910191909155908352805491945090925090610b84836112e2565b909155505050600081815260056020908152604080832080546001600160a01b031916339081179091558352600490915290204260029091015561061860018055565b610bcf610dee565b6001600160a01b038116610c345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610322565b61061881610e48565b6001600160a01b0381166000908152600460205260408120600301548190610c6484610ccf565b610c6e919061122b565b9392505050565b60026001541415610cc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610322565b6002600155565b60006002544211610d31576003546001600160a01b03831660009081526004602052604090208054600290910154610e10929190610d0d9042611284565b610d179190611265565b610d219190611265565b610d2b9190611243565b92915050565b600280546001600160a01b03841660009081526004602052604090209091015410610d5e57506000919050565b6003546001600160a01b038316600090815260046020526040902080546002918201549154610e109392610d0d91611284565b60018055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610de9908490610e98565b505050565b6000546001600160a01b0316331461087f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610322565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610eed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610f6a9092919063ffffffff16565b805190915015610de95780806020019051810190610f0b9190611131565b610de95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610322565b6060610f798484600085610f81565b949350505050565b606082471015610fe25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610322565b600080866001600160a01b03168587604051610ffe9190611198565b60006040518083038185875af1925050503d806000811461103b576040519150601f19603f3d011682016040523d82523d6000602084013e611040565b606091505b50915091506110518783838761105c565b979650505050505050565b606083156110c85782516110c1576001600160a01b0385163b6110c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610322565b5081610f79565b610f7983838151156110dd5781518083602001fd5b8060405162461bcd60e51b815260040161032291906111f8565b60006020828403121561110957600080fd5b8135610c6e8161133f565b60006020828403121561112657600080fd5b8151610c6e8161133f565b60006020828403121561114357600080fd5b81518015158114610c6e57600080fd5b6000806040838503121561116657600080fd5b82356111718161133f565b946020939093013593505050565b60006020828403121561119157600080fd5b5035919050565b600082516111aa81846020870161129b565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156111ec578351835292840192918401916001016111d0565b50909695505050505050565b602081526000825180602084015261121781604085016020870161129b565b601f01601f19169190910160400192915050565b6000821982111561123e5761123e6112fd565b500190565b60008261126057634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561127f5761127f6112fd565b500290565b600082821015611296576112966112fd565b500390565b60005b838110156112b657818101518382015260200161129e565b838111156112c5576000848401525b50505050565b6000816112da576112da6112fd565b506000190190565b60006000198214156112f6576112f66112fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461061857600080fdfea2646970667358221220bdfdcf11aa9aa8959c77b5c7f39d1fcb1f1a78d38cb8a4fbe91817698dd8e48664736f6c634300080700330000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd16

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80639168ae72116100a2578063a694fc3a11610071578063a694fc3a14610271578063d1af0c7d14610284578063e4a337f3146102ab578063f2fde38b146102b4578063f854a27f146102c757600080fd5b80639168ae72146101d8578063940670451461022257806395ccea671461024b578063a1bb5cd81461025e57600080fd5b8063715018a6116100de578063715018a61461019557806374baefcf1461019d5780638da5cb5b146101b05780638e7271fa146101c157600080fd5b80632e1a7d4d14610110578063372500ab1461012557806363c28db11461012d5780636588103b14610156575b600080fd5b61012361011e36600461117f565b6102da565b005b61012361061b565b61014061013b3660046110f7565b6106e3565b60405161014d91906111b4565b60405180910390f35b61017d7f0000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf81565b6040516001600160a01b03909116815260200161014d565b61012361086d565b6101236101ab36600461117f565b610881565b6000546001600160a01b031661017d565b6101ca60035481565b60405190815260200161014d565b6102076101e63660046110f7565b60046020526000908152604090208054600282015460039092015490919083565b6040805193845260208401929092529082015260600161014d565b61017d61023036600461117f565b6005602052600090815260409020546001600160a01b031681565b610123610259366004611153565b6108cf565b61012361026c36600461117f565b610901565b61012361027f36600461117f565b610947565b61017d7f00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd1681565b6101ca60025481565b6101236102c23660046110f7565b610bc7565b6101ca6102d53660046110f7565b610c3d565b6102e2610c75565b60025442101561032b5760405162461bcd60e51b815260206004820152600f60248201526e1391951cc8185c99481b1bd8dad959608a1b60448201526064015b60405180910390fd5b336000908152600460205260409020546103875760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b6564000000000000006044820152606401610322565b6000818152600560205260409020546001600160a01b031633146103e95760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b60006103f433610ccf565b3360009081526004602052604081206003018054929350839290919061041b90849061122b565b9091555060009050805b336000908152600460205260409020600101548110156104e05733600090815260046020526040902060010180548591908390811061046657610466611313565b9060005260206000209060020201600101541480156104c157503360009081526004602052604081206001018054839081106104a4576104a4611313565b60009182526020909120600290910201546001600160a01b031614155b156104ce578091506104e0565b806104d8816112e2565b915050610425565b5033600090815260046020526040812060010180548390811061050557610505611313565b6000918252602080832060029290920290910180546001600160a01b0319166001600160a01b03949094169390931790925533815260049091526040812080549161054f836112cb565b90915550506000838152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018490526001600160a01b037f0000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf16906323b872dd90606401600060405180830381600087803b1580156105de57600080fd5b505af11580156105f2573d6000803e3d6000fd5b505033600090815260046020526040902042600290910155506106189250610d91915050565b50565b33600081815260046020526040812060030154909161063990610ccf565b610643919061122b565b9050600081116106955760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d000000006044820152606401610322565b33600081815260046020526040812042600282015560030155610618907f00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd166001600160a01b03169083610d97565b6001600160a01b03811660009081526004602052604090205460609015610859576001600160a01b03821660009081526004602052604081205467ffffffffffffffff81111561073557610735611329565b60405190808252806020026020018201604052801561075e578160200160208202803683370190505b5090506000805b6001600160a01b038516600090815260046020526040902060010154811015610850576001600160a01b03851660009081526004602052604081206001018054839081106107b5576107b5611313565b60009182526020909120600290910201546001600160a01b03161461083e576001600160a01b038516600090815260046020526040902060010180548290811061080157610801611313565b90600052602060002090600202016001015483838151811061082557610825611313565b60209081029190910101528161083a816112e2565b9250505b80610848816112e2565b915050610765565b50909392505050565b505060408051600081526020810190915290565b610875610dee565b61087f6000610e48565b565b610889610dee565b600380549082905560408051828152602081018490527f2e48a9d59ca3fc8b64b9dd84783ada19b9b4240c23b4e87f3ff21a1ba1f320d391015b60405180910390a15050565b6108d7610dee565b6108fd6108ec6000546001600160a01b031690565b6001600160a01b0384169083610d97565b5050565b610909610dee565b600280549082905560408051828152602081018490527f71ffeabd1c4634f619be28486143538a8255c59b257708a84a258b78d3b8ca4091016108c3565b61094f610c75565b336000908152600460205260409020541561099d57600061096f33610ccf565b3360009081526004602052604081206003018054929350839290919061099690849061122b565b9091555050505b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf1690636352211e9060240160206040518083038186803b1580156109ff57600080fd5b505afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a379190611114565b6001600160a01b031614610a895760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b6044820152606401610322565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f0000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf6001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b5050604080518082018252338082526020808301878152600083815260048352948520600180820180548083018255908852938720865160029095020180546001600160a01b0319166001600160a01b0390951694909417845591519290910191909155908352805491945090925090610b84836112e2565b909155505050600081815260056020908152604080832080546001600160a01b031916339081179091558352600490915290204260029091015561061860018055565b610bcf610dee565b6001600160a01b038116610c345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610322565b61061881610e48565b6001600160a01b0381166000908152600460205260408120600301548190610c6484610ccf565b610c6e919061122b565b9392505050565b60026001541415610cc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610322565b6002600155565b60006002544211610d31576003546001600160a01b03831660009081526004602052604090208054600290910154610e10929190610d0d9042611284565b610d179190611265565b610d219190611265565b610d2b9190611243565b92915050565b600280546001600160a01b03841660009081526004602052604090209091015410610d5e57506000919050565b6003546001600160a01b038316600090815260046020526040902080546002918201549154610e109392610d0d91611284565b60018055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610de9908490610e98565b505050565b6000546001600160a01b0316331461087f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610322565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610eed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610f6a9092919063ffffffff16565b805190915015610de95780806020019051810190610f0b9190611131565b610de95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610322565b6060610f798484600085610f81565b949350505050565b606082471015610fe25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610322565b600080866001600160a01b03168587604051610ffe9190611198565b60006040518083038185875af1925050503d806000811461103b576040519150601f19603f3d011682016040523d82523d6000602084013e611040565b606091505b50915091506110518783838761105c565b979650505050505050565b606083156110c85782516110c1576001600160a01b0385163b6110c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610322565b5081610f79565b610f7983838151156110dd5781518083602001fd5b8060405162461bcd60e51b815260040161032291906111f8565b60006020828403121561110957600080fd5b8135610c6e8161133f565b60006020828403121561112657600080fd5b8151610c6e8161133f565b60006020828403121561114357600080fd5b81518015158114610c6e57600080fd5b6000806040838503121561116657600080fd5b82356111718161133f565b946020939093013593505050565b60006020828403121561119157600080fd5b5035919050565b600082516111aa81846020870161129b565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156111ec578351835292840192918401916001016111d0565b50909695505050505050565b602081526000825180602084015261121781604085016020870161129b565b601f01601f19169190910160400192915050565b6000821982111561123e5761123e6112fd565b500190565b60008261126057634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561127f5761127f6112fd565b500290565b600082821015611296576112966112fd565b500390565b60005b838110156112b657818101518382015260200161129e565b838111156112c5576000848401525b50505050565b6000816112da576112da6112fd565b506000190190565b60006000198214156112f6576112f66112fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461061857600080fdfea2646970667358221220bdfdcf11aa9aa8959c77b5c7f39d1fcb1f1a78d38cb8a4fbe91817698dd8e48664736f6c63430008070033

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

0000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf00000000000000000000000057c411e9a358e2d2d0a6b058cedb709175e8fd16

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002d4b184e0589a4289f73b6cc71298193ca413ecf
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://bdfdcf11aa9aa8959c77b5c7f39d1fcb1f1a78d38cb8a4fbe91817698dd8e486

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
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.