ETH Price: $2,317.89 (-7.68%)

Contract

0x4E08F03079c5CD3083eA331Ec61bCC87538B7665
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
Approve218513142025-02-15 10:44:3511 days ago1739616275IN
0x4E08F030...7538B7665
0 ETH0.000029581.21729856
Transfer217301442025-01-29 12:19:4728 days ago1738153187IN
0x4E08F030...7538B7665
0 ETH0.000128822.37391999
Approve215319572025-01-01 20:18:5956 days ago1735762739IN
0x4E08F030...7538B7665
0 ETH0.0018404539.56767981
Transfer214163502024-12-16 16:43:2372 days ago1734367403IN
0x4E08F030...7538B7665
0 ETH0.0019845833.60514555
Transfer212247172024-11-19 22:18:1198 days ago1732054691IN
0x4E08F030...7538B7665
0 ETH0.0009788516.57161552
Transfer212120162024-11-18 3:49:11100 days ago1731901751IN
0x4E08F030...7538B7665
0 ETH0.0007875113.33242168
Approve208230002024-09-24 20:59:11155 days ago1727211551IN
0x4E08F030...7538B7665
0 ETH0.0007168929.49936878
Approve208163722024-09-23 22:49:23155 days ago1727131763IN
0x4E08F030...7538B7665
0 ETH0.0005328221.92500227
Transfer199755662024-05-29 12:37:11273 days ago1716986231IN
0x4E08F030...7538B7665
0 ETH0.0014946325.30364756
Transfer195981512024-04-06 17:23:11326 days ago1712424191IN
0x4E08F030...7538B7665
0 ETH0.0025388943
Approve195630852024-04-01 19:33:47331 days ago1712000027IN
0x4E08F030...7538B7665
0 ETH0.0006747627.76598077
Transfer193911382024-03-08 14:47:11355 days ago1709909231IN
0x4E08F030...7538B7665
0 ETH0.00622892105.47484305
Approve193868662024-03-08 0:26:47355 days ago1709857607IN
0x4E08F030...7538B7665
0 ETH0.0011469347.19502914
Transfer193602192024-03-04 7:11:11359 days ago1709536271IN
0x4E08F030...7538B7665
0 ETH0.0040166268
Transfer192437352024-02-16 23:30:11375 days ago1708126211IN
0x4E08F030...7538B7665
0 ETH0.0014176324
Transfer191002502024-01-27 20:20:11396 days ago1706386811IN
0x4E08F030...7538B7665
0 ETH0.0007590718.09221545
Transfer190997672024-01-27 18:41:11396 days ago1706380871IN
0x4E08F030...7538B7665
0 ETH0.0011813620
Transfer190813422024-01-25 4:47:11398 days ago1706158031IN
0x4E08F030...7538B7665
0 ETH0.0012401721
Transfer189726292024-01-09 23:18:11413 days ago1704842291IN
0x4E08F030...7538B7665
0 ETH0.0016419327.79729961
Approve189526012024-01-07 3:36:23416 days ago1704598583IN
0x4E08F030...7538B7665
0 ETH0.0011480524.67556246
Transfer189172042024-01-02 4:03:11421 days ago1704168191IN
0x4E08F030...7538B7665
0 ETH0.0007057913
Transfer189158202024-01-01 23:23:23421 days ago1704151403IN
0x4E08F030...7538B7665
0 ETH0.0007595814
Approve188531162023-12-24 4:00:23430 days ago1703390423IN
0x4E08F030...7538B7665
0 ETH0.0004323517.790869
Transfer188434232023-12-22 19:20:11432 days ago1703272811IN
0x4E08F030...7538B7665
0 ETH0.0023031839
Transfer187958402023-12-16 3:03:11438 days ago1702695791IN
0x4E08F030...7538B7665
0 ETH0.0044970476.13327304
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DoubleDiceToken

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : DoubleDiceToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.6; 

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 
 
import "./IDoubleDiceToken.sol";

/**
 *                            ________
 *                 ________  / o   o /\
 *                /     o /\/   o   /o \ 
 *               /   o   /  \o___o_/o   \
 *              /_o_____/o   \     \   o/ 
 *              \ o   o \   o/  o   \ o/ 
 *  ______     __\ o   o \  /\_______\/       _____     ____    ____    ____   _______ 
 * |  __  \   /   \_o___o_\/ |  _ \  | |     |  ___|   |  _ \  |_  _|  / ___| |   ____|
 * | |  \  | | / \ | | | | | | |_| | | |     | |_      | | \ |   ||   | /     |  |
 * | |   | | | | | | | | | | |  _ <  | |     |  _|     | | | |   I|   | |     |  |__
 * |D|   |D| |O\_/O| |U|_|U| |B|_|B| |L|___  |E|___    |D|_/D|  _I|_  |C\___  |EEEEE| 
 * |D|__/DD|  \OOO/   \UUU/  |BBBB/  |LLLLL| |EEEEE|   |DDDD/  |IIII|  \CCCC| |EE|____ 
 * |DDDDDD/  ================================================================ |EEEEEEE| 
 *
 * @title DoubleDice DODI token contract
 * @author DoubleDice Team <[email protected]>
 * @custom:security-contact [email protected]
 * @notice ERC-20 token extended with special yield-distribution functionality.
 *
 * A supply of 10 billion DODI was minted at contract creation: 
 * - 6.3 billion were minted to an initial token holder `initTokenHolder` 
 * - 3.7 billion were minted to a reserved `UNDISTRIBUTED_YIELD_ACCOUNT` address 
 * 
 * It is not possible to mint further DODI beyond the 10 billion DODI minted at contract creation. 
 *
 * The DODI on the `UNDISTRIBUTED_YIELD_ACCOUNT` is controlled by the `owner()` of this contract. 
 * The `owner()` may choose to: 
 * - Distribute a portion or all of the remaining undistributed yield to token holders via `distributeYield` 
 * - Burn a portion or all of the remaining undistributed yield via `burnUndistributedYield`, 
 *   thus decreasing the total DODI supply 
 *
 * The `owner()` of this contract has no special powers besides the ability 
 * to distribute or burn the 3.7 billion DODI yield.
 *
 * When an amount of yield is released from `UNDISTRIBUTED_YIELD_ACCOUNT` to be distributed to token 
 * holders, it is transferred to a second reserved `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT` address. 
 * Token holders may then call `claimYield()` to transfer their received yield
 * from `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT` to themselves.
 * 
 * Different operations affect `balanceOf(account)` and `unclaimedYieldOf(account)` as follows: 
 * - `transfer` and `transferFrom` alter `balanceOf(account)`, 
 *   but without altering `unclaimedYieldOf(account)`. 
 * - Unless `account` is explicitly excluded from a distribution, `distributeYield` alters `unclaimedYieldOf(account)`,
 *   but without altering `balanceOf(account)`. 
 * - `claimYield` and `claimYieldFor` alter both `balanceOf(account)` and `unclaimedYieldOf(account)`,
 *   but without altering their sum `balanceOf(account) + unclaimedYieldOf(account)` 
 */
contract DoubleDiceToken is
    IDoubleDiceToken, 
    ERC20("DoubleDice Token", "DODI"),
    Ownable
{
    /// @notice Account holding the portion of the 3.7 billion DODI that have not yet been distributed or burned by `owner()` 
    address constant public UNDISTRIBUTED_YIELD_ACCOUNT = 0xD0D1000000000000000000000000000000000001;

    /// @notice Account holding yield that has been distributed, but not yet claimed by its recipient
    address constant public UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT = 0xd0D1000000000000000000000000000000000002; 
 
    function _isReservedAccount(address account) internal pure returns (bool) { 
        return account == UNDISTRIBUTED_YIELD_ACCOUNT || account == UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT;
    }

    /// @dev Holds unclaimed-yield state for a specific account 
    struct AccountEntry {
        /// @dev The amount of unclaimed tokens for this account, at the instant it was last updated in 
        /// either `_captureUnclaimedYield()`, or `claimYieldFor()` or `distributeYield()`.
        uint256 capturedUnclaimedYield;

        /// @dev The value of `_factor` at the instant `capturedUnclaimedYield` was last updated
        uint256 factorAtCapture; 
    }
 
    /// @dev The state for an account is stored in this mapping in conjunction with 
    /// the ERC-20 balance, which is managed in the base ERC20 contract 
    mapping(address => AccountEntry) internal _entries;
 
    /// @dev Sets the precision at which calculations are performed in this contract.
    /// The larger the value of `ONE`, the more miniscule the rounding errors in this contract. 
    /// With `ONE` set to 1e47, it can be proven that the largest computation in this contract
    /// will never result in uint256 overflow, given the following 3 assumptions hold true. 
    uint256 constant internal ONE = 1e47;

    /// @dev Assumption 1 of 3: Holds true because the contract was created with 10 billion * 1e18 tokens 
    uint256 constant private _ASSUMED_MAX_INIT_TOTAL_SUPPLY = 20e9 * 1e18; 
 
    /// @dev Assumption 2 of 3: Holds true because 10 / (10 - 3.7) = 1.5873 <= 2
    uint256 constant private _ASSUMED_MAX_INIT_TOTAL_TO_INIT_CIRCULATING_SUPPLY_RATIO = 2;
 
    /// @dev Assumption 3 of 3: Holds true because it is `require`-d in `distributeYield()` 
    uint256 constant private _ASSUMED_MIN_TOTAL_CIRCULATING_TO_EXCLUDED_CIRCULATING_SUPPLY_RATIO = 2; 

    function _checkOverflowProtectionAssumptionsConstructor(uint256 initTotalSupply, uint256 totalYieldAmount) internal pure {
        require(initTotalSupply <= _ASSUMED_MAX_INIT_TOTAL_SUPPLY, "Broken assumption"); 
        uint256 initCirculatingSupply = initTotalSupply - totalYieldAmount;
        // C/T = initCirculatingSupply / initTotalSupply >= 0.5
        require(initCirculatingSupply * _ASSUMED_MAX_INIT_TOTAL_TO_INIT_CIRCULATING_SUPPLY_RATIO >= initTotalSupply, "Broken assumption"); 
    }
 
    function _checkOverflowProtectionAssumptionsDistributeYield(uint256 totalCirculatingSupply, uint256 excludedCirculatingSupply) internal pure { 
        // epsilon = excludedCirculatingSupply / totalCirculatingSupply <= 0.5
        require((excludedCirculatingSupply * _ASSUMED_MIN_TOTAL_CIRCULATING_TO_EXCLUDED_CIRCULATING_SUPPLY_RATIO) <= totalCirculatingSupply, "Broken assumption");
    } 
 
    /// @dev Yield distribution to all accounts is recorded by increasing (eagerly) this contract-wide `_factor`, 
    /// and received yield is acknowledged by an `account` by reconciling (lazily) its `_entries[account]`
    /// with this contract-wide `_factor`.
    uint256 internal _factor;
 
    /// @notice Returns `balanceOf(account) + unclaimedYieldOf(account)`
    /// @custom:reverts-with "Reserved account" if called for `UNDISTRIBUTED_YIELD_ACCOUNT` or `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT`
    function balancePlusUnclaimedYieldOf(address account) public view returns (uint256) { 
        require(!_isReservedAccount(account), "Reserved account");

        AccountEntry storage entry = _entries[account];
        return ((ONE + _factor) * (balanceOf(account) + entry.capturedUnclaimedYield)) / (ONE + entry.factorAtCapture);
    } 

    /// @notice Returns the total yield token amount claimable by `account`.
    /// @dev The tokens received by `account` during a yield-distribution do not appear immediately on `balanceOf(account)`, 
    /// but they appear instantly on `unclaimedYieldOf(account)` and `balancePlusUnclaimedYieldOf(account)`.
    /// Transferring tokens from `account` to another account `other` does not affect 
    /// `unclaimedYieldOf(account)` or `unclaimedYieldOf(other)`.
    /// @custom:reverts-with "Reserved account" if called for `UNDISTRIBUTED_YIELD_ACCOUNT` or `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT` 
    function unclaimedYieldOf(address account) public view returns (uint256) {
        return balancePlusUnclaimedYieldOf(account) - balanceOf(account);
    }

    /// @notice Emitted every time the yield claimable by `account` increases by a non-zero amount `byAmount`. 
    /// After `claimYieldFor(account)` is called, the sum of all yield ever claimed for `account`,
    /// (which equals the total amount ever transferred from `UNCLAIMED_DISTRIBUTED_YIELD` to `account`),
    /// should equal the sum of `byAmount` over all `UnclaimedYieldIncrease` events ever emitted for `account`.
    event UnclaimedYieldIncrease(address indexed account, uint256 byAmount);
 
    /// @dev The value `unclaimedYieldOf(account)` always reflects  exact amount of yield that is claimable by `account`.
    /// If there is a discrepancy between `unclaimedYieldOf(account)` and the value present in `_entries[account].capturedUnclaimedYield`,
    /// then this function rectifies that discrepancy while maintaining `balanceOf(account)` and `unclaimedYieldOf(account)` constant.
    function _captureUnclaimedYield(address account) internal {
        AccountEntry storage entry = _entries[account];

        // _factor can only increase, never decrease 
        assert(entry.factorAtCapture <= _factor); 
 
        if (entry.factorAtCapture == _factor) { 
            // No yield distribution since last calculation
            return; 
        } 

        // Recalculate *before* `factorAtCapture` is updated, 
        // because `unclaimedYieldOf` depends on its value pre-update
        uint256 newUnclaimedYield = unclaimedYieldOf(account);
 
        // Update *after* `unclaimedYieldOf` has been calculated 
        entry.factorAtCapture = _factor; 

        // Finally update `capturedUnclaimedYield` 
        uint256 increase = newUnclaimedYield - entry.capturedUnclaimedYield;
        if (increase > 0) { 
            entry.capturedUnclaimedYield = newUnclaimedYield;
            emit UnclaimedYieldIncrease(account, increase); 
        }
    } 
 
    constructor( 
        uint256 initTotalSupply, 
        uint256 totalYieldAmount,
        address initTokenHolder 
    ) {
        require(totalYieldAmount <= initTotalSupply, "Invalid params"); 
 
        _checkOverflowProtectionAssumptionsConstructor(initTotalSupply, totalYieldAmount);
 
        // invoke ERC._mint directly to bypass yield corrections
        ERC20._mint(UNDISTRIBUTED_YIELD_ACCOUNT, totalYieldAmount);
        ERC20._mint(initTokenHolder, initTotalSupply - totalYieldAmount);
    }


    /// @dev Overriding `_transfer` affects `transfer` and `transferFrom`. 
    /// `_mint` and `_burn` could be overridden in a similar fashion, but are not, 
    /// as all mints and burns are done directly via `ERC20._mint` and `ERC20._burn`
    /// so as to bypass yield correction. 
    /// @custom:reverts-with "Transfer from reserved account" if `from` is `UNDISTRIBUTED_YIELD_ACCOUNT` or `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT`
    /// @custom:reverts-with "Transfer to reserved account" if `to` is `UNDISTRIBUTED_YIELD_ACCOUNT` or `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT`
    function _transfer(address from, address to, uint256 amount) internal virtual override {
        require(!_isReservedAccount(from), "Transfer from reserved account");
        require(!_isReservedAccount(to), "Transfer to reserved account"); 
        _captureUnclaimedYield(from);
        _captureUnclaimedYield(to);
        // invoke ERC._transfer directly to bypass yield corrections 
        ERC20._transfer(from, to, amount); 
    }
 
    event YieldDistribution(uint256 yieldDistributed, address[] excludedAccounts); 
 
    /// @notice Distribute yield to all token holders except `excludedAccounts` 
    /// @custom:reverts-with "Ownable: caller is not the owner" if called by an account that is not `owner()`
    /// @custom:reverts-with "Duplicate/unordered account" if `excludedAccounts` contains 0-account,
    /// @custom:reverts-with "Reserved account" if `excludedAccounts` contains `UNDISTRIBUTED_YIELD_ACCOUNT` or `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT`,
    /// is not in ascending order, or contains duplicate addresses. 
    /// @custom:reverts-with "Broken assumption" if the total `balancePlusUnclaimedYieldOf` for all `excludedAccounts` 
    /// exceeds half the circulating supply (which is `totalSupply() - balanceOf(UNDISTRIBUTED_YIELD_ACCOUNT)`). 
    /// @custom:emits-event UnclaimedYieldIncrease if operation results in an increase in `capturedUnclaimedYield` 
    /// for one of the `excludedAccounts`
    /// @custom:emits-event Transfer(UNDISTRIBUTED_YIELD_ACCOUNT, UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT, yieldDistributed)
    /// @custom:emits-event YieldDistribution(amount, excludedAccounts)
    function distributeYield(uint256 amount, address[] calldata excludedAccounts) external onlyOwner {
        // ERC20 functions reject mints/transfers to zero-address, 
        // so zero-address can never have balance that we want to exclude from calculations. 
        address prevExcludedAccount = 0x0000000000000000000000000000000000000000; 

        uint256 excludedCirculatingSupply = 0; 
        for (uint256 i = 0; i < excludedAccounts.length; i++) {
            address account = excludedAccounts[i]; 
 
            require(prevExcludedAccount < account, "Duplicate/unordered account"); 
            prevExcludedAccount = account; // prepare for next iteration immediately 
 
            require(!_isReservedAccount(account), "Reserved account"); 

            // The excluded account itself might have a stale `capturedUnclaimedYield` value, 
            // so it is brought up to date with pre-distribution `_factor` 
            _captureUnclaimedYield(account);

            excludedCirculatingSupply += balancePlusUnclaimedYieldOf(account);
        } 

        // totalSupply = balanceOfBefore(UNDISTRIBUTED_YIELD) + (sumOfBalanceOfExcluded + balanceOf(UNCLAIMED_DISTRIBUTED_YIELD) + sumOfBalanceOfIncludedBefore)
        // totalSupply = balanceOfBefore(UNDISTRIBUTED_YIELD) + (            excludedCirculatingSupply        +        includedCirculatingSupplyBefore         ) 
        // totalSupply = balanceOfBefore(UNDISTRIBUTED_YIELD) + (                               totalCirculatingSupplyBefore                                   ) 
        uint256 totalCirculatingSupplyBefore = totalSupply() - balanceOf(UNDISTRIBUTED_YIELD_ACCOUNT);

        _checkOverflowProtectionAssumptionsDistributeYield(totalCirculatingSupplyBefore, excludedCirculatingSupply); 
 
        // includedCirculatingSupplyBefore = sum(balancePlusUnclaimedYieldOf(account) for account in includedAccounts)
        uint256 includedCirculatingSupplyBefore = totalCirculatingSupplyBefore - excludedCirculatingSupply; 

        // totalSupply = (balanceBeforeOf(UNDISTRIBUTED_YIELD)         ) + (           includedCirculatingSupplyBefore) + (excludedCirculatingSupply)
        // totalSupply = (balanceBeforeOf(UNDISTRIBUTED_YIELD) - amount) + (amount  +  includedCirculatingSupplyBefore) + (excludedCirculatingSupply)
        // totalSupply = (     balanceAfterOf(UNDISTRIBUTED_YIELD)     ) + (    includedCirculatingSupplyAfter        ) + (excludedCirculatingSupply) 
        uint256 includedCirculatingSupplyAfter = includedCirculatingSupplyBefore + amount; 
 
        _factor = ((ONE + _factor) * includedCirculatingSupplyAfter) / includedCirculatingSupplyBefore - ONE; 

        for (uint256 i = 0; i < excludedAccounts.length; i++) {
            // Force this account to "miss out on" this distribution
            // by "fast-forwarding" its `_factor` to the new value 
            // without actually changing its balance or unclaimedYield 
            _entries[excludedAccounts[i]].factorAtCapture = _factor; 
        } 

        // invoke ERC._transfer directly to bypass yield corrections 
        ERC20._transfer(UNDISTRIBUTED_YIELD_ACCOUNT, UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT, amount); 

        emit YieldDistribution(amount, excludedAccounts);
    } 

    /// @notice Burn an `amount` of undistributed yield. 
    /// @custom:reverts-with "Ownable: caller is not the owner" if called by an account that is not `owner()` 
    /// @custom:reverts-with "ERC20: burn amount exceeds balance" if `amount` exceeds `balanceOf(UNDISTRIBUTED_YIELD_ACCOUNT)`
    /// @custom:emits-event "Transfer(UNDISTRIBUTED_YIELD_ACCOUNT, address(0), amount)" 
    function burnUndistributedYield(uint256 amount) external onlyOwner {
        // invoke ERC._transfer directly to bypass yield corrections 
        ERC20._burn(UNDISTRIBUTED_YIELD_ACCOUNT, amount); 
    }
 
    /// @notice Yield received by `account` from a distribution will be reflected in `balanceOf(account)` 
    /// only after `claimYieldFor(account)` has been called. 
    /// @custom:reverts-with "Reserved account" if called for `UNDISTRIBUTED_YIELD_ACCOUNT` or `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT`
    /// @custom:emits-event UnclaimedYieldIncrease if operation results in an increase in `capturedUnclaimedYield` 
    /// @custom:emits-event Transfer(UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT, account, unclaimedYieldOf(account)) 
    function claimYieldFor(address account) public { 

        // Without this check (and without the check in balancePlusUnclaimedYieldOf), 
        // it would be possible for anyone to claim yield for one of the reserved accounts, 
        // and this would destabilize the accounting system.
        require(!_isReservedAccount(account), "Reserved account"); 

        // Not entirely necessary, because ERC20._transfer will block 0-account 
        // from receiving any balance, but it is stopped in its tracks anyway. 
        require(account != address(0), "Zero account");
 
        _captureUnclaimedYield(account); 
        AccountEntry storage entry = _entries[account]; 
 
        // balanceOf(account) += entry.capturedUnclaimedYield 
        // entry.capturedUnclaimedYield -= entry.capturedUnclaimedYield
        // => (balanceOf(account) + entry.capturedUnclaimedYield) is invariant
        ERC20._transfer(UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT, account, entry.capturedUnclaimedYield); 
        entry.capturedUnclaimedYield = 0;
 
        // A `Transfer` event from `UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT` always signifies a yield-claim,
        // so no special "YieldClaim" event is emitted 
    } 

    /// @notice Calls `claimYieldFor` for the caller.
    function claimYield() external override {
        claimYieldFor(_msgSender()); 
    }
}

File 2 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 7 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 7 : IDoubleDiceToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.6;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IDoubleDiceToken is IERC20 {

    function claimYield() external;

}

File 5 of 7 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 6 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 7 of 7 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initTotalSupply","type":"uint256"},{"internalType":"uint256","name":"totalYieldAmount","type":"uint256"},{"internalType":"address","name":"initTokenHolder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"byAmount","type":"uint256"}],"name":"UnclaimedYieldIncrease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yieldDistributed","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"excludedAccounts","type":"address[]"}],"name":"YieldDistribution","type":"event"},{"inputs":[],"name":"UNCLAIMED_DISTRIBUTED_YIELD_ACCOUNT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNDISTRIBUTED_YIELD_ACCOUNT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balancePlusUnclaimedYieldOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnUndistributedYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimYieldFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"excludedAccounts","type":"address[]"}],"name":"distributeYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unclaimedYieldOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162001af238038062001af28339810160408190526200003491620003fe565b604080518082018252601081526f2237bab13632a234b1b2902a37b5b2b760811b602080830191825283518085019094526004845263444f444960e01b908401528151919291620000889160039162000358565b5080516200009e90600490602084019062000358565b505050620000bb620000b56200016460201b60201c565b62000168565b82821115620001025760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b60448201526064015b60405180910390fd5b6200010e8383620001ba565b6200013973d0d1000000000000000000000000000000000001836200027360201b62000ac91760201c565b6200015b816200014a848662000483565b6200027360201b62000ac91760201c565b505050620004f0565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6b409f9cbc7c4a04c2200000008211156200020c5760405162461bcd60e51b8152602060048201526011602482015270213937b5b2b71030b9b9bab6b83a34b7b760791b6044820152606401620000f9565b60006200021a828462000483565b9050826200022a60028362000461565b10156200026e5760405162461bcd60e51b8152602060048201526011602482015270213937b5b2b71030b9b9bab6b83a34b7b760791b6044820152606401620000f9565b505050565b6001600160a01b038216620002cb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620000f9565b8060026000828254620002df919062000446565b90915550506001600160a01b038216600090815260208190526040812080548392906200030e90849062000446565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b82805462000366906200049d565b90600052602060002090601f0160209004810192826200038a5760008555620003d5565b82601f10620003a557805160ff1916838001178555620003d5565b82800160010185558215620003d5579182015b82811115620003d5578251825591602001919060010190620003b8565b50620003e3929150620003e7565b5090565b5b80821115620003e35760008155600101620003e8565b6000806000606084860312156200041457600080fd5b83516020850151604086015191945092506001600160a01b03811681146200043b57600080fd5b809150509250925092565b600082198211156200045c576200045c620004da565b500190565b60008160001904831182151516156200047e576200047e620004da565b500290565b600082821015620004985762000498620004da565b500390565b600181811c90821680620004b257607f821691505b60208210811415620004d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6115f280620005006000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063a9059cbb1161007c578063a9059cbb14610296578063b47d7a02146102a9578063ccd833bc146102b8578063dd62ed3e146102cb578063f14aa71f14610304578063f2fde38b1461031357600080fd5b8063715018a61461023b578063842ba284146102435780638da5cb5b1461025657806395d89b411461027b578063a457c2d71461028357600080fd5b80632b1c303f1161010a5780632b1c303f146101c2578063313ce567146101d557806339509351146101e4578063406cf229146101f757806368432956146101ff57806370a082311461021257600080fd5b806306fdde0314610147578063095ea7b314610165578063152244911461018857806318160ddd1461019d57806323b872dd146101af575b600080fd5b61014f610326565b60405161015c91906113aa565b60405180910390f35b6101786101733660046112e8565b6103b8565b604051901515815260200161015c565b61019b61019636600461125e565b6103ce565b005b6002545b60405190815260200161015c565b6101786101bd3660046112ac565b610481565b6101a16101d036600461125e565b61052b565b6040516012815260200161015c565b6101786101f23660046112e8565b6105e9565b61019b610625565b6101a161020d36600461125e565b610630565b6101a161022036600461125e565b6001600160a01b031660009081526020819052604090205490565b61019b610662565b61019b610251366004611312565b610696565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b61014f6106d5565b6101786102913660046112e8565b6106e4565b6101786102a43660046112e8565b61077d565b610263600161d0d160901b0181565b61019b6102c636600461132b565b61078a565b6101a16102d9366004611279565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610263600261d0d160901b0181565b61019b61032136600461125e565b610a31565b60606003805461033590611524565b80601f016020809104026020016040519081016040528092919081815260200182805461036190611524565b80156103ae5780601f10610383576101008083540402835291602001916103ae565b820191906000526020600020905b81548152906001019060200180831161039157829003601f168201915b5050505050905090565b60006103c5338484610ba9565b50600192915050565b6103d781610ccd565b156103fd5760405162461bcd60e51b81526004016103f4906113ff565b60405180910390fd5b6001600160a01b0381166104425760405162461bcd60e51b815260206004820152600c60248201526b16995c9bc81858d8dbdd5b9d60a21b60448201526064016103f4565b61044b81610d03565b6001600160a01b0381166000908152600660205260409020805461047a90600261d0d160901b01908490610db8565b6000905550565b600061048e848484610f86565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105135760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016103f4565b6105208533858403610ba9565b506001949350505050565b600061053682610ccd565b156105535760405162461bcd60e51b81526004016103f4906113ff565b6001600160a01b0382166000908152600660205260409020600181015461058b906d23084f676940b7915149bd08b30d602f1b6114b4565b81546001600160a01b0385166000908152602081905260409020546105b091906114b4565b6007546105ce906d23084f676940b7915149bd08b30d602f1b6114b4565b6105d891906114ee565b6105e291906114cc565b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916103c59185906106209086906114b4565b610ba9565b61062e336103ce565b565b6001600160a01b0381166000908152602081905260408120546106528361052b565b61065c919061150d565b92915050565b6005546001600160a01b0316331461068c5760405162461bcd60e51b81526004016103f490611429565b61062e6000611054565b6005546001600160a01b031633146106c05760405162461bcd60e51b81526004016103f490611429565b6106d2600161d0d160901b01826110a6565b50565b60606004805461033590611524565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156107665760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103f4565b6107733385858403610ba9565b5060019392505050565b60006103c5338484610f86565b6005546001600160a01b031633146107b45760405162461bcd60e51b81526004016103f490611429565b60008060005b838110156108a95760008585838181106107d6576107d66115a6565b90506020020160208101906107eb919061125e565b9050806001600160a01b0316846001600160a01b03161061084e5760405162461bcd60e51b815260206004820152601b60248201527f4475706c69636174652f756e6f726465726564206163636f756e74000000000060448201526064016103f4565b80935061085a81610ccd565b156108775760405162461bcd60e51b81526004016103f4906113ff565b61088081610d03565b6108898161052b565b61089390846114b4565b92505080806108a19061155f565b9150506107ba565b50600161d0d160901b01600090815260208190527fa903aefa3a121205409f4e30eaebdf06f978799ada4e7ce995c68acd6584ae6f546002546108ec919061150d565b90506108f881836111f4565b6000610904838361150d565b9050600061091288836114b4565b90506d23084f676940b7915149bd08b30d602f1b82826007546d23084f676940b7915149bd08b30d602f1b61094791906114b4565b61095191906114ee565b61095b91906114cc565b610965919061150d565b60075560005b868110156109d057600754600660008a8a8581811061098c5761098c6115a6565b90506020020160208101906109a1919061125e565b6001600160a01b03168152602081019190915260400160002060010155806109c88161155f565b91505061096b565b506109ec600161d0d160901b01600261d0d160901b018a610db8565b7f5ecfce12e3fd433c5d84396c666fa46ddd10da84a73260d08a273fc32be06e7b888888604051610a1f9392919061145e565b60405180910390a15050505050505050565b6005546001600160a01b03163314610a5b5760405162461bcd60e51b81526004016103f490611429565b6001600160a01b038116610ac05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b6106d281611054565b6001600160a01b038216610b1f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103f4565b8060026000828254610b3191906114b4565b90915550506001600160a01b03821660009081526020819052604081208054839290610b5e9084906114b4565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050565b6001600160a01b038316610c0b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103f4565b6001600160a01b038216610c6c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103f4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038216600161d0d160901b01148061065c57506001600160a01b038216600261d0d160901b011492915050565b6001600160a01b038116600090815260066020526040902060075460018201541115610d3157610d3161157a565b60075481600101541415610d43575050565b6000610d4e83610630565b60075460018401558254909150600090610d68908361150d565b90508015610db2578183556040518181526001600160a01b038516907f4365150e0ef3a1a1b4a0fd9ba050e9be3d9f51e8203142529d4bb8d74c35b5059060200160405180910390a25b50505050565b6001600160a01b038316610e1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103f4565b6001600160a01b038216610e7e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103f4565b6001600160a01b03831660009081526020819052604090205481811015610ef65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103f4565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610f2d9084906114b4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f7991815260200190565b60405180910390a3610db2565b610f8f83610ccd565b15610fdc5760405162461bcd60e51b815260206004820152601e60248201527f5472616e736665722066726f6d207265736572766564206163636f756e74000060448201526064016103f4565b610fe582610ccd565b156110325760405162461bcd60e51b815260206004820152601c60248201527f5472616e7366657220746f207265736572766564206163636f756e740000000060448201526064016103f4565b61103b83610d03565b61104482610d03565b61104f838383610db8565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166111065760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103f4565b6001600160a01b0382166000908152602081905260409020548181101561117a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016103f4565b6001600160a01b03831660009081526020819052604081208383039055600280548492906111a990849061150d565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b816112006002836114ee565b1115610ba55760405162461bcd60e51b8152602060048201526011602482015270213937b5b2b71030b9b9bab6b83a34b7b760791b60448201526064016103f4565b80356001600160a01b038116811461125957600080fd5b919050565b60006020828403121561127057600080fd5b6105e282611242565b6000806040838503121561128c57600080fd5b61129583611242565b91506112a360208401611242565b90509250929050565b6000806000606084860312156112c157600080fd5b6112ca84611242565b92506112d860208501611242565b9150604084013590509250925092565b600080604083850312156112fb57600080fd5b61130483611242565b946020939093013593505050565b60006020828403121561132457600080fd5b5035919050565b60008060006040848603121561134057600080fd5b83359250602084013567ffffffffffffffff8082111561135f57600080fd5b818601915086601f83011261137357600080fd5b81358181111561138257600080fd5b8760208260051b850101111561139757600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156113d7578581018301518582016040015282016113bb565b818111156113e9576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f14995cd95c9d9959081858d8dbdd5b9d60821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b83815260406020808301829052908201839052600090849060608401835b868110156114a8576001600160a01b0361149585611242565b168252928201929082019060010161147c565b50979650505050505050565b600082198211156114c7576114c7611590565b500190565b6000826114e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561150857611508611590565b500290565b60008282101561151f5761151f611590565b500390565b600181811c9082168061153857607f821691505b6020821081141561155957634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561157357611573611590565b5060010190565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220632003a3e67378a6bdb255c71b0dc9dcc1555cefc8aefc7a80e7120bda77b89564736f6c634300080600330000000000000000000000000000000000000000204fce5e3e2502611000000000000000000000000000000000000000000000000bf49179e8e9da7af40000000000000000000000000000004b64e8187e44810e828a9e97c2feb01f2e3b8cc6

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063a9059cbb1161007c578063a9059cbb14610296578063b47d7a02146102a9578063ccd833bc146102b8578063dd62ed3e146102cb578063f14aa71f14610304578063f2fde38b1461031357600080fd5b8063715018a61461023b578063842ba284146102435780638da5cb5b1461025657806395d89b411461027b578063a457c2d71461028357600080fd5b80632b1c303f1161010a5780632b1c303f146101c2578063313ce567146101d557806339509351146101e4578063406cf229146101f757806368432956146101ff57806370a082311461021257600080fd5b806306fdde0314610147578063095ea7b314610165578063152244911461018857806318160ddd1461019d57806323b872dd146101af575b600080fd5b61014f610326565b60405161015c91906113aa565b60405180910390f35b6101786101733660046112e8565b6103b8565b604051901515815260200161015c565b61019b61019636600461125e565b6103ce565b005b6002545b60405190815260200161015c565b6101786101bd3660046112ac565b610481565b6101a16101d036600461125e565b61052b565b6040516012815260200161015c565b6101786101f23660046112e8565b6105e9565b61019b610625565b6101a161020d36600461125e565b610630565b6101a161022036600461125e565b6001600160a01b031660009081526020819052604090205490565b61019b610662565b61019b610251366004611312565b610696565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b61014f6106d5565b6101786102913660046112e8565b6106e4565b6101786102a43660046112e8565b61077d565b610263600161d0d160901b0181565b61019b6102c636600461132b565b61078a565b6101a16102d9366004611279565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610263600261d0d160901b0181565b61019b61032136600461125e565b610a31565b60606003805461033590611524565b80601f016020809104026020016040519081016040528092919081815260200182805461036190611524565b80156103ae5780601f10610383576101008083540402835291602001916103ae565b820191906000526020600020905b81548152906001019060200180831161039157829003601f168201915b5050505050905090565b60006103c5338484610ba9565b50600192915050565b6103d781610ccd565b156103fd5760405162461bcd60e51b81526004016103f4906113ff565b60405180910390fd5b6001600160a01b0381166104425760405162461bcd60e51b815260206004820152600c60248201526b16995c9bc81858d8dbdd5b9d60a21b60448201526064016103f4565b61044b81610d03565b6001600160a01b0381166000908152600660205260409020805461047a90600261d0d160901b01908490610db8565b6000905550565b600061048e848484610f86565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105135760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016103f4565b6105208533858403610ba9565b506001949350505050565b600061053682610ccd565b156105535760405162461bcd60e51b81526004016103f4906113ff565b6001600160a01b0382166000908152600660205260409020600181015461058b906d23084f676940b7915149bd08b30d602f1b6114b4565b81546001600160a01b0385166000908152602081905260409020546105b091906114b4565b6007546105ce906d23084f676940b7915149bd08b30d602f1b6114b4565b6105d891906114ee565b6105e291906114cc565b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916103c59185906106209086906114b4565b610ba9565b61062e336103ce565b565b6001600160a01b0381166000908152602081905260408120546106528361052b565b61065c919061150d565b92915050565b6005546001600160a01b0316331461068c5760405162461bcd60e51b81526004016103f490611429565b61062e6000611054565b6005546001600160a01b031633146106c05760405162461bcd60e51b81526004016103f490611429565b6106d2600161d0d160901b01826110a6565b50565b60606004805461033590611524565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156107665760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103f4565b6107733385858403610ba9565b5060019392505050565b60006103c5338484610f86565b6005546001600160a01b031633146107b45760405162461bcd60e51b81526004016103f490611429565b60008060005b838110156108a95760008585838181106107d6576107d66115a6565b90506020020160208101906107eb919061125e565b9050806001600160a01b0316846001600160a01b03161061084e5760405162461bcd60e51b815260206004820152601b60248201527f4475706c69636174652f756e6f726465726564206163636f756e74000000000060448201526064016103f4565b80935061085a81610ccd565b156108775760405162461bcd60e51b81526004016103f4906113ff565b61088081610d03565b6108898161052b565b61089390846114b4565b92505080806108a19061155f565b9150506107ba565b50600161d0d160901b01600090815260208190527fa903aefa3a121205409f4e30eaebdf06f978799ada4e7ce995c68acd6584ae6f546002546108ec919061150d565b90506108f881836111f4565b6000610904838361150d565b9050600061091288836114b4565b90506d23084f676940b7915149bd08b30d602f1b82826007546d23084f676940b7915149bd08b30d602f1b61094791906114b4565b61095191906114ee565b61095b91906114cc565b610965919061150d565b60075560005b868110156109d057600754600660008a8a8581811061098c5761098c6115a6565b90506020020160208101906109a1919061125e565b6001600160a01b03168152602081019190915260400160002060010155806109c88161155f565b91505061096b565b506109ec600161d0d160901b01600261d0d160901b018a610db8565b7f5ecfce12e3fd433c5d84396c666fa46ddd10da84a73260d08a273fc32be06e7b888888604051610a1f9392919061145e565b60405180910390a15050505050505050565b6005546001600160a01b03163314610a5b5760405162461bcd60e51b81526004016103f490611429565b6001600160a01b038116610ac05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b6106d281611054565b6001600160a01b038216610b1f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103f4565b8060026000828254610b3191906114b4565b90915550506001600160a01b03821660009081526020819052604081208054839290610b5e9084906114b4565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050565b6001600160a01b038316610c0b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103f4565b6001600160a01b038216610c6c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103f4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038216600161d0d160901b01148061065c57506001600160a01b038216600261d0d160901b011492915050565b6001600160a01b038116600090815260066020526040902060075460018201541115610d3157610d3161157a565b60075481600101541415610d43575050565b6000610d4e83610630565b60075460018401558254909150600090610d68908361150d565b90508015610db2578183556040518181526001600160a01b038516907f4365150e0ef3a1a1b4a0fd9ba050e9be3d9f51e8203142529d4bb8d74c35b5059060200160405180910390a25b50505050565b6001600160a01b038316610e1c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103f4565b6001600160a01b038216610e7e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103f4565b6001600160a01b03831660009081526020819052604090205481811015610ef65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103f4565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610f2d9084906114b4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f7991815260200190565b60405180910390a3610db2565b610f8f83610ccd565b15610fdc5760405162461bcd60e51b815260206004820152601e60248201527f5472616e736665722066726f6d207265736572766564206163636f756e74000060448201526064016103f4565b610fe582610ccd565b156110325760405162461bcd60e51b815260206004820152601c60248201527f5472616e7366657220746f207265736572766564206163636f756e740000000060448201526064016103f4565b61103b83610d03565b61104482610d03565b61104f838383610db8565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166111065760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103f4565b6001600160a01b0382166000908152602081905260409020548181101561117a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016103f4565b6001600160a01b03831660009081526020819052604081208383039055600280548492906111a990849061150d565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b816112006002836114ee565b1115610ba55760405162461bcd60e51b8152602060048201526011602482015270213937b5b2b71030b9b9bab6b83a34b7b760791b60448201526064016103f4565b80356001600160a01b038116811461125957600080fd5b919050565b60006020828403121561127057600080fd5b6105e282611242565b6000806040838503121561128c57600080fd5b61129583611242565b91506112a360208401611242565b90509250929050565b6000806000606084860312156112c157600080fd5b6112ca84611242565b92506112d860208501611242565b9150604084013590509250925092565b600080604083850312156112fb57600080fd5b61130483611242565b946020939093013593505050565b60006020828403121561132457600080fd5b5035919050565b60008060006040848603121561134057600080fd5b83359250602084013567ffffffffffffffff8082111561135f57600080fd5b818601915086601f83011261137357600080fd5b81358181111561138257600080fd5b8760208260051b850101111561139757600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156113d7578581018301518582016040015282016113bb565b818111156113e9576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f14995cd95c9d9959081858d8dbdd5b9d60821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b83815260406020808301829052908201839052600090849060608401835b868110156114a8576001600160a01b0361149585611242565b168252928201929082019060010161147c565b50979650505050505050565b600082198211156114c7576114c7611590565b500190565b6000826114e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561150857611508611590565b500290565b60008282101561151f5761151f611590565b500390565b600181811c9082168061153857607f821691505b6020821081141561155957634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561157357611573611590565b5060010190565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220632003a3e67378a6bdb255c71b0dc9dcc1555cefc8aefc7a80e7120bda77b89564736f6c63430008060033

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

0000000000000000000000000000000000000000204fce5e3e2502611000000000000000000000000000000000000000000000000bf49179e8e9da7af40000000000000000000000000000004b64e8187e44810e828a9e97c2feb01f2e3b8cc6

-----Decoded View---------------
Arg [0] : initTotalSupply (uint256): 10000000000000000000000000000
Arg [1] : totalYieldAmount (uint256): 3700000000000000000000000000
Arg [2] : initTokenHolder (address): 0x4b64e8187E44810e828A9e97c2FeB01F2e3B8cc6

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000204fce5e3e25026110000000
Arg [1] : 00000000000000000000000000000000000000000bf49179e8e9da7af4000000
Arg [2] : 0000000000000000000000004b64e8187e44810e828a9e97c2feb01f2e3b8cc6


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.