Contract 0x4D4f3715050571A447FfFa2Cd4Cf091C7014CA5c

 
 
Txn Hash
Method
Block
From
To
Value
0x6bc6c4547e7f47cb144472a7052370694849f478a1010743d78fe69e0d994174Mint156387072022-09-29 11:28:593 hrs 39 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00066326 12.24570286
0x29255555b486c0ff0d9f0af27f4af1b325dafa1cab6950ea079a478b820df5c0Mint156386262022-09-29 11:12:353 hrs 56 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00069086 12.10805712
0x3685f08389143afee1bd57552385d49da460daf4f4b3160fc3e127255d4f50faMint156382652022-09-29 9:59:475 hrs 8 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00062589 10.96626718
0x7eccfcf7a8533bc9de75c10467acd24f2117db7e6aaede60dcf18bf9f4ef37f2Mint156381942022-09-29 9:45:235 hrs 23 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00078367 14.47519883
0xdd03c0b528e6984917106d337b21dad73ceea0adc004670427b74d35a28c91ecMint156380872022-09-29 9:23:595 hrs 44 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00069139 12.1174509
0x156a7f351466fac67a7c80b62e0f0e9736a720d129cde41ebce80c5f0f104169Mint156376422022-09-29 7:54:477 hrs 13 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00082521 14.45898293
0x82705b365f0a37bb84ec41921d37554a0c66fb1fc8c2da7b02efd35dce9a4a1eMint156370562022-09-29 5:56:479 hrs 11 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00081511 14.28199918
0xcdd4635255f9acf9cdcd66fbfe1435c5c88a797ba5e9f1159f38bc536b204c2cMint156365632022-09-29 4:17:4710 hrs 50 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00071252 12.48446949
0x68eedf12ef6c53b44a1f887d86086b1bb95bb5e7697bb543b0783a3646f66c91Mint156354372022-09-29 0:31:5914 hrs 36 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00076557 13.41399393
0xcd2c98fe28362f6eb476325f4ee49548999d3f47442c2b00e28dd6d8626c5489Mint156349472022-09-28 22:53:2316 hrs 15 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.0008092 14.18217886
0x29c82c98a1c841ccb5466154c4c3e955ea0918b5f5c8da75e691c381baf6f80eMint156345572022-09-28 21:34:5917 hrs 33 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00075181 13.17289079
0x44235c82fbe3965862b4a6f653286064bde4e285ec8f0739522b41886b55cc34Mint156339672022-09-28 19:36:1119 hrs 32 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00126999 22.25139242
0x6f677d03781c2cda098e09afb8ffad2f8268e68d0d4a69a6080e7b62509e6e76Mint156339472022-09-28 19:32:1119 hrs 36 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00103396 19.09416373
0xf2d3283c9dd6f82af704326e07d3ae8f759c3a44a472f0f78f1f14c70ce2023cMint156339072022-09-28 19:23:5919 hrs 44 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00121484 22.42403886
0x17d34b31ea7f4cb2854d46fab86574f2b12e7aea3dd4a58db3f9266f19c9f011Mint156329852022-09-28 16:18:5922 hrs 49 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00147609 25.86325037
0x9f76a31aaff019612d3566b2cb00d690a4cf747a5d23e8680d7f5f18114c9271Mint156324812022-09-28 14:37:591 day 30 mins ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00125293 21.94789098
0x4cf1107310d74e89560a9dcd6c8632ca6c5610506d2fabc9fa68c95ed231d836Mint156323342022-09-28 14:08:351 day 1 hr ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00121745 22.48260324
0xd4da732281bde961fa7b91160990fa4fcf694e4c2cd481ad280599d4f609d071Mint156322542022-09-28 13:52:351 day 1 hr ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00118556 21.89375251
0x961feb3b38af51a8d83010adbd4b0532d4e384d2851812eab29a153e6350361fMint156321092022-09-28 13:23:351 day 1 hr ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00106045 18.58558872
0x726178b6aeb7e72ec0a9ec38d201df07dc504c0b666698060848bdd5d01fe5ecMint156315922022-09-28 11:39:111 day 3 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00080102 14.79844363
0x6010af0e741e22aea0d67237c03a608609d3886ffcc1c822fa833cc8870e88abMint156312782022-09-28 10:35:471 day 4 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00071411 12.51228541
0x9c773da9ffd22512175d1ee2bd3f54aed630ef7ad5857d34a8748b13a7d1d606Mint156307262022-09-28 8:45:111 day 6 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00091145 16.82795649
0x3be66fe7463cdcd7072e5df3e7b42c51055c3ed0b100951359bf0f74fb65a147Mint156305612022-09-28 8:12:111 day 6 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00083523 15.4275356
0xe717b183b28b67d4b5c1bc3b2e02f4fd6357de880a0a31e6c8f9e4a1da5e3b46Mint156302812022-09-28 7:15:591 day 7 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00086183 15.10011573
0xc88afd28ca1c85c92fb290ef9ea57331746422c03aa85743ad083fd73a5d5d46Mint156302492022-09-28 7:09:351 day 7 hrs ago0xf18d90929e3ec5d3bea4aa16b9451ad3216a7764 IN  0x4d4f3715050571a447fffa2cd4cf091c7014ca5c0 Ether0.00095266 16.69639373
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SummerToken

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


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


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

// 'Summer Token' contract

// ERC20 & ERC918 Mineable Token using Proof Of Work

// Symbol      : SUMMER

// Name        : Summer Token

// Total supply: 33,112,800.00

// Decimals    : 18

// Initial mining reward: 140

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

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





contract SummerToken is ERC20Interface, ERC918, Owned {

    string private constant SYMBOL = "SUMMER";

    string private constant NAME = "Summer Token";

    uint256 public constant TOKEN_IDENTIFIER = 2;

    uint8 public constant DECIMALS = 18;

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

    uint256 public constant INITIAL_REWARD = 140 * 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) / 2; // 18 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"}]

60a060405234801561001057600080fd5b50600080546001600160a01b0319163317905561003462080000600160ea1b610070565b600555426080819052600255600160035561004f6000610057565b6004556100b7565b6000600282610067600143610092565b40181892915050565b60008261008d57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156100b257634e487b7160e01b600052601160045260246000fd5b500390565b6080516115b1620000e16000396000818161047e01528181610bff015261106d01526115b16000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806379ba50971161013b578063cea3e530116100b8578063ef08fc6e1161007c578063ef08fc6e14610507578063f2fde38b14610512578063f650366214610525578063f77e180e14610538578063f79875461461054257600080fd5b8063cea3e53014610479578063d390a1e4146104a0578063d4ee1d90146104a8578063dc39d06d146104bb578063dd62ed3e146104ce57600080fd5b80639fb68299116100ff5780639fb6829914610425578063a0712d6814610438578063a9059cbb1461044b578063aa3308bd1461045e578063c2d98c6e1461047157600080fd5b806379ba5097146103a95780638da5cb5b146103b35780638f759183146103de578063902d55a5146103f157806395d89b411461040357600080fd5b8063313ce567116101c95780634ef376281161018d5780634ef376281461035b57806357dd62fb146103635780635dbdda691461036e5780636de9f32b1461037757806370a082311461038057600080fd5b8063313ce5671461032b57806332e997081461033257806336bcf7d61461033a578063490203a71461034a5780634a1da80e1461035257600080fd5b806317da485f1161021057806317da485f146102db5780631801fbe5146102e357806318160ddd146102f657806323b872dd146102fe5780632e0f26251461031157600080fd5b8063031052f31461024d578063068a24951461026b57806306fdde031461028e578063095ea7b3146102bf5780630d97a2fb146102d2575b600080fd5b610258600160ea1b81565b6040519081526020015b60405180910390f35b61027e61027936600461119f565b61054a565b6040519015158152602001610262565b60408051808201909152600c81526b29bab6b6b2b9102a37b5b2b760a11b60208201525b604051610262919061135b565b61027e6102cd366004611142565b6105ab565b61025860035481565b610258610650565b61027e6102f13660046112af565b61066a565b600654610258565b61027e61030c366004611106565b61073f565b610319601281565b60405160ff9091168152602001610262565b6012610319565b600554610258565b610258680796e3ea3f8ab0000081565b61025861087f565b61025860025481565b600454610258565b6102586305a39a8081565b61025861025881565b61025860065481565b61025861038e3660046110b8565b6001600160a01b031660009081526007602052604090205490565b6103b1610891565b005b6000546103c6906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b6102586103ec366004611296565b61090c565b6102586a1b63e87c1f629e3f80000081565b60408051808201909152600681526529aaa6a6a2a960d11b60208201526102b2565b6102586104333660046112af565b61091d565b61027e610446366004611296565b610953565b61027e610459366004611142565b610b1f565b61025861046c366004611296565b610bf7565b610258600281565b6102587f000000000000000000000000000000000000000000000000000000000000000081565b610258604881565b6001546103c6906001600160a01b031681565b61027e6104c9366004611142565b610c6a565b6102586104dc3660046110d3565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6102586302d1cd4081565b6103b16105203660046110b8565b610d08565b61027e61053336600461116c565b610d67565b6102586201000081565b610258610db3565b3360009081526008602090815260408083206001600160a01b038816845290915281205484146105955760405162461bcd60e51b815260040161058c90611397565b60405180910390fd5b6105a0858484610dc5565b90505b949350505050565b60006001600160a01b038316158015906105ce57506001600160a01b0383163014155b6105ea5760405162461bcd60e51b815260040161058c9061136e565b3360008181526008602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060015b92915050565b60055460009060001990610664908261140c565b91505090565b6004546040805160208101929092526bffffffffffffffffffffffff193360601b16908201526054810183905260009081906074016040516020818303038152906040528051906020012090508281146107365760405162461bcd60e51b815260206004820152604160248201527f4368616c6c656e67652064696765737420646f6573206e6f74206d617463682060448201527f657870656374656420646967657374206f6e20746f6b656e20636f6e747261636064820152601d60fa1b608482015260a40161058c565b6105a384610953565b60006001600160a01b0383161580159061076257506001600160a01b0383163014155b61077e5760405162461bcd60e51b815260040161058c9061136e565b6001600160a01b0384166000908152600760205260409020546107a2908390611538565b6001600160a01b03851660009081526007602090815260408083209390935560088152828220338352905220546107da908390611538565b6001600160a01b0380861660009081526008602090815260408083203384528252808320949094559186168152600790915220546108199083906113f4565b6001600160a01b0380851660008181526007602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061086d9086815260200190565b60405180910390a35060019392505050565b600061088c600254610ecd565b905090565b6001546001600160a01b031633146108a857600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b600061064a60025460035484610ef6565b60008061093d84600554610931919061140c565b60025460035486610f36565b90508061094984610ecd565b6105a39190611519565b6002546000908161096382610ecd565b9050806109b25760405162461bcd60e51b815260206004820152601760248201527f526577617264206861732072656163686564207a65726f000000000000000000604482015260640161058c565b600454604080516020808201939093523360601b6bffffffffffffffffffffffff1916818301526054808201889052825180830390910181526074909101909152805191012060055480821115610a575760405162461bcd60e51b815260206004820152602360248201527f446967657374206973206c6172676572207468616e206d696e696e672074617260448201526219d95d60ea1b606482015260840161058c565b6003546000610a71610a69858561140c565b878442610f36565b90506000610a7f8287611519565b90506000610a8c82610f57565b9050610a988385610f9a565b610aa485898542610fab565b6005556000610ab28261104a565b600481905542600281905590915033907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d908590610aef90611063565b604080519283526020830191909152810184905260600160405180910390a25060019a9950505050505050505050565b60006001600160a01b03831615801590610b4257506001600160a01b0383163014155b610b5e5760405162461bcd60e51b815260040161058c9061136e565b33600090815260076020526040902054610b79908390611538565b33600090815260076020526040808220929092556001600160a01b03851681522054610ba69083906113f4565b6001600160a01b0384166000818152600760205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061063e9086815260200190565b600080610c247f000000000000000000000000000000000000000000000000000000000000000084611538565b90506302d1cd40811015610c3b5750600092915050565b6305a39a80610c4e6302d1cd4083611538565b610c58919061140c565b610c639060016113f4565b9392505050565b600080546001600160a01b03163314610c8257600080fd5b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529084169063a9059cbb90604401602060405180830381600087803b158015610cd057600080fd5b505af1158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190611274565b6000546001600160a01b03163314610d1f57600080fd5b6001600160a01b038116610d455760405162461bcd60e51b815260040161058c9061136e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526008602090815260408083206001600160a01b03871684529091528120548314610da95760405162461bcd60e51b815260040161058c90611397565b6105a384836105ab565b600060035461025861088c9190611519565b60006001600160a01b03841615801590610de857506001600160a01b0384163014155b610e045760405162461bcd60e51b815260040161058c9061136e565b3360008181526008602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3604051638f4ffcb160e01b81526001600160a01b03851690638f4ffcb190610e9190339087903090889060040161131e565b600060405180830381600087803b158015610eab57600080fd5b505af1158015610ebf573d6000803e3d6000fd5b506001979650505050505050565b6000610ed882610bf7565b610ee3906002611471565b61064a90680796e3ea3f8ab0000061140c565b60008281610258610f078786611538565b610f11919061140c565b905081811115610f1f578091505b6048821115610f2d57604891505b50949350505050565b600080610f44858585610ef6565b9050808610156105a057859150506105a3565b33600090815260076020526040812080548391908390610f789084906113f4565b9091555050600654600090610f8e9084906113f4565b60068190559392505050565b808214610fa75760038290555b5050565b600080610fb88584611538565b9050610fc661025885611519565b610fd190603d611519565b610fdc826058611519565b1015611000576064610fef876063611519565b610ff9919061140c565b955061101a565b606361100d876064611519565b611017919061140c565b95505b6201000086101561102c576201000095505b600160ea1b86111561104057600160ea1b95505b5093949350505050565b600060028261105a600143611538565b40181892915050565b60006102586110927f000000000000000000000000000000000000000000000000000000000000000084611538565b61064a919061140c565b80356001600160a01b03811681146110b357600080fd5b919050565b6000602082840312156110ca57600080fd5b610c638261109c565b600080604083850312156110e657600080fd5b6110ef8361109c565b91506110fd6020840161109c565b90509250929050565b60008060006060848603121561111b57600080fd5b6111248461109c565b92506111326020850161109c565b9150604084013590509250925092565b6000806040838503121561115557600080fd5b61115e8361109c565b946020939093013593505050565b60008060006060848603121561118157600080fd5b61118a8461109c565b95602085013595506040909401359392505050565b600080600080608085870312156111b557600080fd5b6111be8561109c565b93506020850135925060408501359150606085013567ffffffffffffffff808211156111e957600080fd5b818701915087601f8301126111fd57600080fd5b81358181111561120f5761120f611565565b604051601f8201601f19908116603f0116810190838211818310171561123757611237611565565b816040528281528a602084870101111561125057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60006020828403121561128657600080fd5b81518015158114610c6357600080fd5b6000602082840312156112a857600080fd5b5035919050565b600080604083850312156112c257600080fd5b50508035926020909101359150565b6000815180845260005b818110156112f7576020818501810151868301820152016112db565b81811115611309576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0385811682526020820185905283166040820152608060608201819052600090611351908301846112d1565b9695505050505050565b602081526000610c6360208301846112d1565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60208082526038908201527f43757272656e74207370656e64657220616c6c6f77616e636520646f6573206e60408201527f6f74206d61746368207370656369666965642076616c75650000000000000000606082015260800190565b600082198211156114075761140761154f565b500190565b60008261142957634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561146957816000190482111561144f5761144f61154f565b8085161561145c57918102915b93841c9390800290611433565b509250929050565b6000610c6383836000826114875750600161064a565b816114945750600061064a565b81600181146114aa57600281146114b4576114d0565b600191505061064a565b60ff8411156114c5576114c561154f565b50506001821b61064a565b5060208310610133831016604e8410600b84101617156114f3575081810a61064a565b6114fd838361142e565b80600019048211156115115761151161154f565b029392505050565b60008160001904831182151516156115335761153361154f565b500290565b60008282101561154a5761154a61154f565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220aeb189edc43e431c48820eba6ca313724a6777a7e8af32918a34225a7689b96964736f6c63430008050033

Deployed ByteCode Sourcemap

616:16285: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;828:35::-;;861:2;828:35;;;;;8772:4:5;8760:17;;;8742:36;;8730:2;8715:18;828:35:4;8697:87:5;10734:89:4;861:2;10734:89;;9358:100;9440:12;;9358:100;;933:53;;974:12;933:53;;9464:284;;;:::i;1519:34::-;;;;;;8938:108;9024:15;;8938:108;;1274:64;;1316:22;1274:64;;1086:45;;1128:3;1086: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;870:56::-;;909:17;870: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;777:44::-;;820:1;777:44;;1467:45;;;;;993:50;;1041:2;993: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;1178:76;;1226:28;1178: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;;1226: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;1226: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;;1128: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;;974:12;9844:36;:::i;4187:666::-;4413:7;4459:27;4413:7;1128: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;1041:2;4721:15;:39;4717:96;;;1041: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;1128: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;820:1;7289:13;7268:16;7283:1;7268:12;:16;:::i;:::-;7258:27;7250:52;:71;;6805:524;-1:-1:-1;;6805:524:4:o;7336:166::-;7415:7;1128: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://aeb189edc43e431c48820eba6ca313724a6777a7e8af32918a34225a7689b969
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.