Contract 0xf04aF3f4E4929F7CD25A751E6149A3318373d4FE

 
 
Txn Hash
Method
Block
From
To
Value
0x4c2e889cd51ee3fd4e451e33f6f2cb13eb531e9a1268c9c3b983dfd8cadcdb30Mint156394942022-09-29 14:07:5942 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00115521 20.13516912
0x9435ed51fa98c80b79a613edf3fdcdc2131ddce07d806761b7a3b09143231ac5Mint156393022022-09-29 13:28:591 hr 21 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00113675 20.8774582
0xc2ae1eeba2f0bbcf4b59eff5ed38ab2b85248ea5eac5f8fccf5a4a2e5a5fe1fcMint156392112022-09-29 13:10:471 hr 39 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00126843 23.29575688
0x98af1c71b1a5593cb94e6e6c16f2805de2b406369cc617507a99af23c5590a8fMint156391942022-09-29 13:07:231 hr 43 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00159758 27.84794107
0x73fe3dd8a67cfa0374808a54fd9b4d72967cb922a4f3e3d3e8ad75d75ede211eMint156385352022-09-29 10:54:113 hrs 56 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00073453 12.80004284
0x400ea374fd3587b831916b2c83635d624782cc220e6ac4fd4943c3d5ca59be87Mint156385102022-09-29 10:48:594 hrs 1 min ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00059996 11.02128568
0xcfc327550cb11fa0e7150c232908ab39fb439666920bf80bc3bd26886b057684Mint156383912022-09-29 10:25:114 hrs 25 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00059548 10.38008043
0x185839fb4aa4bf869c10378e83f5e498632c102fa0f4bd4cd17521eb1c165e60Mint156379642022-09-29 8:59:235 hrs 51 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00077807 13.56216615
0x9fb2e15b716259a123ed1d6f4058169cd62c2cb3e4b81add17ad8637a37d9df0Mint156372322022-09-29 6:32:238 hrs 18 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00067128 12.32310234
0x099a7a1262510c0087c78bc99fb0280c0b8e1bfe2d1dc20ada17c24ddf31d0b4Mint156366432022-09-29 4:33:4710 hrs 16 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00093506 16.29852951
0x7250f348226d0d86f71712ad22cf478f9bb81f276b3dd35ec855f77548138001Mint156339542022-09-28 19:33:3519 hrs 17 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00105865 18.452128
0x655f7d1828bfcf58b692ff0a0813d7ee267846914e07f667bd79f33cdeb3db1eMint156339392022-09-28 19:30:3519 hrs 20 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00102436 18.81335718
0xc4a7c614cbc0db7150428336e4f17fcc4db5b6ec7c66939bcff697e1df819cd4Mint156324932022-09-28 14:40:231 day 10 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00133705 23.30543111
0x446b9ebabe6c4095f7856f2967bce4b1aa4aa5f73df4670fcf2faec02c6427a8Mint156319472022-09-28 12:50:351 day 2 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00101791 18.6906483
0x7fb5aa140e01dc774ebdaaac9101d1032bad2e258333a5cb1e26106ed09e1152Mint156319122022-09-28 12:43:351 day 2 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00094504 16.47691222
0x20021c436a678f61868fabd87ec0eb329fbe6d2cb80009ec926481fe1368c5f4Mint156314562022-09-28 11:11:471 day 3 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00067326 11.73483061
0xfb6c98cd7016d701402d57ef1ad7c45c06d969e6b1b8b022ea7d5afcc29fdde7Mint156313802022-09-28 10:56:231 day 3 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.0008178 15.01974222
0xd02470a05d47f12c4387537569a3afc13f64b2ee21aae191bf4588cb0d6dde76Mint156295312022-09-28 4:44:471 day 10 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00071574 12.47569847
0x4cab3562d0efb00965972c5ef02e33d14b9435bdd9d1f0191e88ca6198d483f3Mint156288772022-09-28 2:32:591 day 12 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00145713 25.40502181
0x62499d806a2cac4b1fc89654fb4a4f0911a1b2e964996ce76cb610729748df28Mint156273592022-09-27 21:27:111 day 17 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00076638 13.35791196
0x590544341c3585d667d74961ff4ba241bf0e7673f566887caa040e5b6268d05eMint156271972022-09-27 20:53:471 day 17 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00104055 18.14209095
0x4ffa445abf7d1c7fb304d8735f8d796ddc92f67b855ba3a9edf268e6ce79073bMint156266282022-09-27 18:58:351 day 19 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.0011073 19.30338792
0x6d1927b8028b8561f71be39751017cd7548a851aea526425bbaca29a49bcbbcbMint156262512022-09-27 17:42:351 day 21 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00172676 30.10617219
0x26b1788549aeaf817947e7b819a6aa770d0e38eadb04fd1fad26278f34f04ee0Mint156254502022-09-27 15:01:351 day 23 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00184839 33.95470963
0xd3aa1b155b2e22d1efe62fdc1859c394559682dbb341d11819f001a13914f1ecMint156253172022-09-27 14:34:352 days 16 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0xf04af3f4e4929f7cd25a751e6149a3318373d4fe0 Ether0.00137075 25.17498338
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpringToken

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: SpringToken.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.5;


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



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

// 'Spring Token' contract

// ERC20 & ERC918 Mineable Token using Proof Of Work

// Symbol      : SPRING

// Name        : Spring Token

// Total supply: 33,112,800.00

// Decimals    : 18

// Initial mining reward: 168

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

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





contract SpringToken is ERC20Interface, ERC918, Owned {

    string private constant SYMBOL = "SPRING";

    string private constant NAME = "Spring Token";

    uint256 public constant TOKEN_IDENTIFIER = 1;

    uint8 public constant DECIMALS = 18;

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

    uint256 public constant INITIAL_REWARD = 168 * 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) / 4; // 9 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"}]

60a060405234801561001057600080fd5b50600080546001600160a01b0319163317905561003462080000600160ea1b61006f565b600555426080819052600255600160035561004f6000610057565b6004556100b6565b60006001826100668243610091565b40181892915050565b60008261008c57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156100b157634e487b7160e01b600052601160045260246000fd5b500390565b6080516115b0620000e06000396000818161047e01528181610bff015261106c01526115b06000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806379ba50971161013b578063cea3e530116100b8578063ef08fc6e1161007c578063ef08fc6e14610507578063f2fde38b14610512578063f650366214610525578063f77e180e14610538578063f79875461461054257600080fd5b8063cea3e53014610479578063d390a1e4146104a0578063d4ee1d90146104a8578063dc39d06d146104bb578063dd62ed3e146104ce57600080fd5b80639fb68299116100ff5780639fb6829914610425578063a0712d6814610438578063a9059cbb1461044b578063aa3308bd1461045e578063c2d98c6e1461047157600080fd5b806379ba5097146103a95780638da5cb5b146103b35780638f759183146103de578063902d55a5146103f157806395d89b411461040357600080fd5b8063313ce567116101c95780634ef376281161018d5780634ef376281461035b57806357dd62fb146103635780635dbdda691461036e5780636de9f32b1461037757806370a082311461038057600080fd5b8063313ce5671461032b57806332e997081461033257806336bcf7d61461033a578063490203a71461034a5780634a1da80e1461035257600080fd5b806317da485f1161021057806317da485f146102db5780631801fbe5146102e357806318160ddd146102f657806323b872dd146102fe5780632e0f26251461031157600080fd5b8063031052f31461024d578063068a24951461026b57806306fdde031461028e578063095ea7b3146102bf5780630d97a2fb146102d2575b600080fd5b610258600160ea1b81565b6040519081526020015b60405180910390f35b61027e61027936600461119e565b61054a565b6040519015158152602001610262565b60408051808201909152600c81526b29b83934b733902a37b5b2b760a11b60208201525b604051610262919061135a565b61027e6102cd366004611141565b6105ab565b61025860035481565b610258610650565b61027e6102f13660046112ae565b61066a565b600654610258565b61027e61030c366004611105565b61073f565b610319601281565b60405160ff9091168152602001610262565b6012610319565b600554610258565b61025868091b77e5e5d9a0000081565b61025861087f565b61025860025481565b600454610258565b6102586305a39a8081565b61025861025881565b61025860065481565b61025861038e3660046110b7565b6001600160a01b031660009081526007602052604090205490565b6103b1610891565b005b6000546103c6906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b6102586103ec366004611295565b61090c565b6102586a1b63e87c1f629e3f80000081565b604080518082019091526006815265535052494e4760d01b60208201526102b2565b6102586104333660046112ae565b61091d565b61027e610446366004611295565b610953565b61027e610459366004611141565b610b1f565b61025861046c366004611295565b610bf7565b610258600181565b6102587f000000000000000000000000000000000000000000000000000000000000000081565b610258604881565b6001546103c6906001600160a01b031681565b61027e6104c9366004611141565b610c6a565b6102586104dc3660046110d2565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b610258630168e6a081565b6103b16105203660046110b7565b610d08565b61027e61053336600461116b565b610d67565b6102586201000081565b610258610db3565b3360009081526008602090815260408083206001600160a01b038816845290915281205484146105955760405162461bcd60e51b815260040161058c90611396565b60405180910390fd5b6105a0858484610dc5565b90505b949350505050565b60006001600160a01b038316158015906105ce57506001600160a01b0383163014155b6105ea5760405162461bcd60e51b815260040161058c9061136d565b3360008181526008602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060015b92915050565b60055460009060001990610664908261140b565b91505090565b6004546040805160208101929092526bffffffffffffffffffffffff193360601b16908201526054810183905260009081906074016040516020818303038152906040528051906020012090508281146107365760405162461bcd60e51b815260206004820152604160248201527f4368616c6c656e67652064696765737420646f6573206e6f74206d617463682060448201527f657870656374656420646967657374206f6e20746f6b656e20636f6e747261636064820152601d60fa1b608482015260a40161058c565b6105a384610953565b60006001600160a01b0383161580159061076257506001600160a01b0383163014155b61077e5760405162461bcd60e51b815260040161058c9061136d565b6001600160a01b0384166000908152600760205260409020546107a2908390611537565b6001600160a01b03851660009081526007602090815260408083209390935560088152828220338352905220546107da908390611537565b6001600160a01b0380861660009081526008602090815260408083203384528252808320949094559186168152600790915220546108199083906113f3565b6001600160a01b0380851660008181526007602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061086d9086815260200190565b60405180910390a35060019392505050565b600061088c600254610ecd565b905090565b6001546001600160a01b031633146108a857600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b600061064a60025460035484610ef6565b60008061093d84600554610931919061140b565b60025460035486610f36565b90508061094984610ecd565b6105a39190611518565b6002546000908161096382610ecd565b9050806109b25760405162461bcd60e51b815260206004820152601760248201527f526577617264206861732072656163686564207a65726f000000000000000000604482015260640161058c565b600454604080516020808201939093523360601b6bffffffffffffffffffffffff1916818301526054808201889052825180830390910181526074909101909152805191012060055480821115610a575760405162461bcd60e51b815260206004820152602360248201527f446967657374206973206c6172676572207468616e206d696e696e672074617260448201526219d95d60ea1b606482015260840161058c565b6003546000610a71610a69858561140b565b878442610f36565b90506000610a7f8287611518565b90506000610a8c82610f57565b9050610a988385610f9a565b610aa485898542610fab565b6005556000610ab28261104a565b600481905542600281905590915033907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d908590610aef90611062565b604080519283526020830191909152810184905260600160405180910390a25060019a9950505050505050505050565b60006001600160a01b03831615801590610b4257506001600160a01b0383163014155b610b5e5760405162461bcd60e51b815260040161058c9061136d565b33600090815260076020526040902054610b79908390611537565b33600090815260076020526040808220929092556001600160a01b03851681522054610ba69083906113f3565b6001600160a01b0384166000818152600760205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061063e9086815260200190565b600080610c247f000000000000000000000000000000000000000000000000000000000000000084611537565b9050630168e6a0811015610c3b5750600092915050565b6305a39a80610c4e630168e6a083611537565b610c58919061140b565b610c639060016113f3565b9392505050565b600080546001600160a01b03163314610c8257600080fd5b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529084169063a9059cbb90604401602060405180830381600087803b158015610cd057600080fd5b505af1158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190611273565b6000546001600160a01b03163314610d1f57600080fd5b6001600160a01b038116610d455760405162461bcd60e51b815260040161058c9061136d565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526008602090815260408083206001600160a01b03871684529091528120548314610da95760405162461bcd60e51b815260040161058c90611396565b6105a384836105ab565b600060035461025861088c9190611518565b60006001600160a01b03841615801590610de857506001600160a01b0384163014155b610e045760405162461bcd60e51b815260040161058c9061136d565b3360008181526008602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3604051638f4ffcb160e01b81526001600160a01b03851690638f4ffcb190610e9190339087903090889060040161131d565b600060405180830381600087803b158015610eab57600080fd5b505af1158015610ebf573d6000803e3d6000fd5b506001979650505050505050565b6000610ed882610bf7565b610ee3906002611470565b61064a9068091b77e5e5d9a0000061140b565b60008281610258610f078786611537565b610f11919061140b565b905081811115610f1f578091505b6048821115610f2d57604891505b50949350505050565b600080610f44858585610ef6565b9050808610156105a057859150506105a3565b33600090815260076020526040812080548391908390610f789084906113f3565b9091555050600654600090610f8e9084906113f3565b60068190559392505050565b808214610fa75760038290555b5050565b600080610fb88584611537565b9050610fc661025885611518565b610fd190603d611518565b610fdc826058611518565b1015611000576064610fef876063611518565b610ff9919061140b565b955061101a565b606361100d876064611518565b611017919061140b565b95505b6201000086101561102c576201000095505b600160ea1b86111561104057600160ea1b95505b5093949350505050565b60006001826110598243611537565b40181892915050565b60006102586110917f000000000000000000000000000000000000000000000000000000000000000084611537565b61064a919061140b565b80356001600160a01b03811681146110b257600080fd5b919050565b6000602082840312156110c957600080fd5b610c638261109b565b600080604083850312156110e557600080fd5b6110ee8361109b565b91506110fc6020840161109b565b90509250929050565b60008060006060848603121561111a57600080fd5b6111238461109b565b92506111316020850161109b565b9150604084013590509250925092565b6000806040838503121561115457600080fd5b61115d8361109b565b946020939093013593505050565b60008060006060848603121561118057600080fd5b6111898461109b565b95602085013595506040909401359392505050565b600080600080608085870312156111b457600080fd5b6111bd8561109b565b93506020850135925060408501359150606085013567ffffffffffffffff808211156111e857600080fd5b818701915087601f8301126111fc57600080fd5b81358181111561120e5761120e611564565b604051601f8201601f19908116603f0116810190838211818310171561123657611236611564565b816040528281528a602084870101111561124f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60006020828403121561128557600080fd5b81518015158114610c6357600080fd5b6000602082840312156112a757600080fd5b5035919050565b600080604083850312156112c157600080fd5b50508035926020909101359150565b6000815180845260005b818110156112f6576020818501810151868301820152016112da565b81811115611308576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0385811682526020820185905283166040820152608060608201819052600090611350908301846112d0565b9695505050505050565b602081526000610c6360208301846112d0565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60208082526038908201527f43757272656e74207370656e64657220616c6c6f77616e636520646f6573206e60408201527f6f74206d61746368207370656369666965642076616c75650000000000000000606082015260800190565b600082198211156114065761140661154e565b500190565b60008261142857634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561146857816000190482111561144e5761144e61154e565b8085161561145b57918102915b93841c9390800290611432565b509250929050565b6000610c6383836000826114865750600161064a565b816114935750600061064a565b81600181146114a957600281146114b3576114cf565b600191505061064a565b60ff8411156114c4576114c461154e565b50506001821b61064a565b5060208310610133831016604e8410600b84101617156114f2575081810a61064a565b6114fc838361142d565b80600019048211156115105761151061154e565b029392505050565b60008160001904831182151516156115325761153261154e565b500290565b6000828210156115495761154961154e565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212205476e7e04aa724315c45e467f3ffc84b5d3ad82e2543f033e539b4d173b2226d64736f6c63430008050033

Deployed ByteCode Sourcemap

617:16284:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1413:47;;-1:-1:-1;;;1413:47:4;;;;;5835:25:5;;;5823:2;5808:18;1413:47:4;;;;;;;;16083:391;;;;;;:::i;:::-;;:::i;:::-;;;5662:14:5;;5655:22;5637:41;;5625:2;5610:18;16083:391:4;5592:92:5;2112:80:4;2181:4;;;;;;;;;;;;-1:-1:-1;;;2181:4:4;;;;2112:80;;;;;;;:::i;12440:316::-;;;;;;:::i;:::-;;:::i;1560:40::-;;;;;;9052:300;;;:::i;6468:331::-;;;;;;:::i;:::-;;:::i;10829:99::-;10909:12;;10829:99;;14043:432;;;;;;:::i;:::-;;:::i;829:35::-;;862:2;829:35;;;;;8772:4:5;8760:17;;;8742:36;;8730:2;8715:18;829:35:4;8697:87:5;10734:89:4;862:2;10734:89;;9358:100;9440:12;;9358:100;;934:53;;975:12;934:53;;9464:284;;;:::i;1519:34::-;;;;;;8938:108;9024:15;;8938:108;;1274:64;;1316:22;1274:64;;1087:45;;1129:3;1087:45;;1688:27;;;;;;11152:132;;;;;;:::i;:::-;-1:-1:-1;;;;;11256:20:4;11221:15;11256:20;;;:8;:20;;;;;;;11152: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;9893:284:4;;;;;;:::i;:::-;;:::i;871:56::-;;910:17;871:56;;2198:84;2269:6;;;;;;;;;;;;-1:-1:-1;;;2269:6:4;;;;2198:84;;10183:545;;;;;;:::i;:::-;;:::i;2288:1893::-;;;;;;:::i;:::-;;:::i;11633:367::-;;;;;;:::i;:::-;;:::i;8448:339::-;;;;;;:::i;:::-;;:::i;778:44::-;;821:1;778:44;;1467:45;;;;;994:50;;1042:2;994:50;;328:23:3;;;;;-1:-1:-1;;;;;328:23:3;;;16709:189:4;;;;;;:::i;:::-;;:::i;14761:158::-;;;;;;:::i;:::-;-1:-1:-1;;;;;14883:19:4;;;14847:17;14883:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;14761:158;1179:76;;1227:28;1179:76;;616:176:3;;;;;;:::i;:::-;;:::i;13183:319:4:-;;;;;;:::i;:::-;;:::i;1360:46::-;;1401:5;1360:46;;8793:139;;;:::i;16083:391::-;16288:10;16247:12;16280:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;16280:28:4;;;;;;;;;;:49;;16272:134;;;;-1:-1:-1;;;16272:134:4;;;;;;;:::i;:::-;;;;;;;;;16424:43;16439:7;16448:12;16462:4;16424:14;:43::i;:::-;16417:50;;16083:391;;;;;;;:::o;12440:316::-;12515:12;-1:-1:-1;;;;;12556:21:4;;;;;;:49;;-1:-1:-1;;;;;;12581:24:4;;12600:4;12581:24;;12556:49;12548:77;;;;-1:-1:-1;;;12548:77:4;;;;;;;:::i;:::-;12644:10;12636:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;12636:28:4;;;;;;;;;;;;:37;;;12689;5835:25:5;;;12636:28:4;;12644:10;12689:37;;5808:18:5;12689:37:4;;;;;;;;-1:-1:-1;12744:4:4;12440:316;;;;;:::o;9052:300::-;9333:12;;9113:7;;-1:-1:-1;;9241:66:4;9324:21;;9241:66;9324:21;:::i;:::-;9317:28;;;9052:300;:::o;6468:331::-;6603:15;;6586:53;;;;;;4338:19:5;;;;-1:-1:-1;;6620:10:4;4395:2:5;4391:15;4387:53;4373:12;;;4366:75;4457:12;;;4450:28;;;6542:4:4;;;;4494:12:5;;6586:53:4;;;;;;;;;;;;6576:64;;;;;;6559:81;;6668:16;6658:6;:26;6650:104;;;;-1:-1:-1;;;6650:104:4;;6993:2:5;6650: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;;6650:104:4;6965:295:5;6650:104:4;6780:12;6785:6;6780:4;:12::i;14043:432::-;14132:12;-1:-1:-1;;;;;14173:16:4;;;;;;:39;;-1:-1:-1;;;;;;14193:19:4;;14207:4;14193:19;;14173:39;14165:67;;;;-1:-1:-1;;;14165:67:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;14260:14:4;;;;;;:8;:14;;;;;;:23;;14277:6;;14260:23;:::i;:::-;-1:-1:-1;;;;;14243:14:4;;;;;;:8;:14;;;;;;;;:40;;;;14322:7;:13;;;;;14336:10;14322:25;;;;;;:34;;14350:6;;14322:34;:::i;:::-;-1:-1:-1;;;;;14294:13:4;;;;;;;:7;:13;;;;;;;;14308:10;14294:25;;;;;;;:62;;;;14382:12;;;;;:8;:12;;;;;:21;;14397:6;;14382:21;:::i;:::-;-1:-1:-1;;;;;14367:12:4;;;;;;;:8;:12;;;;;;;:36;;;;14419:26;;;;;;;;;;14438:6;5835:25:5;;5823:2;5808:18;;5790:76;14419:26:4;;;;;;;;-1:-1:-1;14463:4:4;14043:432;;;;;:::o;9464:284::-;9521:7;9704:37;9721:19;;9704:16;:37::i;:::-;9697:44;;9464: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;9893:284:4:-;9974:7;10000:170;10026:19;;10089:25;;10158:11;10000:25;:170::i;10183:545::-;10294:7;10313:29;10345:306;10383:14;10368:12;;:29;;;;:::i;:::-;10463:19;;10548:25;;10639:11;10345:22;:306::i;:::-;10313:338;;10700:21;10668:29;10685:11;10668:16;:29::i;:::-;:53;;;;:::i;2288:1893::-;2398:19;;2342:12;;;2465:38;2398:19;2465:16;:38::i;:::-;2436:67;-1:-1:-1;2570:23:4;2566:62;;2595:33;;-1:-1:-1;;;2595:33:4;;6641:2:5;2595:33:4;;;6623:21:5;6680:2;6660:18;;;6653:30;6719:25;6699:18;;;6692:53;6762:18;;2595:33:4;6613:173:5;2566:62:4;2785:15;;2768:52;;;;;;;4338:19:5;;;;2802:10:4;4395:2:5;4391:15;-1:-1:-1;;4387:53:5;4373:12;;;4366:75;4457:12;;;;4450:28;;;2768:52:4;;;;;;;;;;4494:12:5;;;;2768:52:4;;;2758:63;;;;;2856:12;;2936:31;;;2932:82;;;2969:45;;-1:-1:-1;;;2969:45:4;;7467:2:5;2969: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;;2969:45:4;7439:225:5;2932:82:4;3063:25;;3025:35;3130:313;3153:31;3177:6;3153:13;:31;:::i;:::-;3250:20;3335:27;3427:15;3130:22;:313::i;:::-;3098:345;-1:-1:-1;3453:25:4;3481:42;3098:345;3481:18;:42;:::i;:::-;3453:70;;3534:21;3558:31;3571:17;3558:12;:31::i;:::-;3534:55;;3608:78;3635:21;3658:27;3608:26;:78::i;:::-;3712:135;3730:13;3745:20;3808:21;3831:15;3712:17;:135::i;:::-;3697:12;:150;3858:26;3887:37;3910:13;3887:22;:37::i;:::-;3934:15;:36;;;4003:15;3981:19;:37;;;3858:66;;-1:-1:-1;4039:10:4;;4034:118;;4051:17;;4070:42;;:25;:42::i;:::-;4034:118;;;8478:25:5;;;8534:2;8519:18;;8512:34;;;;8562:18;;8555:34;;;8466:2;8451:18;4034:118:4;;;;;;;-1:-1:-1;4170:4:4;;2288:1893;-1:-1:-1;;;;;;;;;;2288:1893:4:o;11633:367::-;11704:12;-1:-1:-1;;;;;11745:16:4;;;;;;:39;;-1:-1:-1;;;;;;11765:19:4;;11779:4;11765:19;;11745:39;11737:67;;;;-1:-1:-1;;;11737:67:4;;;;;;;:::i;:::-;11855:10;11846:20;;;;:8;:20;;;;;;:29;;11869:6;;11846:29;:::i;:::-;11832:10;11823:20;;;;:8;:20;;;;;;:52;;;;-1:-1:-1;;;;;11901:12:4;;;;;;:21;;11916:6;;11901:21;:::i;:::-;-1:-1:-1;;;;;11886:12:4;;;;;;:8;:12;;;;;;;:36;;;;11938:32;;11947:10;;11938:32;;;;11963:6;5835:25:5;;5823:2;5808:18;;5790:76;8448:339:4;8503:7;;8559:28;8567:20;8559:5;:28;:::i;:::-;8523:64;;1227:28;8602:25;:49;8598:182;;;-1:-1:-1;8672:1:4;;8448:339;-1:-1:-1;;8448:339:4:o;8598:182::-;1316:22;8712:49;1227:28;8712:25;:49;:::i;:::-;8711:69;;;;:::i;:::-;8707:73;;:1;:73;:::i;:::-;8700:80;8448:339;-1:-1:-1;;;8448:339:4:o;16709:189::-;16806:12;571:5:3;;-1:-1:-1;;;;;571:5:3;557:10;:19;549:28;;;;;;16876:5:4::1;::::0;16838:52:::1;::::0;-1:-1:-1;;;16838:52:4;;-1:-1:-1;;;;;16876:5:4;;::::1;16838:52;::::0;::::1;4899:51:5::0;4966:18;;;4959:34;;;16838:37:4;;::::1;::::0;::::1;::::0;4872:18:5;;16838: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;13183:319:4:-;13329:10;13288:12;13321:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;13321:28:4;;;;;;;;;;:49;;13313:134;;;;-1:-1:-1;;;13313:134:4;;;;;;;:::i;:::-;13465:30;13473:7;13482:12;13465:7;:30::i;8793:139::-;8856:7;8900:25;;1129:3;8882:43;;;;:::i;15418:434::-;15512:12;-1:-1:-1;;;;;15553:21:4;;;;;;:49;;-1:-1:-1;;;;;;15578:24:4;;15597:4;15578:24;;15553:49;15545:77;;;;-1:-1:-1;;;15545:77:4;;;;;;;:::i;:::-;15641:10;15633:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;15633:28:4;;;;;;;;;;;;:37;;;15686;5835:25:5;;;15633:28:4;;15641:10;15686:37;;5808:18:5;15686:37:4;;;;;;;15734:88;;-1:-1:-1;;;15734:88:4;;-1:-1:-1;;;;;15734:47:4;;;;;:88;;15782:10;;15794:6;;15810:4;;15817;;15734:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15840:4:4;;15418:434;-1:-1:-1;;;;;;;15418:434:4:o;9754:133::-;9818:7;9864:16;9874:5;9864:9;:16::i;:::-;9861:19;;:1;:19;:::i;:::-;9844:36;;975:12;9844:36;:::i;4187:666::-;4413:7;4459:27;4413:7;1129:3;4532:34;4546:20;4532:11;:34;:::i;:::-;4531:54;;;;:::i;:::-;4496:89;;4635:15;4608:24;:42;4604:102;;;4682:24;4664:42;;4604:102;1042:2;4721:15;:39;4717:96;;;1042:2;4774:39;;4717:96;-1:-1:-1;4831:15:4;4187:666;-1:-1:-1;;;;4187:666:4:o;4859:604::-;5097:7;5117:23;5143:203;5169:20;5248:27;5334:11;5143:25;:203::i;:::-;5117:229;;5375:15;5360:12;:30;5356:67;;;5411:12;5404:19;;;;;5469:251;5559:10;5530:7;5550:20;;;:8;:20;;;;;:35;;5574:11;;5550:20;5530:7;;5550:35;;5574:11;;5550:35;:::i;:::-;;;;-1:-1:-1;;5619:12:4;;5595:21;;5619:26;;5634:11;;5619:26;:::i;:::-;5655:12;:28;;;5595:50;5469:251;-1:-1:-1;;;5469:251:4:o;5726:694::-;6321:27;6294:23;:54;6290:123;;6362:25;:51;;;6290:123;5726:694;;:::o;7508:933::-;7752:7;;7801:34;7815:20;7801:11;:34;:::i;:::-;7771:64;-1:-1:-1;8024:33:4;1129:3;8024:15;:33;:::i;:::-;:38;;8060:2;8024:38;:::i;:::-;7997:24;:19;8019:2;7997:24;:::i;:::-;:65;7993:209;;;8115:3;8093:18;:13;8109:2;8093:18;:::i;:::-;8092:26;;;;:::i;:::-;8076:42;;7993:209;;;8200:2;8177:19;:13;8193:3;8177:19;:::i;:::-;8176:26;;;;:::i;:::-;8160:42;;7993:209;1401:5;8231:13;:30;8227:78;;;1401:5;8275:30;;8227:78;-1:-1:-1;;;8328:13:4;:30;8324:79;;;-1:-1:-1;;;8373:30:4;;8324:79;-1:-1:-1;8421:13:4;;7508:933;-1:-1:-1;;;;7508:933:4:o;6805:524::-;6883:7;821:1;7289:13;7268:16;821:1;7268:12;:16;:::i;:::-;7258:27;7250:52;:71;;6805:524;-1:-1:-1;;6805:524:4:o;7336:166::-;7415:7;1129:3;7442:34;7456:20;7442:11;:34;:::i;:::-;7441: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://5476e7e04aa724315c45e467f3ffc84b5d3ad82e2543f033e539b4d173b2226d
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.