Contract 0xCcbA0b2bc4BAbe4cbFb6bD2f1Edc2A9e86b7845f

 
Txn Hash
Method
Block
From
To
Value
0x03aad274a3f84989808588bb23d83ec0e4776b330818a5a1ddc926b3873a1155Mint156395782022-09-29 14:24:591 hr 7 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00127567 22.35165371
0x0957de26aad9fcf2f927f31e77fff46e1a8d2c6d9d589c557ac4feeeae12c586Mint156388342022-09-29 11:54:353 hrs 37 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00092082 17.00851955
0xbe52d976c3ba7a3e9acd8e0ed01e6279f0368843e7685346197962136f4d9020Mint156387362022-09-29 11:34:473 hrs 57 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00072289 12.6667349
0x27d4e6a1910eb753c6cfc2458c2608aa178ac9f380374622d489078df3b38871Mint156379612022-09-29 8:58:476 hrs 33 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00072004 13.29672642
0x177dcd21843cd9390107724b8e9082fe3953a1f8c53e914478167b6ea8ee3002Mint156374642022-09-29 7:19:118 hrs 12 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00074761 13.80277099
0x3d9dbd5cc2a06798c7822033c5c8859366982668033b76c129c7fb9e59a4ce9fMint156369172022-09-29 5:28:3510 hrs 3 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00067412 11.80869545
0xc1155dee08f6ef55c28afe459d8977c1a749a2de99b2b63ed1a87b990b1c8148Mint156368352022-09-29 5:12:1110 hrs 19 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00078795 14.54777355
0xa783491f0403bca789e4b5a4f04caff51bbdcd1139f100e4084607c1cf64efdaMint156368322022-09-29 5:11:3510 hrs 20 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00085425 15.77890818
0x73966069b0440f074fb1c2e6a1921e93773a0f8786eb49c48c0089e3592d1edeMint156361222022-09-29 2:48:5912 hrs 43 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00074632 13.07948818
0x9df6b746b21798794e1df698ac5189fa5682c913147c36a216fe15fc419e2541Mint156353032022-09-29 0:04:5915 hrs 27 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00092415 16.19193998
0x1abf6952bd8edc5abe77313f3fe69df1aff21af836c1ac261a41b558967d3b60Mint156351792022-09-28 23:40:1115 hrs 51 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00070161 12.29659688
0x237c7a678b47b38af8f57f76a3969fb67035a70e8b3cd91f1c727092b47d6696Mint156346842022-09-28 22:00:3517 hrs 31 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00116735 20.45304659
0xddc4c4bbd7c41144259b0872d2c1d0d7ebb49b243839a5dfd06cedf7168527a6Mint156346582022-09-28 21:55:2317 hrs 36 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.0017793 32.85814238
0xa96f4480e8748e935697276439328724597bbd5af43a2cc05fac4224c55db843Mint156345002022-09-28 21:23:3518 hrs 8 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00076852 14.19223834
0x25b128e902aa6d51fc548b98ba8e40548aa3a84c15285f85329f555d1574ee61Mint156342932022-09-28 20:41:5918 hrs 50 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00085604 15.00313968
0x3bbfcfeda8fa277adfd13b9dea1dac2848b460e2cfce8f415035a5562d0fb251Mint156337122022-09-28 18:44:5920 hrs 47 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00191919 33.63402384
0xd65ce844a26e477acce53627da1b173d1a30cb885e0cb41417459c29dd16447dMint156319982022-09-28 13:00:591 day 2 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00095959 17.71645787
0xb569c6f13779e4a98fd37956c699d1c844ee4ba33e54ecc59399463eba5ee737Mint156311732022-09-28 10:14:471 day 5 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00069187 12.11965352
0x79d82213949c8a9fd647498a0eea141cded46beb981ef8c8c7c8bc03f2147e10Mint156311702022-09-28 10:14:111 day 5 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00074261 13.01232716
0x4941e005905084e5ef87af0f0a2c9c13fc803ad8d8c83a03f779301a17930166Mint156305452022-09-28 8:08:591 day 7 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00085121 14.91658777
0x5cec48269823b8cc6bdce1f5db3778f631260367fd352cf2110dd91b289dd168Mint156302442022-09-28 7:08:351 day 8 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.001042 18.26504383
0xf5efe41c47011e181c820cde667fd17dbb9522c6f262c06d2ae32ed25dd9eabcMint156302252022-09-28 7:04:471 day 8 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00083076 14.56004702
0x017ace2ed9695a9eb425f4f1ddbb35a8701fb00bdc9a8ed9b05f6aafaba63eb6Mint156293812022-09-28 4:14:471 day 11 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00087155 15.27353897
0x3b49abe12fa43972f9a02fa7e3047bf92166310d6c6d17ff079757f6cb879710Mint156280722022-09-27 23:50:591 day 15 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00064279 11.2622741
0x0459d7e7f98231cfd7b4b95846e39df93112f34b43aed9e0d412b6dc5abb2dd3Mint156278882022-09-27 23:14:111 day 16 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xccba0b2bc4babe4cbfb6bd2f1edc2a9e86b7845f0 Ether0.00072594 13.40289062
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WinterToken

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 5: WinterToken.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.5;


import "./ERC20.sol";
import "./ERC918.sol";
import "./Owned.sol";
import "./ApproveAndCallFallBack.sol";


// ----------------------------------------------------------------------------

// 'Winter Token' contract

// ERC20 & ERC918 Mineable Token using Proof Of Work

// Symbol      : WINTER

// Name        : Winter Token

// Total supply: 33,112,800.00

// Decimals    : 18

// Initial mining reward: 105

// Fraction of total supply released before first halving: 1/2

// ----------------------------------------------------------------------------





contract WinterToken is ERC20Interface, ERC918, Owned {

    string private constant SYMBOL = "WINTER";

    string private constant NAME = "Winter Token";

    uint256 public constant TOKEN_IDENTIFIER = 4;

    uint8 public constant DECIMALS = 18;

    uint256 public constant TOTAL_SUPPLY = 33112800 * 10**18;

    uint256 public constant INITIAL_REWARD = 105 * 10**18;

    uint256 public constant MAX_REWARDS_AVAILABLE = 72; // no more than 72 rewards per mint

    uint256 public constant REWARD_INTERVAL = 600; // rewards every ten minutes on average

    uint256 public constant DURATION_OF_FIRST_ERA = (365 * 24 * 60 * 60 * 3); // 36 months

    uint256 public constant DURATION_OF_ERA = 3 * 365 * 24 * 60 * 60; // three years

    uint256 public constant MINIMUM_TARGET = 2**16;

    uint256 public constant MAXIMUM_TARGET = 2**234;

    uint256 public immutable contractCreationTime;

    uint256 public lastRewardBlockTime;

    uint256 public maxNumberOfRewardsPerMint;

    bytes32 private challengeNumber;
        
    uint256 private miningTarget;

    uint256 public tokensMinted;

    mapping(address => uint256) internal balances;

    mapping(address => mapping(address => uint256)) internal allowed;


    constructor() {

        miningTarget = MAXIMUM_TARGET / 2**19;

        contractCreationTime = block.timestamp;
        lastRewardBlockTime = block.timestamp;

        maxNumberOfRewardsPerMint = 1;

        challengeNumber = _getNewChallengeNumber(0);

    }

    function name() public pure returns (string memory) {
        return NAME;
    }

    function symbol() public pure returns (string memory) {
        return SYMBOL;
    }

    function mint(uint256 nonce) override public returns (bool success) {

        uint256 _lastRewardBlockTime = lastRewardBlockTime;
        
        uint256 singleRewardAmount = _getMiningReward(_lastRewardBlockTime);

        // no more minting when reward reaches zero
        if (singleRewardAmount == 0) revert("Reward has reached zero");

        // the PoW must contain work that includes the challenge number and the msg.sender's address
        bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

        uint256 _miningTarget = miningTarget;
        // the digest must be smaller than the target
        if (uint256(digest) > _miningTarget) revert("Digest is larger than mining target");

        uint256 _previousMaxNumberOfRewards = maxNumberOfRewardsPerMint;
        uint256 numberOfRewardsToGive = _numberOfRewardsToGive(_miningTarget / uint256(digest), 
                                                               _lastRewardBlockTime,
                                                               _previousMaxNumberOfRewards,
                                                               block.timestamp);
        uint256 totalRewardAmount = singleRewardAmount * numberOfRewardsToGive;

        uint256 _tokensMinted = _giveRewards(totalRewardAmount);
        
        _setNextMaxNumberOfRewards(numberOfRewardsToGive, _previousMaxNumberOfRewards);

        miningTarget = _adjustDifficulty(_miningTarget, _lastRewardBlockTime,
                                         numberOfRewardsToGive, block.timestamp);

        bytes32 newChallengeNumber = _getNewChallengeNumber(_tokensMinted);
        challengeNumber = newChallengeNumber;

        lastRewardBlockTime = block.timestamp;

        emit Mint(msg.sender, totalRewardAmount, _scheduledNumberOfRewards(block.timestamp), 
                  newChallengeNumber);

        return true;
    }

    function _numberOfRewardsAvailable(uint256 _lastRewardBlockTime, 
                                       uint256 _previousMaxNumberOfRewards, 
                                       uint256 currentTime) internal pure returns (uint256) {

        uint256 numberAvailable = _previousMaxNumberOfRewards;
        uint256 intervalsSinceLastReward = (currentTime - _lastRewardBlockTime) / REWARD_INTERVAL;
        
        if (intervalsSinceLastReward > numberAvailable)
            numberAvailable = intervalsSinceLastReward;

        if (numberAvailable > MAX_REWARDS_AVAILABLE)
            numberAvailable = MAX_REWARDS_AVAILABLE;

        return numberAvailable;
    }

    function _numberOfRewardsToGive(uint256 numberEarned, uint256 _lastRewardBlockTime, 
                                    uint256 _previousMaxNumberOfRewards,
                                    uint256 currentTime) internal pure returns (uint256) {

        uint256 numberAvailable = _numberOfRewardsAvailable(_lastRewardBlockTime,
                                                         _previousMaxNumberOfRewards,
                                                         currentTime);
        if (numberEarned < numberAvailable)
            return numberEarned;

        return numberAvailable;
    }

    function _giveRewards(uint256 totalReward) internal returns (uint256) {

        balances[msg.sender] += totalReward;
        uint256 _tokensMinted = tokensMinted + totalReward;
        tokensMinted = _tokensMinted;
        return _tokensMinted;
    }

    function _setNextMaxNumberOfRewards(uint256 numberOfRewardsGivenNow, 
                                        uint256 _previousMaxNumberOfRewards) internal {

        // the value of the rewards given to this miner presumably exceed the gas costs
        // for processing the transaction. the next miner can submit a proof of enough work
        // to claim up to the same number of rewards immediately, or, if gas costs have increased,
        // wait until the maximum number of rewards claimable has increased enough to overcome
        // the costs.

        if (numberOfRewardsGivenNow != _previousMaxNumberOfRewards)
            maxNumberOfRewardsPerMint = numberOfRewardsGivenNow;
    }

    // backwards compatible mint function
    function mint(uint256 _nonce, bytes32 _challengeDigest) external returns (bool) {

        bytes32 digest = keccak256(abi.encodePacked(challengeNumber, msg.sender, _nonce));
        require(digest == _challengeDigest, "Challenge digest does not match expected digest on token contract");
        
        return mint(_nonce);
    }

    function _getNewChallengeNumber(uint256 _tokensMinted) internal view returns (bytes32) {
        
        // make the latest ethereum block hash a part of the next challenge

        // xor with a number unique to this token to avoid merged mining
        
        // xor with the number of tokens minted to ensure that the challenge changes
        // even if there are multiple mints in the same ethereum block
        
        return bytes32(uint256(blockhash(block.number - 1)) ^ _tokensMinted ^ TOKEN_IDENTIFIER);
    }


    function _scheduledNumberOfRewards(uint256 currentTime) internal view returns (uint256) {
        return (currentTime - contractCreationTime) / REWARD_INTERVAL;
    }

    function _adjustDifficulty(uint256 _miningTarget, 
                               uint256 _lastRewardBlockTime, 
                               uint256 rewardsGivenNow,
                               uint256 currentTime) internal pure returns (uint256){

        uint256 timeSinceLastReward = currentTime - _lastRewardBlockTime;

        // we target a median interval of 10 minutes multiplied by log(2) ~ 61/88 
        // this gives a mean interval of 10 minutes per reward

        if (timeSinceLastReward * 88 < rewardsGivenNow * REWARD_INTERVAL * 61)
            _miningTarget = (_miningTarget * 99) / 100;   // slow down
        else
            _miningTarget = (_miningTarget * 100) / 99;   // speed up

        if (_miningTarget < MINIMUM_TARGET)
            _miningTarget = MINIMUM_TARGET;
        
        if (_miningTarget > MAXIMUM_TARGET) 
            _miningTarget = MAXIMUM_TARGET;

        return _miningTarget;
    }


    function rewardEra(uint256 _time) public view returns (uint256) {

        uint256 timeSinceContractCreation = _time - contractCreationTime;

        if (timeSinceContractCreation < DURATION_OF_FIRST_ERA)
            return 0;
        else
            return 1 + (timeSinceContractCreation - DURATION_OF_FIRST_ERA) / DURATION_OF_ERA;
    }

    function getAdjustmentInterval() public view override returns (uint256) {
        return REWARD_INTERVAL * maxNumberOfRewardsPerMint;
    }

    function getChallengeNumber() public view override returns (bytes32) {
        return challengeNumber;
    }

    function getMiningDifficulty() public view override returns (uint256) {
        // 64 f's:         1234567890123456789012345678901234567890123456789012345678901234
        uint256 maxInt = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
        return maxInt / miningTarget;
    }

    function getMiningTarget() public view override returns (uint256) {
       return miningTarget;
   }

    function getMiningReward() public view override returns (uint256) {

        // use the timestamp of the ethereum block that gave the last reward
        // because ethereum miners can manipulate the value of block.timestamp
        return _getMiningReward(lastRewardBlockTime);
    }

    function _getMiningReward(uint256 _time) internal view returns (uint256) {
        return INITIAL_REWARD / 2**rewardEra(_time);
    }

    function getNumberOfRewardsAvailable(uint256 currentTime) external view returns (uint256) {
        return _numberOfRewardsAvailable(lastRewardBlockTime, 
                                         maxNumberOfRewardsPerMint, 
                                         currentTime);
    }

    function getRewardAmountForAchievingTarget(uint256 targetAchieved, uint256 currentTime) external view returns (uint256) {
        uint256 numberOfRewardsToGive = _numberOfRewardsToGive(miningTarget / targetAchieved, 
                                                               lastRewardBlockTime, 
                                                               maxNumberOfRewardsPerMint, 
                                                               currentTime);
        return _getMiningReward(currentTime) * numberOfRewardsToGive;
    }

    function decimals() public pure override returns (uint8) {
        return DECIMALS;
    }

    function totalSupply() public view override returns (uint256) {

        return tokensMinted;
    }


    // ------------------------------------------------------------------------

    // Get the token balance for account `tokenOwner`

    // ------------------------------------------------------------------------

    function balanceOf(address tokenOwner) public view override returns (uint256 balance) {

        return balances[tokenOwner];

    }



    // ------------------------------------------------------------------------

    // Transfer the balance from token owner's account to `to` account

    // - Owner's account must have sufficient balance to transfer

    // - 0 value transfers are allowed

    // ------------------------------------------------------------------------

    function transfer(address to, uint256 tokens) public override returns (bool success) {
        
        require(to != address(0) && to != address(this), "Invalid address");
        
        balances[msg.sender] = balances[msg.sender] - tokens;

        balances[to] = balances[to] + tokens;

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

        return true;

    }



    // ------------------------------------------------------------------------

    // Token owner can approve for `spender` to transferFrom(...) `tokens`

    // from the token owner's account

    //

    // Warning: This function is vulnerable to double-spend attacks and is

    // included for backwards compatibility. Use safeApprove instead.

    // ------------------------------------------------------------------------

    function approve(address spender, uint256 tokens) public override returns (bool success) {
        
        require(spender != address(0) && spender != address(this), "Invalid address");

        allowed[msg.sender][spender] = tokens;

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

        return true;

    }



    // ------------------------------------------------------------------------

    // Allow token owner to cancel the approval if the approved amount changes from its last

    // known value before this transaction is processed. This allows the owner to avoid 

    // unintentionally re-approving funds that have already been spent.

    // ------------------------------------------------------------------------

    function safeApprove(address spender, uint256 previousAllowance, uint256 newAllowance) external returns (bool success) {

        require(allowed[msg.sender][spender] == previousAllowance,
                "Current spender allowance does not match specified value");

        return approve(spender, newAllowance);
    }



    // ------------------------------------------------------------------------

    // Transfer `tokens` from the `from` account to the `to` account

    //

    // The calling account must already have sufficient tokens approve(...)-d

    // for spending from the `from` account and

    // - From account must have sufficient balance to transfer

    // - Spender must have sufficient allowance to transfer

    // - 0 value transfers are allowed

    // ------------------------------------------------------------------------

    function transferFrom(address from, address to, uint256 tokens) public override returns (bool success) {
        
        require(to != address(0) && to != address(this), "Invalid address");

        balances[from] = balances[from] - tokens;

        allowed[from][msg.sender] = allowed[from][msg.sender] - tokens;

        balances[to] = balances[to] + tokens;

        emit Transfer(from, to, tokens);

        return true;

    }



    // ------------------------------------------------------------------------

    // Returns the amount of tokens approved by the owner that can be

    // transferred to the spender's account

    // ------------------------------------------------------------------------

    function allowance(address tokenOwner, address spender) public view override returns (uint256 remaining){

        return allowed[tokenOwner][spender];

    }


    // ------------------------------------------------------------------------

    // Token owner can approve for `spender` to transferFrom(...) `tokens`

    // from the token owner's account. The `spender` contract function

    // `receiveApproval(...)` is then executed. This is vulnerable to double-spend attacks

    // when called directly, so it is declared internal and called by safeApproveAndCall

    // ------------------------------------------------------------------------

    function approveAndCall(address spender, uint256 tokens, bytes memory data) internal returns (bool success) {
        
        require(spender != address(0) && spender != address(this), "Invalid address");

        allowed[msg.sender][spender] = tokens;

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

        ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, address(this), data);

        return true;

    }


    // ------------------------------------------------------------------------

    // Allow safe approvals with calls to receiving contract

    // ------------------------------------------------------------------------

    function safeApproveAndCall(address spender, uint256 previousAllowance, 
                                uint256 newAllowance, bytes memory data) external returns (bool success) {

        require(allowed[msg.sender][spender] == previousAllowance,
                "Current spender allowance does not match specified value");

        return approveAndCall(spender, newAllowance, data);
    }


    // ------------------------------------------------------------------------

    // Owner can transfer out any accidentally sent ERC20 tokens

    // ------------------------------------------------------------------------

    function transferAnyERC20Token(address tokenAddress, uint256 tokens) external onlyOwner returns (bool success) {

        return ERC20Interface(tokenAddress).transfer(owner, tokens);

    }

}

File 1 of 5: ApproveAndCallFallBack.sol
    //SPDX-License-Identifier: MIT
    pragma solidity 0.8.5;



    // ----------------------------------------------------------------------------

    // Contract function to receive approval and execute function in one call

    // Borrowed from MiniMeToken

    // ----------------------------------------------------------------------------

    abstract contract ApproveAndCallFallBack {

        function receiveApproval(address from, uint256 tokens, address token, bytes memory data) public virtual ;

    }


File 2 of 5: ERC20.sol
    //SPDX-License-Identifier: MIT
    pragma solidity 0.8.5;


    // ----------------------------------------------------------------------------

    // ERC Token Standard #20 Interface

    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md

    // ----------------------------------------------------------------------------

    abstract contract ERC20Interface {

        function totalSupply() public view virtual returns (uint);

        function balanceOf(address tokenOwner) public view virtual returns (uint balance);

        function allowance(address tokenOwner, address spender) public view virtual returns (uint remaining);

        function transfer(address to, uint tokens) public virtual returns (bool success);

        function approve(address spender, uint tokens) public virtual returns (bool success);

        function transferFrom(address from, address to, uint tokens) public virtual returns (bool success);


        event Transfer(address indexed from, address indexed to, uint tokens);

        event Approval(address indexed tokenOwner, address indexed spender, uint tokens);

    }



File 3 of 5: ERC918.sol
    //SPDX-License-Identifier: MIT
    pragma solidity 0.8.5;


    // ----------------------------------------------------------------------------

    // ERC Token Standard #918 Interface

    // https://eips.ethereum.org/EIPS/eip-918

    // ----------------------------------------------------------------------------

    interface ERC918  {

        function mint(uint256 nonce) external returns (bool success);

        function getAdjustmentInterval() external view returns (uint);

        function getChallengeNumber() external view returns (bytes32);

        function getMiningDifficulty() external view returns (uint);

        function getMiningTarget() external view returns (uint);

        function getMiningReward() external view returns (uint);
       
        function decimals() external view returns (uint8);


        event Mint(address indexed from, uint rewardAmount, uint epochCount, bytes32 newChallengeNumber);
    }

File 4 of 5: Owned.sol
    //SPDX-License-Identifier: MIT
    pragma solidity 0.8.5;



    // ----------------------------------------------------------------------------

    // Owned contract

    // ----------------------------------------------------------------------------

    abstract contract Owned {

        address public owner;

        address public newOwner;


        event OwnershipTransferred(address indexed _from, address indexed _to);


        constructor() {

            owner = msg.sender;

        }


        modifier onlyOwner {

            require(msg.sender == owner);

            _;

        }


        function transferOwnership(address _newOwner) public onlyOwner {

            require(_newOwner != address(0), "Invalid address");

            newOwner = _newOwner;

        }

        function acceptOwnership() external {

            require(msg.sender == newOwner);

            emit OwnershipTransferred(owner, newOwner);

            owner = newOwner;

            newOwner = address(0);

        }

    }


Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION_OF_ERA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION_OF_FIRST_ERA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REWARDS_AVAILABLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_IDENTIFIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractCreationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getAdjustmentInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChallengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"currentTime","type":"uint256"}],"name":"getNumberOfRewardsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"targetAchieved","type":"uint256"},{"internalType":"uint256","name":"currentTime","type":"uint256"}],"name":"getRewardAmountForAchievingTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNumberOfRewardsPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes32","name":"_challengeDigest","type":"bytes32"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"rewardEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"previousAllowance","type":"uint256"},{"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"safeApprove","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"previousAllowance","type":"uint256"},{"internalType":"uint256","name":"newAllowance","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeApproveAndCall","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561001057600080fd5b50600080546001600160a01b0319163317905561003462080000600160ea1b610070565b600555426080819052600255600160035561004f6000610057565b6004556100b7565b6000600482610067600143610092565b40181892915050565b60008261008d57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156100b257634e487b7160e01b600052601160045260246000fd5b500390565b6080516115a2620000e16000396000818161047e01528181610bf4015261105e01526115a26000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806379ba50971161013b578063cea3e530116100b8578063ef08fc6e1161007c578063ef08fc6e14610363578063f2fde38b14610507578063f65036621461051a578063f77e180e1461052d578063f79875461461053757600080fd5b8063cea3e53014610479578063d390a1e4146104a0578063d4ee1d90146104a8578063dc39d06d146104bb578063dd62ed3e146104ce57600080fd5b80639fb68299116100ff5780639fb6829914610425578063a0712d6814610438578063a9059cbb1461044b578063aa3308bd1461045e578063c2d98c6e1461047157600080fd5b806379ba5097146103a95780638da5cb5b146103b35780638f759183146103de578063902d55a5146103f157806395d89b411461040357600080fd5b8063313ce567116101c95780634ef376281161018d5780634ef376281461035b57806357dd62fb146103635780635dbdda691461036e5780636de9f32b1461037757806370a082311461038057600080fd5b8063313ce5671461032b57806332e997081461033257806336bcf7d61461033a578063490203a71461034a5780634a1da80e1461035257600080fd5b806317da485f1161021057806317da485f146102db5780631801fbe5146102e357806318160ddd146102f657806323b872dd146102fe5780632e0f26251461031157600080fd5b8063031052f31461024d578063068a24951461026b57806306fdde031461028e578063095ea7b3146102bf5780630d97a2fb146102d2575b600080fd5b610258600160ea1b81565b6040519081526020015b60405180910390f35b61027e610279366004611190565b61053f565b6040519015158152602001610262565b60408051808201909152600c81526b2bb4b73a32b9102a37b5b2b760a11b60208201525b604051610262919061134c565b61027e6102cd366004611133565b6105a0565b61025860035481565b610258610645565b61027e6102f13660046112a0565b61065f565b600654610258565b61027e61030c3660046110f7565b610734565b610319601281565b60405160ff9091168152602001610262565b6012610319565b600554610258565b6102586805b12aefafa804000081565b610258610874565b61025860025481565b600454610258565b6102586305a39a8081565b61025861025881565b61025860065481565b61025861038e3660046110a9565b6001600160a01b031660009081526007602052604090205490565b6103b1610886565b005b6000546103c6906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b6102586103ec366004611287565b610901565b6102586a1b63e87c1f629e3f80000081565b6040805180820190915260068152652ba4a72a22a960d11b60208201526102b2565b6102586104333660046112a0565b610912565b61027e610446366004611287565b610948565b61027e610459366004611133565b610b14565b61025861046c366004611287565b610bec565b610258600481565b6102587f000000000000000000000000000000000000000000000000000000000000000081565b610258604881565b6001546103c6906001600160a01b031681565b61027e6104c9366004611133565b610c5b565b6102586104dc3660046110c4565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6103b16105153660046110a9565b610cf9565b61027e61052836600461115d565b610d58565b6102586201000081565b610258610da4565b3360009081526008602090815260408083206001600160a01b0388168452909152812054841461058a5760405162461bcd60e51b815260040161058190611388565b60405180910390fd5b610595858484610db6565b90505b949350505050565b60006001600160a01b038316158015906105c357506001600160a01b0383163014155b6105df5760405162461bcd60e51b81526004016105819061135f565b3360008181526008602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060015b92915050565b6005546000906000199061065990826113fd565b91505090565b6004546040805160208101929092526bffffffffffffffffffffffff193360601b169082015260548101839052600090819060740160405160208183030381529060405280519060200120905082811461072b5760405162461bcd60e51b815260206004820152604160248201527f4368616c6c656e67652064696765737420646f6573206e6f74206d617463682060448201527f657870656374656420646967657374206f6e20746f6b656e20636f6e747261636064820152601d60fa1b608482015260a401610581565b61059884610948565b60006001600160a01b0383161580159061075757506001600160a01b0383163014155b6107735760405162461bcd60e51b81526004016105819061135f565b6001600160a01b038416600090815260076020526040902054610797908390611529565b6001600160a01b03851660009081526007602090815260408083209390935560088152828220338352905220546107cf908390611529565b6001600160a01b03808616600090815260086020908152604080832033845282528083209490945591861681526007909152205461080e9083906113e5565b6001600160a01b0380851660008181526007602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108629086815260200190565b60405180910390a35060019392505050565b6000610881600254610ebe565b905090565b6001546001600160a01b0316331461089d57600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b600061063f60025460035484610ee7565b6000806109328460055461092691906113fd565b60025460035486610f27565b90508061093e84610ebe565b610598919061150a565b6002546000908161095882610ebe565b9050806109a75760405162461bcd60e51b815260206004820152601760248201527f526577617264206861732072656163686564207a65726f0000000000000000006044820152606401610581565b600454604080516020808201939093523360601b6bffffffffffffffffffffffff1916818301526054808201889052825180830390910181526074909101909152805191012060055480821115610a4c5760405162461bcd60e51b815260206004820152602360248201527f446967657374206973206c6172676572207468616e206d696e696e672074617260448201526219d95d60ea1b6064820152608401610581565b6003546000610a66610a5e85856113fd565b878442610f27565b90506000610a74828761150a565b90506000610a8182610f48565b9050610a8d8385610f8b565b610a9985898542610f9c565b6005556000610aa78261103b565b600481905542600281905590915033907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d908590610ae490611054565b604080519283526020830191909152810184905260600160405180910390a25060019a9950505050505050505050565b60006001600160a01b03831615801590610b3757506001600160a01b0383163014155b610b535760405162461bcd60e51b81526004016105819061135f565b33600090815260076020526040902054610b6e908390611529565b33600090815260076020526040808220929092556001600160a01b03851681522054610b9b9083906113e5565b6001600160a01b0384166000818152600760205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906106339086815260200190565b600080610c197f000000000000000000000000000000000000000000000000000000000000000084611529565b90506305a39a80811015610c305750600092915050565b6305a39a80610c3f8183611529565b610c4991906113fd565b610c549060016113e5565b9392505050565b600080546001600160a01b03163314610c7357600080fd5b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529084169063a9059cbb90604401602060405180830381600087803b158015610cc157600080fd5b505af1158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611265565b6000546001600160a01b03163314610d1057600080fd5b6001600160a01b038116610d365760405162461bcd60e51b81526004016105819061135f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526008602090815260408083206001600160a01b03871684529091528120548314610d9a5760405162461bcd60e51b815260040161058190611388565b61059884836105a0565b6000600354610258610881919061150a565b60006001600160a01b03841615801590610dd957506001600160a01b0384163014155b610df55760405162461bcd60e51b81526004016105819061135f565b3360008181526008602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3604051638f4ffcb160e01b81526001600160a01b03851690638f4ffcb190610e8290339087903090889060040161130f565b600060405180830381600087803b158015610e9c57600080fd5b505af1158015610eb0573d6000803e3d6000fd5b506001979650505050505050565b6000610ec982610bec565b610ed4906002611462565b61063f906805b12aefafa80400006113fd565b60008281610258610ef88786611529565b610f0291906113fd565b905081811115610f10578091505b6048821115610f1e57604891505b50949350505050565b600080610f35858585610ee7565b9050808610156105955785915050610598565b33600090815260076020526040812080548391908390610f699084906113e5565b9091555050600654600090610f7f9084906113e5565b60068190559392505050565b808214610f985760038290555b5050565b600080610fa98584611529565b9050610fb76102588561150a565b610fc290603d61150a565b610fcd82605861150a565b1015610ff1576064610fe087606361150a565b610fea91906113fd565b955061100b565b6063610ffe87606461150a565b61100891906113fd565b95505b6201000086101561101d576201000095505b600160ea1b86111561103157600160ea1b95505b5093949350505050565b600060048261104b600143611529565b40181892915050565b60006102586110837f000000000000000000000000000000000000000000000000000000000000000084611529565b61063f91906113fd565b80356001600160a01b03811681146110a457600080fd5b919050565b6000602082840312156110bb57600080fd5b610c548261108d565b600080604083850312156110d757600080fd5b6110e08361108d565b91506110ee6020840161108d565b90509250929050565b60008060006060848603121561110c57600080fd5b6111158461108d565b92506111236020850161108d565b9150604084013590509250925092565b6000806040838503121561114657600080fd5b61114f8361108d565b946020939093013593505050565b60008060006060848603121561117257600080fd5b61117b8461108d565b95602085013595506040909401359392505050565b600080600080608085870312156111a657600080fd5b6111af8561108d565b93506020850135925060408501359150606085013567ffffffffffffffff808211156111da57600080fd5b818701915087601f8301126111ee57600080fd5b81358181111561120057611200611556565b604051601f8201601f19908116603f0116810190838211818310171561122857611228611556565b816040528281528a602084870101111561124157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60006020828403121561127757600080fd5b81518015158114610c5457600080fd5b60006020828403121561129957600080fd5b5035919050565b600080604083850312156112b357600080fd5b50508035926020909101359150565b6000815180845260005b818110156112e8576020818501810151868301820152016112cc565b818111156112fa576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0385811682526020820185905283166040820152608060608201819052600090611342908301846112c2565b9695505050505050565b602081526000610c5460208301846112c2565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60208082526038908201527f43757272656e74207370656e64657220616c6c6f77616e636520646f6573206e60408201527f6f74206d61746368207370656369666965642076616c75650000000000000000606082015260800190565b600082198211156113f8576113f8611540565b500190565b60008261141a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561145a57816000190482111561144057611440611540565b8085161561144d57918102915b93841c9390800290611424565b509250929050565b6000610c5483836000826114785750600161063f565b816114855750600061063f565b816001811461149b57600281146114a5576114c1565b600191505061063f565b60ff8411156114b6576114b6611540565b50506001821b61063f565b5060208310610133831016604e8410600b84101617156114e4575081810a61063f565b6114ee838361141f565b806000190482111561150257611502611540565b029392505050565b600081600019048311821515161561152457611524611540565b500290565b60008282101561153b5761153b611540565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220675ac9516343bf5e254dc38eb10f6377b12932588d9091dacac9e60d7d6bc65a64736f6c63430008050033

Deployed ByteCode Sourcemap

616:16281:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1409:47;;-1:-1:-1;;;1409:47:4;;;;;5835:25:5;;;5823:2;5808:18;1409:47:4;;;;;;;;16079:391;;;;;;:::i;:::-;;:::i;:::-;;;5662:14:5;;5655:22;5637:41;;5625:2;5610:18;16079:391:4;5592:92:5;2108:80:4;2177:4;;;;;;;;;;;;-1:-1:-1;;;2177:4:4;;;;2108:80;;;;;;;:::i;12436:316::-;;;;;;:::i;:::-;;:::i;1556:40::-;;;;;;9048:300;;;:::i;6464:331::-;;;;;;:::i;:::-;;:::i;10825:99::-;10905:12;;10825:99;;14039:432;;;;;;:::i;:::-;;:::i;828:35::-;;861:2;828:35;;;;;8772:4:5;8760:17;;;8742:36;;8730:2;8715:18;828:35:4;8697:87:5;10730:89:4;861:2;10730:89;;9354:100;9436:12;;9354:100;;933:53;;974:12;933:53;;9460:284;;;:::i;1515:34::-;;;;;;8934:108;9020:15;;8934:108;;1270:64;;1312:22;1270:64;;1086:45;;1128:3;1086:45;;1684:27;;;;;;11148:132;;;;;;:::i;:::-;-1:-1:-1;;;;;11252:20:4;11217:15;11252:20;;;:8;:20;;;;;;;11148:132;802:218:3;;;:::i;:::-;;297:20;;;;;-1:-1:-1;;;;;297:20:3;;;;;;-1:-1:-1;;;;;4681:32:5;;;4663:51;;4651:2;4636:18;297:20:3;4618:102:5;9889:284:4;;;;;;:::i;:::-;;:::i;870:56::-;;909:17;870:56;;2194:84;2265:6;;;;;;;;;;;;-1:-1:-1;;;2265:6:4;;;;2194:84;;10179:545;;;;;;:::i;:::-;;:::i;2284:1893::-;;;;;;:::i;:::-;;:::i;11629:367::-;;;;;;:::i;:::-;;:::i;8444:339::-;;;;;;:::i;:::-;;:::i;777:44::-;;820:1;777:44;;1463:45;;;;;993:50;;1041:2;993:50;;328:23:3;;;;;-1:-1:-1;;;;;328:23:3;;;16705:189:4;;;;;;:::i;:::-;;:::i;14757:158::-;;;;;;:::i;:::-;-1:-1:-1;;;;;14879:19:4;;;14843:17;14879:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;14757:158;616:176:3;;;;;;:::i;:::-;;:::i;13179:319:4:-;;;;;;:::i;:::-;;:::i;1356:46::-;;1397:5;1356:46;;8789:139;;;:::i;16079:391::-;16284:10;16243:12;16276:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;16276:28:4;;;;;;;;;;:49;;16268:134;;;;-1:-1:-1;;;16268:134:4;;;;;;;:::i;:::-;;;;;;;;;16420:43;16435:7;16444:12;16458:4;16420:14;:43::i;:::-;16413:50;;16079:391;;;;;;;:::o;12436:316::-;12511:12;-1:-1:-1;;;;;12552:21:4;;;;;;:49;;-1:-1:-1;;;;;;12577:24:4;;12596:4;12577:24;;12552:49;12544:77;;;;-1:-1:-1;;;12544:77:4;;;;;;;:::i;:::-;12640:10;12632:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;12632:28:4;;;;;;;;;;;;:37;;;12685;5835:25:5;;;12632:28:4;;12640:10;12685:37;;5808:18:5;12685:37:4;;;;;;;;-1:-1:-1;12740:4:4;12436:316;;;;;:::o;9048:300::-;9329:12;;9109:7;;-1:-1:-1;;9237:66:4;9320:21;;9237:66;9320:21;:::i;:::-;9313:28;;;9048:300;:::o;6464:331::-;6599:15;;6582:53;;;;;;4338:19:5;;;;-1:-1:-1;;6616:10:4;4395:2:5;4391:15;4387:53;4373:12;;;4366:75;4457:12;;;4450:28;;;6538:4:4;;;;4494:12:5;;6582:53:4;;;;;;;;;;;;6572:64;;;;;;6555:81;;6664:16;6654:6;:26;6646:104;;;;-1:-1:-1;;;6646:104:4;;6993:2:5;6646:104:4;;;6975:21:5;7032:2;7012:18;;;7005:30;7071:34;7051:18;;;7044:62;7142:34;7122:18;;;7115:62;-1:-1:-1;;;7193:19:5;;;7186:32;7235:19;;6646:104:4;6965:295:5;6646:104:4;6776:12;6781:6;6776:4;:12::i;14039:432::-;14128:12;-1:-1:-1;;;;;14169:16:4;;;;;;:39;;-1:-1:-1;;;;;;14189:19:4;;14203:4;14189:19;;14169:39;14161:67;;;;-1:-1:-1;;;14161:67:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;14256:14:4;;;;;;:8;:14;;;;;;:23;;14273:6;;14256:23;:::i;:::-;-1:-1:-1;;;;;14239:14:4;;;;;;:8;:14;;;;;;;;:40;;;;14318:7;:13;;;;;14332:10;14318:25;;;;;;:34;;14346:6;;14318:34;:::i;:::-;-1:-1:-1;;;;;14290:13:4;;;;;;;:7;:13;;;;;;;;14304:10;14290:25;;;;;;;:62;;;;14378:12;;;;;:8;:12;;;;;:21;;14393:6;;14378:21;:::i;:::-;-1:-1:-1;;;;;14363:12:4;;;;;;;:8;:12;;;;;;;:36;;;;14415:26;;;;;;;;;;14434:6;5835:25:5;;5823:2;5808:18;;5790:76;14415:26:4;;;;;;;;-1:-1:-1;14459:4:4;14039:432;;;;;:::o;9460:284::-;9517:7;9700:37;9717:19;;9700:16;:37::i;:::-;9693:44;;9460:284;:::o;802:218:3:-;875:8;;-1:-1:-1;;;;;875:8:3;861:10;:22;853:31;;;;;;932:8;;;925:5;;904:37;;-1:-1:-1;;;;;932:8:3;;;;925:5;;;;904:37;;;964:8;;;;956:16;;-1:-1:-1;;;;;;956:16:3;;;-1:-1:-1;;;;;964:8:3;;956:16;;;;987:21;;;802:218::o;9889:284:4:-;9970:7;9996:170;10022:19;;10085:25;;10154:11;9996:25;:170::i;10179:545::-;10290:7;10309:29;10341:306;10379:14;10364:12;;:29;;;;:::i;:::-;10459:19;;10544:25;;10635:11;10341:22;:306::i;:::-;10309:338;;10696:21;10664:29;10681:11;10664:16;:29::i;:::-;:53;;;;:::i;2284:1893::-;2394:19;;2338:12;;;2461:38;2394:19;2461:16;:38::i;:::-;2432:67;-1:-1:-1;2566:23:4;2562:62;;2591:33;;-1:-1:-1;;;2591:33:4;;6641:2:5;2591:33:4;;;6623:21:5;6680:2;6660:18;;;6653:30;6719:25;6699:18;;;6692:53;6762:18;;2591:33:4;6613:173:5;2562:62:4;2781:15;;2764:52;;;;;;;4338:19:5;;;;2798:10:4;4395:2:5;4391:15;-1:-1:-1;;4387:53:5;4373:12;;;4366:75;4457:12;;;;4450:28;;;2764:52:4;;;;;;;;;;4494:12:5;;;;2764:52:4;;;2754:63;;;;;2852:12;;2932:31;;;2928:82;;;2965:45;;-1:-1:-1;;;2965:45:4;;7467:2:5;2965:45:4;;;7449:21:5;7506:2;7486:18;;;7479:30;7545:34;7525:18;;;7518:62;-1:-1:-1;;;7596:18:5;;;7589:33;7639:19;;2965:45:4;7439:225:5;2928:82:4;3059:25;;3021:35;3126:313;3149:31;3173:6;3149:13;:31;:::i;:::-;3246:20;3331:27;3423:15;3126:22;:313::i;:::-;3094:345;-1:-1:-1;3449:25:4;3477:42;3094:345;3477:18;:42;:::i;:::-;3449:70;;3530:21;3554:31;3567:17;3554:12;:31::i;:::-;3530:55;;3604:78;3631:21;3654:27;3604:26;:78::i;:::-;3708:135;3726:13;3741:20;3804:21;3827:15;3708:17;:135::i;:::-;3693:12;:150;3854:26;3883:37;3906:13;3883:22;:37::i;:::-;3930:15;:36;;;3999:15;3977:19;:37;;;3854:66;;-1:-1:-1;4035:10:4;;4030:118;;4047:17;;4066:42;;:25;:42::i;:::-;4030:118;;;8478:25:5;;;8534:2;8519:18;;8512:34;;;;8562:18;;8555:34;;;8466:2;8451:18;4030:118:4;;;;;;;-1:-1:-1;4166:4:4;;2284:1893;-1:-1:-1;;;;;;;;;;2284:1893:4:o;11629:367::-;11700:12;-1:-1:-1;;;;;11741:16:4;;;;;;:39;;-1:-1:-1;;;;;;11761:19:4;;11775:4;11761:19;;11741:39;11733:67;;;;-1:-1:-1;;;11733:67:4;;;;;;;:::i;:::-;11851:10;11842:20;;;;:8;:20;;;;;;:29;;11865:6;;11842:29;:::i;:::-;11828:10;11819:20;;;;:8;:20;;;;;;:52;;;;-1:-1:-1;;;;;11897:12:4;;;;;;:21;;11912:6;;11897:21;:::i;:::-;-1:-1:-1;;;;;11882:12:4;;;;;;:8;:12;;;;;;;:36;;;;11934:32;;11943:10;;11934:32;;;;11959:6;5835:25:5;;5823:2;5808:18;;5790:76;8444:339:4;8499:7;;8555:28;8563:20;8555:5;:28;:::i;:::-;8519:64;;1227:22;8598:25;:49;8594:182;;;-1:-1:-1;8668:1:4;;8444:339;-1:-1:-1;;8444:339:4:o;8594:182::-;1312:22;8708:49;1312:22;8708:25;:49;:::i;:::-;8707:69;;;;:::i;:::-;8703:73;;:1;:73;:::i;:::-;8696:80;8444:339;-1:-1:-1;;;8444:339:4:o;16705:189::-;16802:12;571:5:3;;-1:-1:-1;;;;;571:5:3;557:10;:19;549:28;;;;;;16872:5:4::1;::::0;16834:52:::1;::::0;-1:-1:-1;;;16834:52:4;;-1:-1:-1;;;;;16872:5:4;;::::1;16834:52;::::0;::::1;4899:51:5::0;4966:18;;;4959:34;;;16834:37:4;;::::1;::::0;::::1;::::0;4872:18:5;;16834:52:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;616:176:3:-:0;571:5;;-1:-1:-1;;;;;571:5:3;557:10;:19;549:28;;;;;;-1:-1:-1;;;;;702:23:3;::::1;694:51;;;;-1:-1:-1::0;;;694:51:3::1;;;;;;;:::i;:::-;760:8;:20:::0;;-1:-1:-1;;;;;;760:20:3::1;-1:-1:-1::0;;;;;760:20:3;;;::::1;::::0;;;::::1;::::0;;616:176::o;13179:319:4:-;13325:10;13284:12;13317:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;13317:28:4;;;;;;;;;;:49;;13309:134;;;;-1:-1:-1;;;13309:134:4;;;;;;;:::i;:::-;13461:30;13469:7;13478:12;13461:7;:30::i;8789:139::-;8852:7;8896:25;;1128:3;8878:43;;;;:::i;15414:434::-;15508:12;-1:-1:-1;;;;;15549:21:4;;;;;;:49;;-1:-1:-1;;;;;;15574:24:4;;15593:4;15574:24;;15549:49;15541:77;;;;-1:-1:-1;;;15541:77:4;;;;;;;:::i;:::-;15637:10;15629:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;15629:28:4;;;;;;;;;;;;:37;;;15682;5835:25:5;;;15629:28:4;;15637:10;15682:37;;5808:18:5;15682:37:4;;;;;;;15730:88;;-1:-1:-1;;;15730:88:4;;-1:-1:-1;;;;;15730:47:4;;;;;:88;;15778:10;;15790:6;;15806:4;;15813;;15730:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15836:4:4;;15414:434;-1:-1:-1;;;;;;;15414:434:4:o;9750:133::-;9814:7;9860:16;9870:5;9860:9;:16::i;:::-;9857:19;;:1;:19;:::i;:::-;9840:36;;974:12;9840:36;:::i;4183:666::-;4409:7;4455:27;4409:7;1128:3;4528:34;4542:20;4528:11;:34;:::i;:::-;4527:54;;;;:::i;:::-;4492:89;;4631:15;4604:24;:42;4600:102;;;4678:24;4660:42;;4600:102;1041:2;4717:15;:39;4713:96;;;1041:2;4770:39;;4713:96;-1:-1:-1;4827:15:4;4183:666;-1:-1:-1;;;;4183:666:4:o;4855:604::-;5093:7;5113:23;5139:203;5165:20;5244:27;5330:11;5139:25;:203::i;:::-;5113:229;;5371:15;5356:12;:30;5352:67;;;5407:12;5400:19;;;;;5465:251;5555:10;5526:7;5546:20;;;:8;:20;;;;;:35;;5570:11;;5546:20;5526:7;;5546:35;;5570:11;;5546:35;:::i;:::-;;;;-1:-1:-1;;5615:12:4;;5591:21;;5615:26;;5630:11;;5615:26;:::i;:::-;5651:12;:28;;;5591:50;5465:251;-1:-1:-1;;;5465:251:4:o;5722:694::-;6317:27;6290:23;:54;6286:123;;6358:25;:51;;;6286:123;5722:694;;:::o;7504:933::-;7748:7;;7797:34;7811:20;7797:11;:34;:::i;:::-;7767:64;-1:-1:-1;8020:33:4;1128:3;8020:15;:33;:::i;:::-;:38;;8056:2;8020:38;:::i;:::-;7993:24;:19;8015:2;7993:24;:::i;:::-;:65;7989:209;;;8111:3;8089:18;:13;8105:2;8089:18;:::i;:::-;8088:26;;;;:::i;:::-;8072:42;;7989:209;;;8196:2;8173:19;:13;8189:3;8173:19;:::i;:::-;8172:26;;;;:::i;:::-;8156:42;;7989:209;1397:5;8227:13;:30;8223:78;;;1397:5;8271:30;;8223:78;-1:-1:-1;;;8324:13:4;:30;8320:79;;;-1:-1:-1;;;8369:30:4;;8320:79;-1:-1:-1;8417:13:4;;7504:933;-1:-1:-1;;;;7504:933:4:o;6801:524::-;6879:7;820:1;7285:13;7264:16;7279:1;7264:12;:16;:::i;:::-;7254:27;7246:52;:71;;6801:524;-1:-1:-1;;6801:524:4:o;7332:166::-;7411:7;1128:3;7438:34;7452:20;7438:11;:34;:::i;:::-;7437:54;;;;:::i;14:173:5:-;82:20;;-1:-1:-1;;;;;131:31:5;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:254::-;1049:6;1057;1110:2;1098:9;1089:7;1085:23;1081:32;1078:2;;;1126:1;1123;1116:12;1078:2;1149:29;1168:9;1149:29;:::i;:::-;1139:39;1225:2;1210:18;;;;1197:32;;-1:-1:-1;;;1068:167:5:o;1240:322::-;1317:6;1325;1333;1386:2;1374:9;1365:7;1361:23;1357:32;1354:2;;;1402:1;1399;1392:12;1354:2;1425:29;1444:9;1425:29;:::i;:::-;1415:39;1501:2;1486:18;;1473:32;;-1:-1:-1;1552:2:5;1537:18;;;1524:32;;1344:218;-1:-1:-1;;;1344:218:5:o;1567:1132::-;1662:6;1670;1678;1686;1739:3;1727:9;1718:7;1714:23;1710:33;1707:2;;;1756:1;1753;1746:12;1707:2;1779:29;1798:9;1779:29;:::i;:::-;1769:39;;1855:2;1844:9;1840:18;1827:32;1817:42;;1906:2;1895:9;1891:18;1878:32;1868:42;;1961:2;1950:9;1946:18;1933:32;1984:18;2025:2;2017:6;2014:14;2011:2;;;2041:1;2038;2031:12;2011:2;2079:6;2068:9;2064:22;2054:32;;2124:7;2117:4;2113:2;2109:13;2105:27;2095:2;;2146:1;2143;2136:12;2095:2;2182;2169:16;2204:2;2200;2197:10;2194:2;;;2210:18;;:::i;:::-;2285:2;2279:9;2253:2;2339:13;;-1:-1:-1;;2335:22:5;;;2359:2;2331:31;2327:40;2315:53;;;2383:18;;;2403:22;;;2380:46;2377:2;;;2429:18;;:::i;:::-;2469:10;2465:2;2458:22;2504:2;2496:6;2489:18;2544:7;2539:2;2534;2530;2526:11;2522:20;2519:33;2516:2;;;2565:1;2562;2555:12;2516:2;2621;2616;2612;2608:11;2603:2;2595:6;2591:15;2578:46;2666:1;2661:2;2656;2648:6;2644:15;2640:24;2633:35;2687:6;2677:16;;;;;;;1697:1002;;;;;;;:::o;2704:277::-;2771:6;2824:2;2812:9;2803:7;2799:23;2795:32;2792:2;;;2840:1;2837;2830:12;2792:2;2872:9;2866:16;2925:5;2918:13;2911:21;2904:5;2901:32;2891:2;;2947:1;2944;2937:12;2986:180;3045:6;3098:2;3086:9;3077:7;3073:23;3069:32;3066:2;;;3114:1;3111;3104:12;3066:2;-1:-1:-1;3137:23:5;;3056:110;-1:-1:-1;3056:110:5:o;3171:248::-;3239:6;3247;3300:2;3288:9;3279:7;3275:23;3271:32;3268:2;;;3316:1;3313;3306:12;3268:2;-1:-1:-1;;3339:23:5;;;3409:2;3394:18;;;3381:32;;-1:-1:-1;3258:161:5:o;3677:471::-;3718:3;3756:5;3750:12;3783:6;3778:3;3771:19;3808:1;3818:162;3832:6;3829:1;3826:13;3818:162;;;3894:4;3950:13;;;3946:22;;3940:29;3922:11;;;3918:20;;3911:59;3847:12;3818:162;;;3998:6;3995:1;3992:13;3989:2;;;4064:1;4057:4;4048:6;4043:3;4039:16;4035:27;4028:38;3989:2;-1:-1:-1;4130:2:5;4109:15;-1:-1:-1;;4105:29:5;4096:39;;;;4137:4;4092:50;;3726:422;-1:-1:-1;;3726:422:5:o;5004:488::-;-1:-1:-1;;;;;5273:15:5;;;5255:34;;5320:2;5305:18;;5298:34;;;5368:15;;5363:2;5348:18;;5341:43;5420:3;5415:2;5400:18;;5393:31;;;5198:4;;5441:45;;5466:19;;5458:6;5441:45;:::i;:::-;5433:53;5207:285;-1:-1:-1;;;;;;5207:285:5:o;5871:219::-;6020:2;6009:9;6002:21;5983:4;6040:44;6080:2;6069:9;6065:18;6057:6;6040:44;:::i;6095:339::-;6297:2;6279:21;;;6336:2;6316:18;;;6309:30;-1:-1:-1;;;6370:2:5;6355:18;;6348:45;6425:2;6410:18;;6269:165::o;7669:420::-;7871:2;7853:21;;;7910:2;7890:18;;;7883:30;7949:34;7944:2;7929:18;;7922:62;8020:26;8015:2;8000:18;;7993:54;8079:3;8064:19;;7843:246::o;8789:128::-;8829:3;8860:1;8856:6;8853:1;8850:13;8847:2;;;8866:18;;:::i;:::-;-1:-1:-1;8902:9:5;;8837:80::o;8922:217::-;8962:1;8988;8978:2;;9032:10;9027:3;9023:20;9020:1;9013:31;9067:4;9064:1;9057:15;9095:4;9092:1;9085:15;8978:2;-1:-1:-1;9124:9:5;;8968:171::o;9144:422::-;9233:1;9276:5;9233:1;9290:270;9311:7;9301:8;9298:21;9290:270;;;9370:4;9366:1;9362:6;9358:17;9352:4;9349:27;9346:2;;;9379:18;;:::i;:::-;9429:7;9419:8;9415:22;9412:2;;;9449:16;;;;9412:2;9528:22;;;;9488:15;;;;9290:270;;;9294:3;9208:358;;;;;:::o;9571:131::-;9631:5;9660:36;9687:8;9681:4;9756:5;9786:8;9776:2;;-1:-1:-1;9827:1:5;9841:5;;9776:2;9875:4;9865:2;;-1:-1:-1;9912:1:5;9926:5;;9865:2;9957:4;9975:1;9970:59;;;;10043:1;10038:130;;;;9950:218;;9970:59;10000:1;9991:10;;10014:5;;;10038:130;10075:3;10065:8;10062:17;10059:2;;;10082:18;;:::i;:::-;-1:-1:-1;;10138:1:5;10124:16;;10153:5;;9950:218;;10252:2;10242:8;10239:16;10233:3;10227:4;10224:13;10220:36;10214:2;10204:8;10201:16;10196:2;10190:4;10187:12;10183:35;10180:77;10177:2;;;-1:-1:-1;10289:19:5;;;10321:5;;10177:2;10368:34;10393:8;10387:4;10368:34;:::i;:::-;10438:6;10434:1;10430:6;10426:19;10417:7;10414:32;10411:2;;;10449:18;;:::i;:::-;10487:20;;9766:747;-1:-1:-1;;;9766:747:5:o;10518:168::-;10558:7;10624:1;10620;10616:6;10612:14;10609:1;10606:21;10601:1;10594:9;10587:17;10583:45;10580:2;;;10631:18;;:::i;:::-;-1:-1:-1;10671:9:5;;10570:116::o;10691:125::-;10731:4;10759:1;10756;10753:8;10750:2;;;10764:18;;:::i;:::-;-1:-1:-1;10801:9:5;;10740:76::o;10821:127::-;10882:10;10877:3;10873:20;10870:1;10863:31;10913:4;10910:1;10903:15;10937:4;10934:1;10927:15;10953:127;11014:10;11009:3;11005:20;11002:1;10995:31;11045:4;11042:1;11035:15;11069:4;11066:1;11059:15

Swarm Source

ipfs://675ac9516343bf5e254dc38eb10f6377b12932588d9091dacac9e60d7d6bc65a
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.