Contract 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68

 

Contract Overview

Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x587eebd06532d195565518ad8f6f7cabccb3459885985079a36b6de0020de515Unstake NF Ts263614772022-09-24 9:46:112 days 21 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.00001396
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982Unstake NF Ts260347162022-09-22 20:01:234 days 11 hrs ago0x5e3d81f47cdaf4ff4622a40b3e76fe0b896e5324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.00004585
0xa79d758b539b3809589ee1c947610a294c2919cab09e994666950ab816e3e2f2Unstake NF Ts227711042022-09-04 9:03:4422 days 22 hrs ago0xea2f79bce55908a11e0bf7dffb855c962041674f IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.00027345
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641Unstake NF Ts205441872022-08-17 22:01:2140 days 9 hrs ago0xeb8e574676179776d97381beaabbcf8945035e63 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000335143301 ETH
0x9ab132499149e2fd4e80bbfec4b0938fa0d542fc3b9ed6136494af74e436ab45Unstake NF Ts191596952022-08-02 2:05:1456 days 5 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000072506199 ETH
0xda3b97e34f4c5a191386dbe2b1adcfe26848d19c72845d5a88b707860d6ab764Unstake NF Ts152640252022-06-21 14:50:3897 days 16 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000163346618 ETH
0x5747fdef22ce921f1e037e008ddf839147b3827aedb055879302df062a388578Unstake NF Ts129183482022-05-25 9:39:44124 days 21 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.00011882017 ETH
0x486b04bbbe5c45cf745dbbde3d0f1c71e158bb108f25caa1521763971249921cUnstake NF Ts115425252022-05-08 23:58:04141 days 7 hrs ago0x3c0465746fa069d19ce0ce0e0dbf79bed66d0773 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000125580209 ETH
0x735485c4d01455130460220b0fee690706fb5499edfd9a02dd5a415ac9d6c2f0Unstake NF Ts114301802022-05-07 16:45:11142 days 14 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000165246677 ETH
0xe3e6baedb681486ca6dc69bb9d557202bcbd9548b481e94a578bf8a69477af47Unstake NF Ts114287202022-05-07 16:20:01142 days 15 hrs ago0xea2f79bce55908a11e0bf7dffb855c962041674f IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000164761831 ETH
0xb538c31a40e2b83ec514e23f9c3da1a07d81b32541450f9a9331c3ce55b0f295Unstake NF Ts112441252022-05-05 11:04:37144 days 20 hrs ago0x78adb1b4707b4b75a407dd913238735382451481 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000323462875 ETH
0xe0355e8359c2860f1e2c509bf6decdbf2e2154a98801348096204925a99dec44Unstake NF Ts108369882022-04-29 16:03:05150 days 15 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000224939681 ETH
0x7d2e86d968283a40c173f0c4a475647970826a0ae106bc8e82f1b4be82da2cd4Unstake NF Ts101912102022-04-20 14:23:09159 days 17 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000193953193 ETH
0x38f6d5b8daa7cbd2a28326be205cb9551ffa6aca2331a1c2834414ffe43c3f39Unstake NF Ts101911012022-04-20 14:21:25159 days 17 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.0001933829 ETH
0xd6fa688cdc39f5ef2bcbc5779b2fcac3155d887cb94b1ec1b8a538b46f95115fUnstake NF Ts98821302022-04-15 22:30:13164 days 9 hrs ago0x0855d454436552f854fa95c8b0b20f853ff0db93 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000212838613 ETH
0x2058ff8b100e65e4baefb2d3b87206ce772381fb52147cbfe905cbefbe343785Unstake NF Ts97244742022-04-13 5:19:32167 days 2 hrs ago0x55d607ebcdae3d0a5da08d92f115638115972ce0 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000351307041 ETH
0x70971fead100680e79f006efe13260d49cf6e38b20d4e12574b0464c54942c23Unstake NF Ts97244692022-04-13 5:19:32167 days 2 hrs ago0x55d607ebcdae3d0a5da08d92f115638115972ce0 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000257260721 ETH
0x39ca2386e04868d31a5f191e96a82d734de5a55f51bfdb2e93baeed54dd0a63cUnstake NF Ts95987552022-04-10 17:50:19169 days 13 hrs ago0xeb8e574676179776d97381beaabbcf8945035e63 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000204032404 ETH
0x9c9a4b66aac883d98d675fc2926ba10cdb4503b2c9699b092a47993e50fbc0dfUnstake NF Ts95735682022-04-10 2:45:55170 days 4 hrs ago0xbf5beeffb60c9be21681254f2581ead4375c1a30 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000353437522 ETH
0x92ec1d0394b3815cf18deefe8ff927b8e071564faa57f22a773c6a37bda1191fUnstake NF Ts95084032022-04-08 15:20:49171 days 16 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000312364828 ETH
0x9251ee99726eb4c08686c80272e4b00c8ef5a1c53d30cd46d1a778f0994fc8eeUnstake NF Ts94609112022-04-07 16:47:10172 days 14 hrs ago0x757f39e648d718dd4f93c665c83c7be582baad04 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.00035021516 ETH
0xd34554c1b0804e7671246004f2e1afba882ec66371285001e7434ad443e070a7Unstake NF Ts94608932022-04-07 16:46:23172 days 14 hrs ago0x757f39e648d718dd4f93c665c83c7be582baad04 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000478212344 ETH
0x6eb23f03b4bcaf1078dce2d9552490602956280f26de94bad64a9afb8c64d499Unstake NF Ts92858992022-04-04 9:37:28175 days 21 hrs ago0xd48b17b111579360d1465ccc470144967505c053 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.00041790317 ETH
0x353f7570296fa4167646982a2e45ea0fdbe118fdeae2bb4e60c57fb1d90f6e9aUnstake NF Ts91917452022-04-02 17:29:25177 days 14 hrs ago0xea2f79bce55908a11e0bf7dffb855c962041674f IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000258246154 ETH
0xbe607aebeb127e058a04cde5dc88bc73691f133fb4ef19269f91be563deb574cUnstake NF Ts89653522022-03-31 10:03:41179 days 21 hrs ago0x81f7c3796f4b024b6700a0134a1c509acf920324 IN  0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH0.000225117824 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x54ef574b02280a3041fd56da870bc787cd9947630c84fc3e290d548a9955bbf5263615492022-09-24 9:46:242 days 21 hrs ago 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH
0x587eebd06532d195565518ad8f6f7cabccb3459885985079a36b6de0020de515263614772022-09-24 9:46:112 days 21 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x650a9960673688ba924615a2d28c39a8e015fb190 ETH
0x587eebd06532d195565518ad8f6f7cabccb3459885985079a36b6de0020de515263614772022-09-24 9:46:112 days 21 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e0 ETH
0x587eebd06532d195565518ad8f6f7cabccb3459885985079a36b6de0020de515263614772022-09-24 9:46:112 days 21 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xb6945b73ed554df8d52ecdf1ab08f17564386e0f0 ETH
0xa4fe2868f7d68c975e9a91b0f2a317f0d9b3480a8cfc4da4ea861462827069db260347872022-09-22 20:01:484 days 11 hrs ago 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x650a9960673688ba924615a2d28c39a8e015fb190 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xb6945b73ed554df8d52ecdf1ab08f17564386e0f0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x8f710a4b47eee25b333734c193308f7f974bc058ff1ddebeebfb5f24b7947982260347162022-09-22 20:01:234 days 11 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x2e00004c8991ff7e9c4933c8925f7c3b947db771f3c1a645882b8ac1e640c96d227712162022-09-04 9:04:2822 days 22 hrs ago 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH
0xa79d758b539b3809589ee1c947610a294c2919cab09e994666950ab816e3e2f2227711042022-09-04 9:03:4422 days 22 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x650a9960673688ba924615a2d28c39a8e015fb190 ETH
0xa79d758b539b3809589ee1c947610a294c2919cab09e994666950ab816e3e2f2227711042022-09-04 9:03:4422 days 22 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e0 ETH
0xa79d758b539b3809589ee1c947610a294c2919cab09e994666950ab816e3e2f2227711042022-09-04 9:03:4422 days 22 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xb6945b73ed554df8d52ecdf1ab08f17564386e0f0 ETH
0x5141e749a022518ceefad802971af858f8e521aa6c0590c57134b7e1ba10e28d205441972022-08-17 22:02:2340 days 9 hrs ago 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead680 ETH
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641205441872022-08-17 22:01:2140 days 9 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x650a9960673688ba924615a2d28c39a8e015fb190 ETH
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641205441872022-08-17 22:01:2140 days 9 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xfa798e448db7987a5d7ab3620d7c3d5ecb18275e0 ETH
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641205441872022-08-17 22:01:2140 days 9 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0xb6945b73ed554df8d52ecdf1ab08f17564386e0f0 ETH
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641205441872022-08-17 22:01:2140 days 9 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641205441872022-08-17 22:01:2140 days 9 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
0x12a5e41f5cb53fe750a48737c6bbbf81388e0ce77973c8d3aaa64da4cce12641205441872022-08-17 22:01:2140 days 9 hrs ago 0xd9403e7497051b317cf1ae88eeaf46ee4e8ead68 0x895a6f444be4ba9d124f61df736605792b35d66b0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RWNFTStaking

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 8: RWNFTStaking.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./IERC721Receiver.sol";
import "./IERC721.sol";
import "./ReentrancyGuard.sol";
import "./IERC20.sol";
import "./Ownable.sol";

abstract contract IImpishSpiral is IERC721 {
    uint256 public _tokenIdCounter;
}
abstract contract IRandomWalkNFT is IERC721 {
    uint256 public nextTokenId;
}

abstract contract ISpiralBits is IERC20 {
    function mintSpiralBits(address to, uint256 amount) public virtual;
}

abstract contract IStakingContract {
    uint256 public totalStaked;
}

contract RWNFTStaking is IERC721Receiver, ReentrancyGuard, Ownable {
    // How many spiral bits per second are awarded to a staked spiral
    // 0.0167 SPIRALBITS per second. (1 SPIRALBIT per 60 seconds)
    uint256 constant public SPIRALBITS_PER_SECOND = 0.0167 ether;

    // We're staking this NFT in this contract
    IRandomWalkNFT public randomWalkNFT;

    // The token that is being issued for staking
    ISpiralBits public spiralbits;

    // The other NFT contract - To calculate bonuses
    IImpishSpiral public impishspiral;
    IStakingContract public spiralStaking;

    // Total number of NFTs staked in this contract
    uint256 public totalStaked;

    constructor(address _impishspiral, address _spiralbits, address _rwnft) {
        impishspiral = IImpishSpiral(_impishspiral);
        spiralbits = ISpiralBits(_spiralbits);
        
        randomWalkNFT = IRandomWalkNFT(_rwnft);
    }

    bool public paused = false;

    // Pause is a one-way function. Can't unpause it. 
    function pause() public onlyOwner {
        paused = true;
    }

    modifier notPaused() {
        require(!paused, "Paused");
        _;
    }

    function setSpiralStakingContract(address _spiralStaking) external onlyOwner {
        require(spiralStaking == IStakingContract(address(0)), "alreadyset");
        spiralStaking = IStakingContract(_spiralStaking);
    }

    function _claimSpiralBits(address owner) internal {
        // Claim all the spiralbits so far
        uint256 spiralBitsToClaim = claimsPending(owner);
        
        stakedNFTs[owner].claimedSpiralBits += uint128(spiralBitsToClaim);
        stakedNFTs[owner].lastClaimTime = uint64(block.timestamp);
    }

    function claimsPending(address owner) public view returns (uint256) {
        uint256 spiralBitsToClaim = stakedNFTs[owner].numNFTsStaked * 
                    uint256(uint64(block.timestamp) - stakedNFTs[owner].lastClaimTime) * 
                    SPIRALBITS_PER_SECOND;

        return spiralBitsToClaim;
    }
    
    function claimsPendingTotal(address owner) public view returns (uint256) {
        return claimsPending(owner) + stakedNFTs[owner].claimedSpiralBits;
    }

    function currentBonusInBips() public view returns (uint256) {
        return 100 * 100 * spiralStaking.totalStaked() / impishspiral._tokenIdCounter();
    }

    // Stake a list of Spiral tokenIDs. The msg.sender needs to own the tokenIds, and the tokens
    // are staked with msg.sender as the owner
    function stakeNFTs(uint32[] calldata tokenIds) external notPaused {
        stakeNFTsForOwner(tokenIds, msg.sender);
    }

    // Stake the NFTs and make them withdrawable by the owner. The msg.sender still needs to own
    // the NFTs that are being staked.
    // This is used by aggregator contracts.
    function stakeNFTsForOwner(uint32[] calldata tokenIds, address owner) public nonReentrant notPaused {
        require(tokenIds.length > 0, "NoTokens");
        // Claim any SPIRALBITS outstanding for this owner
        _claimSpiralBits(owner);

        totalStaked += tokenIds.length;
        for (uint32 i; i < tokenIds.length; i++) {
            uint256 tokenId = uint256(tokenIds[i]);
            require(randomWalkNFT.ownerOf(tokenId) == msg.sender, "DontOwnToken");

            // Add the spiral to staked owner list to keep track of staked tokens
            _addTokenToOwnerEnumeration(owner, tokenId);
            stakedTokenOwners[tokenId].owner = owner;

            // Add this spiral to the staked struct
            stakedNFTs[owner].numNFTsStaked += 1;

            // Transfer the actual NFT to this staking contract.
            randomWalkNFT.safeTransferFrom(msg.sender, address(this), tokenId);
        }
    }

    // Unstake a spiral. If withdraw is true, then SPIRALBITS are also claimed and sent
    function unstakeNFTs(uint32[] calldata tokenIds, bool withdraw) external nonReentrant {
        // Claim any SPIRALBITS outstanding for this owner
        _claimSpiralBits(msg.sender);

        for (uint32 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = uint256(tokenIds[i]);
            require(randomWalkNFT.ownerOf(tokenId) == address(this), "NotStaked");
            require(stakedTokenOwners[tokenId].owner == msg.sender, "NotYours");

            // Remove the spiral -> staked owner list to keep track of staked tokens
             _removeTokenFromOwnerEnumeration(msg.sender, tokenId);

            // Remove this spiral from the staked struct
            stakedNFTs[msg.sender].numNFTsStaked -= 1;
            
            // Transfer the NFT out
            randomWalkNFT.safeTransferFrom(address(this), msg.sender, tokenId);
        }
        totalStaked -= tokenIds.length;

        if (withdraw) {
            uint256 spiralBitsToMint = stakedNFTs[msg.sender].claimedSpiralBits;
            stakedNFTs[msg.sender].claimedSpiralBits = 0;

            uint256 bonus = spiralBitsToMint * currentBonusInBips() / 10000;

            // Mint and send the new spiral bits to the owners
            spiralbits.mintSpiralBits(msg.sender, spiralBitsToMint + bonus);
        }
    }

    // =========
    // Keep track of staked NFTs
    // =========
    struct StakedNFTs {
        uint32 numNFTsStaked;       // Number of NFTs staked by this owner
        uint64 lastClaimTime;       // Last timestamp that the rewards were accumulated into claimedSpiralBits
        uint128 claimedSpiralBits;  // Already claimed (but not withdrawn) spiralBits before lastClaimTime
        mapping(uint256 => uint256) ownedTokens; // index => tokenId
    }

    struct TokenIdInfo {
        uint256 ownedTokensIndex;
        address owner;
    }

    // Mapping of Spiral TokenID => Address that staked it.
    mapping(uint256 => TokenIdInfo) public stakedTokenOwners;

    // Address that staked the token => Token Accounting
    mapping(address => StakedNFTs) public stakedNFTs;
    
    // Returns a list of token Ids owned by _owner.
    function walletOfOwner(address _owner) public view
        returns (uint256[] memory) {
        uint256 tokenCount = stakedNFTs[_owner].numNFTsStaked;

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        }

        uint256[] memory result = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            result[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return result;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) {
        require(index < stakedNFTs[owner].numNFTsStaked, "ERC721Enumerable: owner index out of bounds");
        return stakedNFTs[owner].ownedTokens[index];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param owner address representing the owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address owner, uint256 tokenId) private {
        uint256 length = stakedNFTs[owner].numNFTsStaked;
        stakedNFTs[owner].ownedTokens[length] = tokenId;
        stakedTokenOwners[tokenId].ownedTokensIndex = length;
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = stakedNFTs[from].numNFTsStaked - 1;
        uint256 tokenIndex = stakedTokenOwners[tokenId].ownedTokensIndex;

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = stakedNFTs[from].ownedTokens[lastTokenIndex];

            stakedNFTs[from].ownedTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            stakedTokenOwners[lastTokenId].ownedTokensIndex = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete stakedTokenOwners[tokenId];
        delete stakedNFTs[from].ownedTokens[lastTokenIndex];
    }

    // Function that marks this contract can accept incoming NFT transfers
    function onERC721Received(address, address, uint256 , bytes calldata) public view returns(bytes4) {
        // Only accept NFT transfers from RandomWalkNFT
        require(msg.sender == address(randomWalkNFT), "NFT not recognized");

        // Return this value to accept the NFT
        return IERC721Receiver.onERC721Received.selector;
    }
}

File 2 of 8: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 8: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
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);
}

File 4 of 8: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 8: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 6 of 8: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 7 of 8: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 8 of 8: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // 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;

        _;

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_impishspiral","type":"address"},{"internalType":"address","name":"_spiralbits","type":"address"},{"internalType":"address","name":"_rwnft","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"SPIRALBITS_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claimsPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claimsPendingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentBonusInBips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"impishspiral","outputs":[{"internalType":"contract IImpishSpiral","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomWalkNFT","outputs":[{"internalType":"contract IRandomWalkNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spiralStaking","type":"address"}],"name":"setSpiralStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spiralStaking","outputs":[{"internalType":"contract IStakingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spiralbits","outputs":[{"internalType":"contract ISpiralBits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"tokenIds","type":"uint32[]"}],"name":"stakeNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"tokenIds","type":"uint32[]"},{"internalType":"address","name":"owner","type":"address"}],"name":"stakeNFTsForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedNFTs","outputs":[{"internalType":"uint32","name":"numNFTsStaked","type":"uint32"},{"internalType":"uint64","name":"lastClaimTime","type":"uint64"},{"internalType":"uint128","name":"claimedSpiralBits","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedTokenOwners","outputs":[{"internalType":"uint256","name":"ownedTokensIndex","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"tokenIds","type":"uint32[]"},{"internalType":"bool","name":"withdraw","type":"bool"}],"name":"unstakeNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60806040526007805460ff191690553480156200001b57600080fd5b50604051620017f0380380620017f08339810160408190526200003e9162000100565b60016000556200004e3362000091565b600480546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600280549190931691161790556200014a565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b0381168114620000fb57600080fd5b919050565b6000806000606084860312156200011657600080fd5b6200012184620000e3565b92506200013160208501620000e3565b91506200014160408501620000e3565b90509250925092565b611696806200015a6000396000f3fe608060405234801561001057600080fd5b506004361061011c5760003560e01c80624388f71461012157806307ca9f4414610147578063150b7a02146101725780631796fd8b1461019e5780632f745c59146101ac578063438b6300146101bf578063515f01ad146101df5780635c975abb146101f45780635cf2577414610211578063715018a614610224578063817b1cd21461022c5780638456cb5914610235578063879b7c6a1461023d5780638b3d81b3146102455780638da5cb5b14610292578063a08c5f871461029a578063aa93a4d8146102ad578063b52e0197146102c0578063ccc57128146102d3578063d72c9fee146102e6578063db029c6714610362578063ef96543e14610375578063f2fde38b14610388575b600080fd5b61013461012f36600461115e565b61039b565b6040519081526020015b60405180910390f35b60045461015a906001600160a01b031681565b6040516001600160a01b03909116815260200161013e565b61018561018036600461117b565b6103dd565b6040516001600160e01b0319909116815260200161013e565b610134663b548fbfbfc00081565b6101346101ba366004611219565b610446565b6101d26101cd36600461115e565b6104f4565b60405161013e9190611245565b6101f26101ed3660046112d4565b6105bf565b005b6007546102019060ff1681565b604051901515815260200161013e565b6101f261021f36600461132f565b610916565b6101f2610bde565b61013460065481565b6101f2610c19565b610134610c57565b61027561025336600461137a565b600860205260009081526040902080546001909101546001600160a01b031682565b604080519283526001600160a01b0390911660208301520161013e565b61015a610d80565b6101346102a836600461115e565b610d8f565b60055461015a906001600160a01b031681565b6101f26102ce366004611393565b610e10565b60035461015a906001600160a01b031681565b61032f6102f436600461115e565b60096020526000908152604090205463ffffffff811690600160201b81046001600160401b031690600160601b90046001600160801b031683565b6040805163ffffffff90941684526001600160401b0390921660208401526001600160801b03169082015260600161013e565b60025461015a906001600160a01b031681565b6101f261038336600461115e565b610e42565b6101f261039636600461115e565b610ed9565b6001600160a01b038116600090815260096020526040812054600160601b90046001600160801b03166103cd83610d8f565b6103d791906113ea565b92915050565b6002546000906001600160a01b031633146104345760405162461bcd60e51b8152602060048201526012602482015271139195081b9bdd081c9958dbd9db9a5e995960721b60448201526064015b60405180910390fd5b50630a85bd0160e11b95945050505050565b6001600160a01b03821660009081526009602052604081205463ffffffff1682106104c75760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161042b565b506001600160a01b0391909116600090815260096020908152604080832093835260019093019052205490565b6001600160a01b03811660009081526009602052604090205460609063ffffffff16806105355760408051600080825260208201909252905b509392505050565b6000816001600160401b0381111561054f5761054f611402565b604051908082528060200260200182016040528015610578578160200160208202803683370190505b50905060005b8281101561052d576105908582610446565b8282815181106105a2576105a2611418565b6020908102919091010152806105b78161142e565b91505061057e565b600260005414156105e25760405162461bcd60e51b815260040161042b90611449565b60026000556105f033610f79565b60005b63ffffffff811683111561081957600084848363ffffffff1681811061061b5761061b611418565b90506020020160208101906106309190611480565b6002546040516331a9108f60e11b815263ffffffff9290921660048301819052925030916001600160a01b0390911690636352211e9060240160206040518083038186803b15801561068157600080fd5b505afa158015610695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b991906114a6565b6001600160a01b0316146106fb5760405162461bcd60e51b8152602060048201526009602482015268139bdd14dd185ad95960ba1b604482015260640161042b565b6000818152600860205260409020600101546001600160a01b0316331461074f5760405162461bcd60e51b81526020600482015260086024820152674e6f74596f75727360c01b604482015260640161042b565b6107593382611021565b33600090815260096020526040812080546001929061077f90849063ffffffff166114c3565b825463ffffffff9182166101009390930a928302919092021990911617905550600254604051632142170760e11b81526001600160a01b03909116906342842e0e906107d3903090339086906004016114e8565b600060405180830381600087803b1580156107ed57600080fd5b505af1158015610801573d6000803e3d6000fd5b505050505080806108119061150c565b9150506105f3565b50828290506006600082825461082f9190611530565b9091555050801561090c573360009081526009602052604081208054600160601b600160e01b03198116909155600160601b90046001600160801b031690612710610878610c57565b6108829084611547565b61088c9190611566565b6003549091506001600160a01b03166339327c18336108ab84866113ea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b5050505050505b5050600160005550565b600260005414156109395760405162461bcd60e51b815260040161042b90611449565b600260005560075460ff16156109615760405162461bcd60e51b815260040161042b90611588565b816109995760405162461bcd60e51b81526020600482015260086024820152674e6f546f6b656e7360c01b604482015260640161042b565b6109a281610f79565b82829050600660008282546109b791906113ea565b90915550600090505b63ffffffff8116831115610bd357600084848363ffffffff168181106109e8576109e8611418565b90506020020160208101906109fd9190611480565b6002546040516331a9108f60e11b815263ffffffff9290921660048301819052925033916001600160a01b0390911690636352211e9060240160206040518083038186803b158015610a4e57600080fd5b505afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8691906114a6565b6001600160a01b031614610acb5760405162461bcd60e51b815260206004820152600c60248201526b2237b73a27bbb72a37b5b2b760a11b604482015260640161042b565b6001600160a01b0383166000818152600960208181526040808420805463ffffffff908116808752600180840186528488208a905589885260088652938720908155830180546001600160a01b031916881790559585529290915281549093919291610b39918591166115a8565b825463ffffffff9182166101009390930a928302919092021990911617905550600254604051632142170760e11b81526001600160a01b03909116906342842e0e90610b8d903390309086906004016114e8565b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b50505050508080610bcb9061150c565b9150506109c0565b505060016000555050565b33610be7610d80565b6001600160a01b031614610c0d5760405162461bcd60e51b815260040161042b906115d0565b610c1760006110f7565b565b33610c22610d80565b6001600160a01b031614610c485760405162461bcd60e51b815260040161042b906115d0565b6007805460ff19166001179055565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166384c4bd4b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca757600080fd5b505afa158015610cbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdf9190611605565b600560009054906101000a90046001600160a01b03166001600160a01b031663817b1cd26040518163ffffffff1660e01b815260040160206040518083038186803b158015610d2d57600080fd5b505afa158015610d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d659190611605565b610d7190612710611547565b610d7b9190611566565b905090565b6001546001600160a01b031690565b6001600160a01b0381166000908152600960205260408120548190663b548fbfbfc00090610dcd90600160201b90046001600160401b03164261161e565b6001600160a01b038516600090815260096020526040902054610dff916001600160401b03169063ffffffff16611547565b610e099190611547565b9392505050565b60075460ff1615610e335760405162461bcd60e51b815260040161042b90611588565b610e3e828233610916565b5050565b33610e4b610d80565b6001600160a01b031614610e715760405162461bcd60e51b815260040161042b906115d0565b6005546001600160a01b031615610eb75760405162461bcd60e51b815260206004820152600a602482015269185b1c9958591e5cd95d60b21b604482015260640161042b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b33610ee2610d80565b6001600160a01b031614610f085760405162461bcd60e51b815260040161042b906115d0565b6001600160a01b038116610f6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042b565b610f76816110f7565b50565b6000610f8482610d8f565b6001600160a01b038316600090815260096020526040902080549192508291600c90610fc1908490600160601b90046001600160801b031661163e565b82546101009290920a6001600160801b0381810219909316919092169190910217905550506001600160a01b031660009081526009602052604090208054600160201b600160601b031916600160201b426001600160401b031602179055565b6001600160a01b03821660009081526009602052604081205461104c9060019063ffffffff166114c3565b60008381526008602052604090205463ffffffff9190911691508082146110aa576001600160a01b03841660009081526009602090815260408083208584526001018252808320548484528184208190558352600890915290208190555b506000918252600860209081526040808420848155600190810180546001600160a01b03191690556001600160a01b03959095168452600982528084209284529190930190925290812055565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381168114610f7657600080fd5b60006020828403121561117057600080fd5b8135610e0981611149565b60008060008060006080868803121561119357600080fd5b853561119e81611149565b945060208601356111ae81611149565b93506040860135925060608601356001600160401b03808211156111d157600080fd5b818801915088601f8301126111e557600080fd5b8135818111156111f457600080fd5b89602082850101111561120657600080fd5b9699959850939650602001949392505050565b6000806040838503121561122c57600080fd5b823561123781611149565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b8181101561127d57835183529284019291840191600101611261565b50909695505050505050565b60008083601f84011261129b57600080fd5b5081356001600160401b038111156112b257600080fd5b6020830191508360208260051b85010111156112cd57600080fd5b9250929050565b6000806000604084860312156112e957600080fd5b83356001600160401b038111156112ff57600080fd5b61130b86828701611289565b9094509250506020840135801515811461132457600080fd5b809150509250925092565b60008060006040848603121561134457600080fd5b83356001600160401b0381111561135a57600080fd5b61136686828701611289565b909450925050602084013561132481611149565b60006020828403121561138c57600080fd5b5035919050565b600080602083850312156113a657600080fd5b82356001600160401b038111156113bc57600080fd5b6113c885828601611289565b90969095509350505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156113fd576113fd6113d4565b500190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600019821415611442576114426113d4565b5060010190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561149257600080fd5b813563ffffffff81168114610e0957600080fd5b6000602082840312156114b857600080fd5b8151610e0981611149565b600063ffffffff838116908316818110156114e0576114e06113d4565b039392505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600063ffffffff80831681811415611526576115266113d4565b6001019392505050565b600082821015611542576115426113d4565b500390565b6000816000190483118215151615611561576115616113d4565b500290565b60008261158357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526006908201526514185d5cd95960d21b604082015260600190565b600063ffffffff8083168185168083038211156115c7576115c76113d4565b01949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561161757600080fd5b5051919050565b60006001600160401b03838116908316818110156114e0576114e06113d4565b60006001600160801b038281168482168083038211156115c7576115c76113d456fea2646970667358221220b4f30df2c82f32f88f5b7a54033588cbc7eda10d94d821baa5fea64e30735eee64736f6c63430008090033000000000000000000000000b6945b73ed554df8d52ecdf1ab08f17564386e0f000000000000000000000000650a9960673688ba924615a2d28c39a8e015fb19000000000000000000000000895a6f444be4ba9d124f61df736605792b35d66b

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

000000000000000000000000b6945b73ed554df8d52ecdf1ab08f17564386e0f000000000000000000000000650a9960673688ba924615a2d28c39a8e015fb19000000000000000000000000895a6f444be4ba9d124f61df736605792b35d66b

-----Decoded View---------------
Arg [0] : _impishspiral (address): 0xb6945b73ed554df8d52ecdf1ab08f17564386e0f
Arg [1] : _spiralbits (address): 0x650a9960673688ba924615a2d28c39a8e015fb19
Arg [2] : _rwnft (address): 0x895a6f444be4ba9d124f61df736605792b35d66b

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b6945b73ed554df8d52ecdf1ab08f17564386e0f
Arg [1] : 000000000000000000000000650a9960673688ba924615a2d28c39a8e015fb19
Arg [2] : 000000000000000000000000895a6f444be4ba9d124f61df736605792b35d66b


Deployed ByteCode Sourcemap

546:9415:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2564:155;;;;;;:::i;:::-;;:::i;:::-;;;548:25:8;;;536:2;521:18;2564:155:6;;;;;;;;1050:33;;;;;-1:-1:-1;;;;;1050:33:6;;;;;;-1:-1:-1;;;;;769:32:8;;;751:51;;739:2;724:18;1050:33:6;584:224:8;9615:344:6;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;1916:33:8;;;1898:52;;1886:2;1871:18;9615:344:6;1754:202:8;755:60:6;;803:12;755:60;;7059:262;;;;;;:::i;:::-;;:::i;6510:470::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4363:1301::-;;;;;;:::i;:::-;;:::i;:::-;;1460:26;;;;;;;;;;;;4055:14:8;;4048:22;4030:41;;4018:2;4003:18;1460:26:6;3890:187:8;3340:929:6;;;;;;:::i;:::-;;:::i;1661:101:5:-;;;:::i;1185:26:6:-;;;;;;1548:64;;;:::i;2725:156::-;;;:::i;6279:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6279:56:6;;;;;;;5016:25:8;;;-1:-1:-1;;;;;5077:32:8;;;5072:2;5057:18;;5050:60;4989:18;6279:56:6;4842:274:8;1029:85:5;;;:::i;2240:314:6:-;;;;;;:::i;:::-;;:::i;1089:37::-;;;;;-1:-1:-1;;;;;1089:37:6;;;3031:122;;;;;;:::i;:::-;;:::i;961:29::-;;;;;-1:-1:-1;;;;;961:29:6;;;6399:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;6399:48:6;;-1:-1:-1;;;;;6399:48:6;;-1:-1:-1;;;6399:48:6;;-1:-1:-1;;;;;6399:48:6;;;;;;;6456:10:8;6444:23;;;6426:42;;-1:-1:-1;;;;;6504:31:8;;;6499:2;6484:18;;6477:59;-1:-1:-1;;;;;6572:32:8;6552:18;;;6545:60;6414:2;6399:18;:48:6;6228:383:8;869:35:6;;;;;-1:-1:-1;;;;;869:35:6;;;1699:220;;;;;;:::i;:::-;;:::i;1911:198:5:-;;;;;;:::i;:::-;;:::i;2564:155:6:-;-1:-1:-1;;;;;2677:17:6;;2628:7;2677:17;;;:10;:17;;;;;:35;-1:-1:-1;;;2677:35:6;;-1:-1:-1;;;;;2677:35:6;2654:20;2677:17;2654:13;:20::i;:::-;:58;;;;:::i;:::-;2647:65;2564:155;-1:-1:-1;;2564:155:6:o;9615:344::-;9809:13;;9705:6;;-1:-1:-1;;;;;9809:13:6;9787:10;:36;9779:67;;;;-1:-1:-1;;;9779:67:6;;7313:2:8;9779:67:6;;;7295:21:8;7352:2;7332:18;;;7325:30;-1:-1:-1;;;7371:18:8;;;7364:48;7429:18;;9779:67:6;;;;;;;;;-1:-1:-1;;;;9615:344:6;;;;;;;:::o;7059:262::-;-1:-1:-1;;;;;7182:17:6;;7147:7;7182:17;;;:10;:17;;;;;:31;;;7174:39;;7166:95;;;;-1:-1:-1;;;7166:95:6;;7660:2:8;7166:95:6;;;7642:21:8;7699:2;7679:18;;;7672:30;7738:34;7718:18;;;7711:62;-1:-1:-1;;;7789:18:8;;;7782:41;7840:19;;7166:95:6;7458:407:8;7166:95:6;-1:-1:-1;;;;;;7278:17:6;;;;;;;;:10;:17;;;;;;;;:36;;;:29;;;;:36;;;;;7059:262::o;6510:470::-;-1:-1:-1;;;;;6627:18:6;;6606;6627;;;:10;:18;;;;;:32;6578:16;;6627:32;;6674:15;6670:106;;6749:16;;;6763:1;6749:16;;;;;;;;;;;-1:-1:-1;6742:23:6;6510:470;-1:-1:-1;;;6510:470:6:o;6670:106::-;6786:23;6826:10;-1:-1:-1;;;;;6812:25:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6812:25:6;;6786:51;;6852:9;6847:104;6867:10;6863:1;:14;6847:104;;;6910:30;6930:6;6938:1;6910:19;:30::i;:::-;6898:6;6905:1;6898:9;;;;;;;;:::i;:::-;;;;;;;;;;:42;6879:3;;;;:::i;:::-;;;;6847:104;;4363:1301;1744:1:7;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:7;;;;;;;:::i;:::-;1744:1;2455:7;:18;4518:28:6::1;4535:10;4518:16;:28::i;:::-;4562:8;4557:668;4576:19;::::0;::::1;::::0;-1:-1:-1;4557:668:6::1;;;4616:15;4642:8;;4651:1;4642:11;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4676:13;::::0;:30:::1;::::0;-1:-1:-1;;;4676:30:6;;4634:20:::1;::::0;;;::::1;4676:30;::::0;::::1;548:25:8::0;;;4634:20:6;-1:-1:-1;4718:4:6::1;::::0;-1:-1:-1;;;;;4676:13:6;;::::1;::::0;:21:::1;::::0;521:18:8;;4676:30:6::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4676:47:6::1;;4668:69;;;::::0;-1:-1:-1;;;4668:69:6;;9373:2:8;4668:69:6::1;::::0;::::1;9355:21:8::0;9412:1;9392:18;;;9385:29;-1:-1:-1;;;9430:18:8;;;9423:39;9479:18;;4668:69:6::1;9171:332:8::0;4668:69:6::1;4759:26;::::0;;;:17:::1;:26;::::0;;;;:32:::1;;::::0;-1:-1:-1;;;;;4759:32:6::1;4795:10;4759:46;4751:67;;;::::0;-1:-1:-1;;;4751:67:6;;9710:2:8;4751:67:6::1;::::0;::::1;9692:21:8::0;9749:1;9729:18;;;9722:29;-1:-1:-1;;;9767:18:8;;;9760:38;9815:18;;4751:67:6::1;9508:331:8::0;4751:67:6::1;4919:53;4952:10;4964:7;4919:32;:53::i;:::-;5055:10;5044:22;::::0;;;:10:::1;:22;::::0;;;;:41;;5084:1:::1;::::0;5044:22;:41:::1;::::0;5084:1;;5044:41:::1;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;5148:13:6::1;::::0;:66:::1;::::0;-1:-1:-1;;;5148:66:6;;-1:-1:-1;;;;;5148:13:6;;::::1;::::0;:30:::1;::::0;:66:::1;::::0;5187:4:::1;::::0;5194:10:::1;::::0;5206:7;;5148:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4602:623;4597:3;;;;;:::i;:::-;;;;4557:668;;;;5249:8;;:15;;5234:11;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;5275:383:6;::::1;;;5341:10;5303:24;5330:22:::0;;;:10:::1;:22;::::0;;;;:40;;-1:-1:-1;;;;;;;;5384:44:6;::::1;::::0;;;-1:-1:-1;;;5330:40:6;::::1;-1:-1:-1::0;;;;;5330:40:6::1;::::0;5501:5:::1;5478:20;:18;:20::i;:::-;5459:39;::::0;:16;:39:::1;:::i;:::-;:47;;;;:::i;:::-;5584:10;::::0;5443:63;;-1:-1:-1;;;;;;5584:10:6::1;:25;5610:10;5622:24;5443:63:::0;5622:16;:24:::1;:::i;:::-;5584:63;::::0;-1:-1:-1;;;;;;5584:63:6::1;::::0;;;;;;-1:-1:-1;;;;;11373:32:8;;;5584:63:6::1;::::0;::::1;11355:51:8::0;11422:18;;;11415:34;11328:18;;5584:63:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5289:369;;5275:383;-1:-1:-1::0;;1701:1:7;2628:7;:22;-1:-1:-1;4363:1301:6:o;3340:929::-;1744:1:7;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:7;;;;;;;:::i;:::-;1744:1;2455:7;:18;1658:6:6::1;::::0;::::1;;1657:7;1649:26;;;;-1:-1:-1::0;;;1649:26:6::1;;;;;;;:::i;:::-;3458:19:::0;3450:40:::2;;;::::0;-1:-1:-1;;;3450:40:6;;11996:2:8;3450:40:6::2;::::0;::::2;11978:21:8::0;12035:1;12015:18;;;12008:29;-1:-1:-1;;;12053:18:8;;;12046:38;12101:18;;3450:40:6::2;11794:331:8::0;3450:40:6::2;3559:23;3576:5;3559:16;:23::i;:::-;3608:8;;:15;;3593:11;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;3638:8:6::2;::::0;-1:-1:-1;3633:630:6::2;3648:19;::::0;::::2;::::0;-1:-1:-1;3633:630:6::2;;;3688:15;3714:8;;3723:1;3714:11;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3748:13;::::0;:30:::2;::::0;-1:-1:-1;;;3748:30:6;;3706:20:::2;::::0;;;::::2;3748:30;::::0;::::2;548:25:8::0;;;3706:20:6;-1:-1:-1;3782:10:6::2;::::0;-1:-1:-1;;;;;3748:13:6;;::::2;::::0;:21:::2;::::0;521:18:8;;3748:30:6::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3748:44:6::2;;3740:69;;;::::0;-1:-1:-1;;;3740:69:6;;12332:2:8;3740:69:6::2;::::0;::::2;12314:21:8::0;12371:2;12351:18;;;12344:30;-1:-1:-1;;;12390:18:8;;;12383:42;12442:18;;3740:69:6::2;12130:336:8::0;3740:69:6::2;-1:-1:-1::0;;;;;7718:17:6;;7701:14;7718:17;;;:10;:17;;;;;;;;:31;;;;;;7759:37;;;7718:31;7759:29;;;:37;;;;;:47;;;7816:26;;;:17;:26;;;;;:52;;;3963:32;::::2;:40:::0;;-1:-1:-1;;;;;;3963:40:6::2;::::0;::::2;::::0;;4070:17;;;;;;;:36;;7718:31;;:17;;7701:14;4070:36:::2;::::0;7718:31;;4070:36:::2;;:::i;:::-;::::0;;::::2;::::0;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;;::::2;;::::0;;::::2;;::::0;;-1:-1:-1;4186:13:6::2;::::0;:66:::2;::::0;-1:-1:-1;;;4186:66:6;;-1:-1:-1;;;;;4186:13:6;;::::2;::::0;:30:::2;::::0;:66:::2;::::0;4217:10:::2;::::0;4237:4:::2;::::0;4244:7;;4186:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;3674:589;3669:3;;;;;:::i;:::-;;;;3633:630;;;-1:-1:-1::0;;1701:1:7;2628:7;:22;-1:-1:-1;;3340:929:6:o;1661:101:5:-;719:10:0;1241:7:5;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:5;;1233:68;;;;-1:-1:-1;;;1233:68:5;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1548:64:6:-;719:10:0;1241:7:5;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:5;;1233:68;;;;-1:-1:-1;;;1233:68:5;;;;;;;:::i;:::-;1592:6:6::1;:13:::0;;-1:-1:-1;;1592:13:6::1;1601:4;1592:13;::::0;;1548:64::o;2725:156::-;2776:7;2844:12;;;;;;;;;-1:-1:-1;;;;;2844:12:6;-1:-1:-1;;;;;2844:28:6;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2814:13;;;;;;;;;-1:-1:-1;;;;;2814:13:6;-1:-1:-1;;;;;2814:25:6;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2802:39;;:9;:39;:::i;:::-;:72;;;;:::i;:::-;2795:79;;2725:156;:::o;1029:85:5:-;1101:6;;-1:-1:-1;;;;;1101:6:5;;1029:85::o;2240:314:6:-;-1:-1:-1;;;;;2435:17:6;;2299:7;2435:17;;;:10;:17;;;;;:31;2299:7;;803:12;;2409:57;;-1:-1:-1;;;2435:31:6;;-1:-1:-1;;;;;2435:31:6;2416:15;2409:57;:::i;:::-;-1:-1:-1;;;;;2346:17:6;;;;;;:10;:17;;;;;:31;:121;;-1:-1:-1;;;;;2401:66:6;;2346:31;;:121;:::i;:::-;:166;;;;:::i;:::-;2318:194;2240:314;-1:-1:-1;;;2240:314:6:o;3031:122::-;1658:6;;;;1657:7;1649:26;;;;-1:-1:-1;;;1649:26:6;;;;;;;:::i;:::-;3107:39:::1;3125:8;;3135:10;3107:17;:39::i;:::-;3031:122:::0;;:::o;1699:220::-;719:10:0;1241:7:5;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:5;;1233:68;;;;-1:-1:-1;;;1233:68:5;;;;;;;:::i;:::-;1794:13:6::1;::::0;-1:-1:-1;;;;;1794:13:6::1;:45:::0;1786:68:::1;;;::::0;-1:-1:-1;;;1786:68:6;;13690:2:8;1786:68:6::1;::::0;::::1;13672:21:8::0;13729:2;13709:18;;;13702:30;-1:-1:-1;;;13748:18:8;;;13741:40;13798:18;;1786:68:6::1;13488:334:8::0;1786:68:6::1;1864:13;:48:::0;;-1:-1:-1;;;;;;1864:48:6::1;-1:-1:-1::0;;;;;1864:48:6;;;::::1;::::0;;;::::1;::::0;;1699:220::o;1911:198:5:-;719:10:0;1241:7:5;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:5;;1233:68;;;;-1:-1:-1;;;1233:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:5;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:5;;14029:2:8;1991:73:5::1;::::0;::::1;14011:21:8::0;14068:2;14048:18;;;14041:30;14107:34;14087:18;;;14080:62;-1:-1:-1;;;14158:18:8;;;14151:36;14204:19;;1991:73:5::1;13827:402:8::0;1991:73:5::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1925:309:6:-;2028:25;2056:20;2070:5;2056:13;:20::i;:::-;-1:-1:-1;;;;;2095:17:6;;;;;;:10;:17;;;;;:65;;2028:48;;-1:-1:-1;2028:48:6;;2095:35;;:65;;2028:48;;-1:-1:-1;;;2095:65:6;;-1:-1:-1;;;;;2095:65:6;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;2095:65:6;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;2170:17:6;-1:-1:-1;2170:17:6;;;:10;:17;;;;;:57;;-1:-1:-1;;;;;;;;2170:57:6;-1:-1:-1;;;2211:15:6;-1:-1:-1;;;;;2170:57:6;;;;;1925:309::o;8492:1042::-;-1:-1:-1;;;;;8779:16:6;;8754:22;8779:16;;;:10;:16;;;;;:30;:34;;8812:1;;8779:30;;:34;:::i;:::-;8823:18;8844:26;;;:17;:26;;;;;:43;8754:59;;;;;;-1:-1:-1;8991:28:6;;;8987:360;;-1:-1:-1;;;;;9057:16:6;;9035:19;9057:16;;;:10;:16;;;;;;;;:44;;;:28;;:44;;;;;;9116:40;;;;;;:54;;;9242:30;;:17;:30;;;;;:60;;;8987:360;-1:-1:-1;9440:26:6;;;;:17;:26;;;;;;;;9433:33;;;;;;;;;-1:-1:-1;;;;;;9433:33:6;;;-1:-1:-1;;;;;9483:16:6;;;;;;:10;:16;;;;;:44;;;:28;;;;:44;;;;;;9476:51;8492:1042::o;2263:187:5:-;2355:6;;;-1:-1:-1;;;;;2371:17:5;;;-1:-1:-1;;;;;;2371:17:5;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;14:131:8:-;-1:-1:-1;;;;;89:31:8;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;813:936::-;910:6;918;926;934;942;995:3;983:9;974:7;970:23;966:33;963:53;;;1012:1;1009;1002:12;963:53;1051:9;1038:23;1070:31;1095:5;1070:31;:::i;:::-;1120:5;-1:-1:-1;1177:2:8;1162:18;;1149:32;1190:33;1149:32;1190:33;:::i;:::-;1242:7;-1:-1:-1;1296:2:8;1281:18;;1268:32;;-1:-1:-1;1351:2:8;1336:18;;1323:32;-1:-1:-1;;;;;1404:14:8;;;1401:34;;;1431:1;1428;1421:12;1401:34;1469:6;1458:9;1454:22;1444:32;;1514:7;1507:4;1503:2;1499:13;1495:27;1485:55;;1536:1;1533;1526:12;1485:55;1576:2;1563:16;1602:2;1594:6;1591:14;1588:34;;;1618:1;1615;1608:12;1588:34;1663:7;1658:2;1649:6;1645:2;1641:15;1637:24;1634:37;1631:57;;;1684:1;1681;1674:12;1631:57;813:936;;;;-1:-1:-1;813:936:8;;-1:-1:-1;1715:2:8;1707:11;;1737:6;813:936;-1:-1:-1;;;813:936:8:o;1961:315::-;2029:6;2037;2090:2;2078:9;2069:7;2065:23;2061:32;2058:52;;;2106:1;2103;2096:12;2058:52;2145:9;2132:23;2164:31;2189:5;2164:31;:::i;:::-;2214:5;2266:2;2251:18;;;;2238:32;;-1:-1:-1;;;1961:315:8:o;2281:632::-;2452:2;2504:21;;;2574:13;;2477:18;;;2596:22;;;2423:4;;2452:2;2675:15;;;;2649:2;2634:18;;;2423:4;2718:169;2732:6;2729:1;2726:13;2718:169;;;2793:13;;2781:26;;2862:15;;;;2827:12;;;;2754:1;2747:9;2718:169;;;-1:-1:-1;2904:3:8;;2281:632;-1:-1:-1;;;;;;2281:632:8:o;2918:366::-;2980:8;2990:6;3044:3;3037:4;3029:6;3025:17;3021:27;3011:55;;3062:1;3059;3052:12;3011:55;-1:-1:-1;3085:20:8;;-1:-1:-1;;;;;3117:30:8;;3114:50;;;3160:1;3157;3150:12;3114:50;3197:4;3189:6;3185:17;3173:29;;3257:3;3250:4;3240:6;3237:1;3233:14;3225:6;3221:27;3217:38;3214:47;3211:67;;;3274:1;3271;3264:12;3211:67;2918:366;;;;;:::o;3289:596::-;3380:6;3388;3396;3449:2;3437:9;3428:7;3424:23;3420:32;3417:52;;;3465:1;3462;3455:12;3417:52;3492:23;;-1:-1:-1;;;;;3527:30:8;;3524:50;;;3570:1;3567;3560:12;3524:50;3609:69;3670:7;3661:6;3650:9;3646:22;3609:69;:::i;:::-;3697:8;;-1:-1:-1;3583:95:8;-1:-1:-1;;3782:2:8;3767:18;;3754:32;3822:13;;3815:21;3805:32;;3795:60;;3851:1;3848;3841:12;3795:60;3874:5;3864:15;;;3289:596;;;;;:::o;4082:570::-;4176:6;4184;4192;4245:2;4233:9;4224:7;4220:23;4216:32;4213:52;;;4261:1;4258;4251:12;4213:52;4288:23;;-1:-1:-1;;;;;4323:30:8;;4320:50;;;4366:1;4363;4356:12;4320:50;4405:69;4466:7;4457:6;4446:9;4442:22;4405:69;:::i;:::-;4493:8;;-1:-1:-1;4379:95:8;-1:-1:-1;;4578:2:8;4563:18;;4550:32;4591:31;4550:32;4591:31;:::i;4657:180::-;4716:6;4769:2;4757:9;4748:7;4744:23;4740:32;4737:52;;;4785:1;4782;4775:12;4737:52;-1:-1:-1;4808:23:8;;4657:180;-1:-1:-1;4657:180:8:o;5561:435::-;5646:6;5654;5707:2;5695:9;5686:7;5682:23;5678:32;5675:52;;;5723:1;5720;5713:12;5675:52;5750:23;;-1:-1:-1;;;;;5785:30:8;;5782:50;;;5828:1;5825;5818:12;5782:50;5867:69;5928:7;5919:6;5908:9;5904:22;5867:69;:::i;:::-;5955:8;;5841:95;;-1:-1:-1;5561:435:8;-1:-1:-1;;;;5561:435:8:o;6846:127::-;6907:10;6902:3;6898:20;6895:1;6888:31;6938:4;6935:1;6928:15;6962:4;6959:1;6952:15;6978:128;7018:3;7049:1;7045:6;7042:1;7039:13;7036:39;;;7055:18;;:::i;:::-;-1:-1:-1;7091:9:8;;6978:128::o;7870:127::-;7931:10;7926:3;7922:20;7919:1;7912:31;7962:4;7959:1;7952:15;7986:4;7983:1;7976:15;8002:127;8063:10;8058:3;8054:20;8051:1;8044:31;8094:4;8091:1;8084:15;8118:4;8115:1;8108:15;8134:135;8173:3;-1:-1:-1;;8194:17:8;;8191:43;;;8214:18;;:::i;:::-;-1:-1:-1;8261:1:8;8250:13;;8134:135::o;8274:355::-;8476:2;8458:21;;;8515:2;8495:18;;;8488:30;8554:33;8549:2;8534:18;;8527:61;8620:2;8605:18;;8274:355::o;8634:276::-;8692:6;8745:2;8733:9;8724:7;8720:23;8716:32;8713:52;;;8761:1;8758;8751:12;8713:52;8800:9;8787:23;8850:10;8843:5;8839:22;8832:5;8829:33;8819:61;;8876:1;8873;8866:12;8915:251;8985:6;9038:2;9026:9;9017:7;9013:23;9009:32;9006:52;;;9054:1;9051;9044:12;9006:52;9086:9;9080:16;9105:31;9130:5;9105:31;:::i;9844:221::-;9883:4;9912:10;9972;;;;9942;;9994:12;;;9991:38;;;10009:18;;:::i;:::-;10046:13;;9844:221;-1:-1:-1;;;9844:221:8:o;10070:375::-;-1:-1:-1;;;;;10328:15:8;;;10310:34;;10380:15;;;;10375:2;10360:18;;10353:43;10427:2;10412:18;;10405:34;;;;10260:2;10245:18;;10070:375::o;10450:201::-;10488:3;10516:10;10561:2;10554:5;10550:14;10588:2;10579:7;10576:15;10573:41;;;10594:18;;:::i;:::-;10643:1;10630:15;;10450:201;-1:-1:-1;;;10450:201:8:o;10656:125::-;10696:4;10724:1;10721;10718:8;10715:34;;;10729:18;;:::i;:::-;-1:-1:-1;10766:9:8;;10656:125::o;10786:168::-;10826:7;10892:1;10888;10884:6;10880:14;10877:1;10874:21;10869:1;10862:9;10855:17;10851:45;10848:71;;;10899:18;;:::i;:::-;-1:-1:-1;10939:9:8;;10786:168::o;10959:217::-;10999:1;11025;11015:132;;11069:10;11064:3;11060:20;11057:1;11050:31;11104:4;11101:1;11094:15;11132:4;11129:1;11122:15;11015:132;-1:-1:-1;11161:9:8;;10959:217::o;11460:329::-;11662:2;11644:21;;;11701:1;11681:18;;;11674:29;-1:-1:-1;;;11734:2:8;11719:18;;11712:36;11780:2;11765:18;;11460:329::o;12471:228::-;12510:3;12538:10;12575:2;12572:1;12568:10;12605:2;12602:1;12598:10;12636:3;12632:2;12628:12;12623:3;12620:21;12617:47;;;12644:18;;:::i;:::-;12680:13;;12471:228;-1:-1:-1;;;;12471:228:8:o;12704:356::-;12906:2;12888:21;;;12925:18;;;12918:30;12984:34;12979:2;12964:18;;12957:62;13051:2;13036:18;;12704:356::o;13065:184::-;13135:6;13188:2;13176:9;13167:7;13163:23;13159:32;13156:52;;;13204:1;13201;13194:12;13156:52;-1:-1:-1;13227:16:8;;13065:184;-1:-1:-1;13065:184:8:o;13254:229::-;13293:4;-1:-1:-1;;;;;13390:10:8;;;;13360;;13412:12;;;13409:38;;;13427:18;;:::i;14234:238::-;14274:3;-1:-1:-1;;;;;14341:10:8;;;14371;;;14401:12;;;14393:21;;14390:47;;;14417:18;;:::i

Metadata Hash

b4f30df2c82f32f88f5b7a54033588cbc7eda10d94d821baa5fea64e30735eee
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.