Contract 0x3421cc14F0e3822Cf3B73C3a4BEC2A1023b8d9Cf 9

 

Contract Overview

Rebase: Rebase Token
Balance:
0 ETH

EtherValue:
$0.00

Token:
Txn Hash Method
Block
From
To
Value
0x46627c2388ca1da1e82641c10aa9fc2a94dfb36ab918bd48581e08e08f59c1e8Approve135052652024-04-22 15:31:174 hrs 14 mins ago0x761be535061256295efcb0c4b02763e78dfab4b3 IN  Rebase: Rebase Token0 ETH0.0000079976130.172
0xdac30d857d1e7188e233395402a01447aa1284b821385199ba62e0d943f51c9aApprove134788372024-04-22 0:50:2118 hrs 54 mins ago0x1eae6bbbc5127a4a84a36470ead5e0b7918fa5c1 IN  Rebase: Rebase Token0 ETH0.0000008010620.027007101
0x0c865f1f04bcefb78bc059aa375b72a7caa3d0588d04c27edef2dc3dbf0f093aApprove134752502024-04-21 22:50:4720 hrs 54 mins ago0x39260b9be6b55b18505c6dd098d7fe0bb8622101 IN  Rebase: Rebase Token0 ETH0.0000006247670.013046102
0x428e10fd448313d81a2152e1bd61f231ca3670fb6f70751fc396a05445e486d8Approve134720982024-04-21 21:05:4322 hrs 39 mins ago0xec143b7e8dff62b58ef622b1e585be21b517bef2 IN  Rebase: Rebase Token0 ETH0.0000007679140.028532406
0x294bc7133c63520ee32e22ce2ed8b534859eac1d3fff72e551f80481ef758ecfApprove134678302024-04-21 18:43:271 day 1 hr ago0x29336d1edc16f349f9b47b4bc789cf03eb28df53 IN  Rebase: Rebase Token0 ETH0.0000043507870.093
0xce5bf15401e297859fda5039e1171e55219f8d4c80f583fed4da6fadcccae723Approve134511742024-04-21 9:28:151 day 10 hrs ago0xc1a460c761a4ad4a6340e7de29bea85f8c535681 IN  Rebase: Rebase Token0 ETH0.000003404920.073278553
0x98a58ad4ce7eb7e26aeaa22a088d98e8674ef595d0155b9f0e1079fec0ec7c9eApprove134474922024-04-21 7:25:311 day 12 hrs ago0x3e22c0f5c08b12a7845c5c87f84807b1ae24410b IN  Rebase: Rebase Token0 ETH0.0000020840690.044671344
0x63b34605ae2ddf3c95b8f7cc25391075c318c6a078f4753627b32160710446eaApprove134458432024-04-21 6:30:331 day 13 hrs ago0x4c6cd3ed22ef70ba6f10f10a716fb99aaee73c65 IN  Rebase: Rebase Token0 ETH0.0000010289930.021728905
0x5e41d500ca1b318153dc75c9ba5bb9feba05d0e67a1a82349c53a7153d2f418cApprove134412832024-04-21 3:58:331 day 15 hrs ago0x8b9be10f80f7efe75ecf0ce062e98c1dd5b5389a IN  Rebase: Rebase Token0 ETH0.0000011202090.023915497
0xcb631d3b2b24b5d5b39d8702078a89b8493247b648b672d2496c4d5054a3f3fePermit134305912024-04-20 22:02:091 day 21 hrs ago0x82588e3686e7cb0a1ced4a5706e82ae12a424eaa IN  Rebase: Rebase Token0 ETH0.0000017582330.029953131
0x5754a4bf42b52d7738d41e724e678fda35735c3e549e17418c268018e42b53efApprove134193172024-04-20 15:46:212 days 3 hrs ago0xf40b0536458525f7d79ef4ae2679eff807219d0c IN  Rebase: Rebase Token0 ETH0.0000046906910.101030108
0xb785f801f9976c06df41c39db6b59c0d7c88c6c5ce6e243c4dc30790e80355c8Approve134113672024-04-20 11:21:212 days 8 hrs ago0x30db4940555516b107d63e2c483ec1e60c7ff361 IN  Rebase: Rebase Token0 ETH0.0000012216640.026063045
0x46555f2f7396225f9c69859cb83826d17ea87852ed098f7dca87ca37ae58ba4fApprove133927032024-04-20 0:59:132 days 18 hrs ago0x0a4fc2f6d61d43ca6a2458ac6c3d79a94c62616b IN  Rebase: Rebase Token0 ETH0.0000008237860.017443547
0x36bffb37a68a42cfda5380b62aba02c0ae305e5327d4ce6eac5d42ae4ad96399Approve133799002024-04-19 17:52:273 days 1 hr ago0x1dddb5829830d5edd5e1025dff9dae33d55b192b IN  Rebase: Rebase Token0 ETH0.0000410195131.555967996
0x2257f5849cf353e91c6cfb1e44e5a8e1b8358690a0bf8444847c9e2846d6b489Transfer133777052024-04-19 16:39:173 days 3 hrs ago0x5db639dd70c3de216b77182ed71c1fb90f52edc9 IN  Rebase: Rebase Token0 ETH0.0000024537870.065229706
0x66c99035627b4d5a733cd05394d38e0e680f5e7778cdcd457c36772adc14074eApprove133762782024-04-19 15:51:433 days 3 hrs ago0x1dddb5829830d5edd5e1025dff9dae33d55b192b IN  Rebase: Rebase Token0 ETH0.0000718717971.553254519
0x14faf8c279c47b5ed638c6a421ff993e5c27bc928448f09a9a2a0544742a8724Approve133753942024-04-19 15:22:153 days 4 hrs ago0xc9efe725b348446be29d62456d7b2a18e86b4c7a IN  Rebase: Rebase Token0 ETH0.0000028760660.060945234
0x6d1171e7bc3c5735b706bb6f7da611d909763c80b4709ccb1ac86a0a83523a1fApprove133611672024-04-19 7:28:013 days 12 hrs ago0x718a52241823f86169f9d5740af0533e0b559371 IN  Rebase: Rebase Token0 ETH0.0000029771440.063661094
0x683f9620676819ac9aa840e1d26c04a552a73dd261796463ccf4a65a95660443Approve133304972024-04-18 14:25:414 days 5 hrs ago0xd4c4b846fbf440da3ebc68a8264fd33f83c15865 IN  Rebase: Rebase Token0 ETH0.000003396090.072293887
0xe3d36ae5e8cdc7d9f92467c6cc2f6c036cae201ae30562dbb7620e979b6b15d1Approve133277712024-04-18 12:54:494 days 6 hrs ago0xa941f8b2d30ebcb6224c76711fb79dd2f1e89092 IN  Rebase: Rebase Token0 ETH0.0000022001820.04683
0x068183ea16f95405d3ad9332806532cda45e20f00016e23feafe04edc0f93a53Approve132635172024-04-17 1:13:015 days 18 hrs ago0x4d185172c0fea8c24efc0361b5940e5f82d2addc IN  Rebase: Rebase Token0 ETH0.0000006422440.013515423
0xf65b7330befb368b588a804ea7b587637a79d287ca5d2a537712b5818b45ca23Approve132590632024-04-16 22:44:335 days 21 hrs ago0xd4c4b846fbf440da3ebc68a8264fd33f83c15865 IN  Rebase: Rebase Token0 ETH0.0000011276850.023705519
0x8a5907c5f17eb25cd94fab5a161ce428c91684a99c019b5e415ec14df3dfa1a9Approve132563202024-04-16 21:13:075 days 22 hrs ago0x953151db3dade3ff5544fd5c9b3a24d1afff311a IN  Rebase: Rebase Token0 ETH0.00000092730.019547642
0xf327b992a3fefc80ce3f99a78f1696df62def8a6523a7753e93db520949cd6d8Approve132458282024-04-16 15:23:236 days 4 hrs ago0x7ef800ba33d0494a57b0b37993ff820bf9e6e46a IN  Rebase: Rebase Token0 ETH0.0000043391520.147525573
0x7afe60ca8eec3b4f5146766faf6928f423814fa5b6d8355e1a06d35894450114Approve132426102024-04-16 13:36:076 days 6 hrs ago0xcdc1417469d4f6adccd89a4d61009cc573ce6d9c IN  Rebase: Rebase Token0 ETH0.0000016155690.065486598
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UFragments

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : UFragments.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.4;

import "./_external/SafeMath.sol";
import "./_external/Ownable.sol";
import "./_external/ERC20Detailed.sol";

import "./lib/SafeMathInt.sol";

/**
 * @title uFragments ERC20 token
 * @dev This is part of an implementation of the uFragments Ideal Money protocol.
 *      uFragments is a normal ERC20 token, but its supply can be adjusted by splitting and
 *      combining tokens proportionally across all wallets.
 *
 *      uFragment balances are internally represented with a hidden denomination, 'gons'.
 *      We support splitting the currency in expansion and combining the currency on contraction by
 *      changing the exchange rate between the hidden 'gons' and the public 'fragments'.
 */
contract UFragments is ERC20Detailed, Ownable {
    // PLEASE READ BEFORE CHANGING ANY ACCOUNTING OR MATH
    // Anytime there is division, there is a risk of numerical instability from rounding errors. In
    // order to minimize this risk, we adhere to the following guidelines:
    // 1) The conversion rate adopted is the number of gons that equals 1 fragment.
    //    The inverse rate must not be used--TOTAL_GONS is always the numerator and _totalSupply is
    //    always the denominator. (i.e. If you want to convert gons to fragments instead of
    //    multiplying by the inverse rate, you should divide by the normal rate)
    // 2) Gon balances converted into Fragments are always rounded down (truncated).
    //
    // We make the following guarantees:
    // - If address 'A' transfers x Fragments to address 'B'. A's resulting external balance will
    //   be decreased by precisely x Fragments, and B's external balance will be precisely
    //   increased by x Fragments.
    //
    // We do not guarantee that the sum of all balances equals the result of calling totalSupply().
    // This is because, for any conversion function 'f()' that has non-zero rounding error,
    // f(x0) + f(x1) + ... + f(xn) is not always equal to f(x0 + x1 + ... xn).
    using SafeMath for uint256;
    using SafeMathInt for int256;

    event LogRebase(uint256 indexed epoch, uint256 totalSupply);
    event LogMonetaryPolicyUpdated(address monetaryPolicy);

    // Used for authentication
    address public monetaryPolicy;

    modifier onlyMonetaryPolicy() {
        require(msg.sender == monetaryPolicy);
        _;
    }

    bool private rebasePausedDeprecated;
    bool private tokenPausedDeprecated;

    modifier validRecipient(address to) {
        require(to != address(0x0));
        require(to != address(this));
        _;
    }

    uint256 private constant DECIMALS = 9;
    uint256 private constant MAX_UINT256 = type(uint256).max;
    uint256 private constant INITIAL_FRAGMENTS_SUPPLY = 25 * 10**3 * 10**DECIMALS;

    // TOTAL_GONS is a multiple of INITIAL_FRAGMENTS_SUPPLY so that _gonsPerFragment is an integer.
    // Use the highest value that fits in a uint256 for max granularity.
    uint256 private constant TOTAL_GONS = MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);

    // MAX_SUPPLY = maximum integer < (sqrt(4*TOTAL_GONS + 1) - 1) / 2
    uint256 private constant MAX_SUPPLY = type(uint128).max; // (2^128) - 1

    uint256 private _totalSupply;
    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;

    // This is denominated in Fragments, because the gons-fragments conversion might change before
    // it's fully paid.
    mapping(address => mapping(address => uint256)) private _allowedFragments;

    // EIP-2612: permit – 712-signed approvals
    // https://eips.ethereum.org/EIPS/eip-2612
    string public constant EIP712_REVISION = "1";
    bytes32 public constant EIP712_DOMAIN =
        keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256(
            "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
        );

    // EIP-2612: keeps track of number of permits per address
    mapping(address => uint256) private _nonces;

    /**
     * @param monetaryPolicy_ The address of the monetary policy contract to use for authentication.
     */
    function setMonetaryPolicy(address monetaryPolicy_) external onlyOwner {
        monetaryPolicy = monetaryPolicy_;
        emit LogMonetaryPolicyUpdated(monetaryPolicy_);
    }

    /**
     * @dev Notifies Fragments contract about a new rebase cycle.
     * @param supplyDelta The number of new fragment tokens to add into circulation via expansion.
     * @return The total number of fragments after the supply adjustment.
     */
    function rebase(uint256 epoch, int256 supplyDelta)
        external
        onlyMonetaryPolicy
        returns (uint256)
    {
        if (supplyDelta == 0) {
            emit LogRebase(epoch, _totalSupply);
            return _totalSupply;
        }

        if (supplyDelta < 0) {
            _totalSupply = _totalSupply.sub(uint256(supplyDelta.abs()));
        } else {
            _totalSupply = _totalSupply.add(uint256(supplyDelta));
        }

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        // From this point forward, _gonsPerFragment is taken as the source of truth.
        // We recalculate a new _totalSupply to be in agreement with the _gonsPerFragment
        // conversion rate.
        // This means our applied supplyDelta can deviate from the requested supplyDelta,
        // but this deviation is guaranteed to be < (_totalSupply^2)/(TOTAL_GONS - _totalSupply).
        //
        // In the case of _totalSupply <= MAX_UINT128 (our current supply cap), this
        // deviation is guaranteed to be < 1, so we can omit this step. If the supply cap is
        // ever increased, it must be re-included.
        // _totalSupply = TOTAL_GONS.div(_gonsPerFragment)

        emit LogRebase(epoch, _totalSupply);
        return _totalSupply;
    }

    function initialize(address owner_) public override initializer {
        ERC20Detailed.initialize("Rebase", "Rebase", uint8(DECIMALS));
        Ownable.initialize(owner_);

        rebasePausedDeprecated = false;
        tokenPausedDeprecated = false;

        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        _gonBalances[owner_] = TOTAL_GONS;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        emit Transfer(address(0x0), owner_, _totalSupply);
    }

    /**
     * @return The total number of fragments.
     */
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @param who The address to query.
     * @return The balance of the specified address.
     */
    function balanceOf(address who) external view override returns (uint256) {
        return _gonBalances[who].div(_gonsPerFragment);
    }

    /**
     * @param who The address to query.
     * @return The gon balance of the specified address.
     */
    function scaledBalanceOf(address who) external view returns (uint256) {
        return _gonBalances[who];
    }

    /**
     * @return the total number of gons.
     */
    function scaledTotalSupply() external pure returns (uint256) {
        return TOTAL_GONS;
    }

    /**
     * @return The number of successful permits by the specified address.
     */
    function nonces(address who) public view returns (uint256) {
        return _nonces[who];
    }

    /**
     * @return The computed DOMAIN_SEPARATOR to be used off-chain services
     *         which implement EIP-712.
     *         https://eips.ethereum.org/EIPS/eip-2612
     */
    function DOMAIN_SEPARATOR() public view returns (bytes32) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return
            keccak256(
                abi.encode(
                    EIP712_DOMAIN,
                    keccak256(bytes(name())),
                    keccak256(bytes(EIP712_REVISION)),
                    chainId,
                    address(this)
                )
            );
    }

    /**
     * @dev Transfer tokens to a specified address.
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     * @return True on success, false otherwise.
     */
    function transfer(address to, uint256 value)
        external
        override
        validRecipient(to)
        returns (bool)
    {
        uint256 gonValue = value.mul(_gonsPerFragment);

        _gonBalances[msg.sender] = _gonBalances[msg.sender].sub(gonValue);
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Transfer all of the sender's wallet balance to a specified address.
     * @param to The address to transfer to.
     * @return True on success, false otherwise.
     */
    function transferAll(address to) external validRecipient(to) returns (bool) {
        uint256 gonValue = _gonBalances[msg.sender];
        uint256 value = gonValue.div(_gonsPerFragment);

        delete _gonBalances[msg.sender];
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Function to check the amount of tokens that an owner has allowed to a spender.
     * @param owner_ The address which owns the funds.
     * @param spender The address which will spend the funds.
     * @return The number of tokens still available for the spender.
     */
    function allowance(address owner_, address spender) external view override returns (uint256) {
        return _allowedFragments[owner_][spender];
    }

    /**
     * @dev Transfer tokens from one address to another.
     * @param from The address you want to send tokens from.
     * @param to The address you want to transfer to.
     * @param value The amount of tokens to be transferred.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override validRecipient(to) returns (bool) {
        _allowedFragments[from][msg.sender] = _allowedFragments[from][msg.sender].sub(value);

        uint256 gonValue = value.mul(_gonsPerFragment);
        _gonBalances[from] = _gonBalances[from].sub(gonValue);
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Transfer all balance tokens from one address to another.
     * @param from The address you want to send tokens from.
     * @param to The address you want to transfer to.
     */
    function transferAllFrom(address from, address to) external validRecipient(to) returns (bool) {
        uint256 gonValue = _gonBalances[from];
        uint256 value = gonValue.div(_gonsPerFragment);

        _allowedFragments[from][msg.sender] = _allowedFragments[from][msg.sender].sub(value);

        delete _gonBalances[from];
        _gonBalances[to] = _gonBalances[to].add(gonValue);

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of
     * msg.sender. This method is included for ERC20 compatibility.
     * increaseAllowance and decreaseAllowance should be used instead.
     * Changing an allowance with this method brings the risk that someone may transfer both
     * the old and the new allowance - if they are both greater than zero - if a transfer
     * transaction is mined before the later approve() call is mined.
     *
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override returns (bool) {
        _allowedFragments[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner has allowed to a spender.
     * This method should be used instead of approve() to avoid the double approval vulnerability
     * described above.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][spender].add(
            addedValue
        );

        emit Approval(msg.sender, spender, _allowedFragments[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner has allowed to a spender.
     *
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 oldValue = _allowedFragments[msg.sender][spender];
        _allowedFragments[msg.sender][spender] = (subtractedValue >= oldValue)
            ? 0
            : oldValue.sub(subtractedValue);

        emit Approval(msg.sender, spender, _allowedFragments[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Allows for approvals to be made via secp256k1 signatures.
     * @param owner The owner of the funds
     * @param spender The spender
     * @param value The amount
     * @param deadline The deadline timestamp, type(uint256).max for max deadline
     * @param v Signature param
     * @param s Signature param
     * @param r Signature param
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        require(block.timestamp <= deadline);

        uint256 ownerNonce = _nonces[owner];
        bytes32 permitDataDigest = keccak256(
            abi.encode(PERMIT_TYPEHASH, owner, spender, value, ownerNonce, deadline)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), permitDataDigest)
        );

        require(owner == ecrecover(digest, v, r, s));

        _nonces[owner] = ownerNonce.add(1);

        _allowedFragments[owner][spender] = value;
        emit Approval(owner, spender, value);
    }
}

File 2 of 7 : SafeMath.sol
pragma solidity 0.8.4;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two numbers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0); // Solidity only automatically asserts when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two numbers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

File 3 of 7 : Ownable.sol
pragma solidity 0.8.4;

import "./Initializable.sol";

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable is Initializable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    function initialize(address sender) public virtual initializer {
        _owner = sender;
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(_owner);
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    uint256[50] private ______gap;
}

File 4 of 7 : ERC20Detailed.sol
pragma solidity 0.8.4;

import "./Initializable.sol";
import "./IERC20.sol";

/**
 * @title ERC20Detailed token
 * @dev The decimals are only for visualization purposes.
 * All the operations are done using the smallest and indivisible token unit,
 * just as on Ethereum all the operations are done in wei.
 */
abstract contract ERC20Detailed is Initializable, IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    function initialize(
        string memory name,
        string memory symbol,
        uint8 decimals
    ) public virtual initializer {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

    /**
     * @return the symbol of the token.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @return the number of decimals of the token.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    uint256[50] private ______gap;
}

File 5 of 7 : SafeMathInt.sol
/*
MIT License

Copyright (c) 2018 requestnetwork
Copyright (c) 2018 Fragments, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.4;

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    /**
     * @dev Computes 2^exp with limited precision where -100 <= exp <= 100 * one
     * @param one 1.0 represented in the same fixed point number format as exp
     * @param exp The power to raise 2 to -100 <= exp <= 100 * one
     * @return 2^exp represented with same number of decimals after the point as one
     */
    function twoPower(int256 exp, int256 one) internal pure returns (int256) {
        bool reciprocal = false;
        if (exp < 0) {
            reciprocal = true;
            exp = abs(exp);
        }

        // Precomputed values for 2^(1/2^i) in 18 decimals fixed point numbers
        int256[5] memory ks = [
            int256(1414213562373095049),
            1189207115002721067,
            1090507732665257659,
            1044273782427413840,
            1021897148654116678
        ];
        int256 whole = div(exp, one);
        require(whole <= 100);
        int256 result = mul(int256(uint256(1) << uint256(whole)), one);
        int256 remaining = sub(exp, mul(whole, one));

        int256 current = div(one, 2);
        for (uint256 i = 0; i < 5; i++) {
            if (remaining >= current) {
                remaining = sub(remaining, current);
                result = div(mul(result, ks[i]), 10**18); // 10**18 to match hardcoded ks values
            }
            current = div(current, 2);
        }
        if (reciprocal) {
            result = div(mul(one, one), result);
        }
        return result;
    }
}

File 6 of 7 : Initializable.sol
pragma solidity 0.8.4;

/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private initializing;

    /**
     * @dev Modifier to use in the initializer function of a contract.
     */
    modifier initializer() {
        require(
            initializing || isConstructor() || !initialized,
            "Contract instance has already been initialized"
        );

        bool wasInitializing = initializing;
        initializing = true;
        initialized = true;

        _;

        initializing = wasInitializing;
    }

    /// @dev Returns true if and only if the function is running in the constructor
    function isConstructor() private view returns (bool) {
        // extcodesize checks the size of the code stored in an address, and
        // address returns the current address. Since the code is still not
        // deployed when running a constructor, any checks on its code size will
        // yield zero, making it an effective way to detect if a contract is
        // under construction or not.

        // MINOR CHANGE HERE:

        // previous code
        // uint256 cs;
        // assembly { cs := extcodesize(address) }
        // return cs == 0;

        // current code
        address _self = address(this);
        uint256 cs;
        assembly {
            cs := extcodesize(_self)
        }
        return cs == 0;
    }

    // Reserved storage space to allow for layout changes in the future.
    uint256[50] private ______gap;
}

File 7 of 7 : IERC20.sol
pragma solidity 0.8.4;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

Contract Security Audit

Contract ABI

[{"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":false,"internalType":"address","name":"monetaryPolicy","type":"address"}],"name":"LogMonetaryPolicyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_REVISION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monetaryPolicy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"scaledBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scaledTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"monetaryPolicy_","type":"address"}],"name":"setMonetaryPolicy","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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferAllFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"}]

608060405234801561001057600080fd5b5061196a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806384d4b41011610104578063a457c2d7116100a2578063d505accf11610071578063d505accf1461041e578063dd62ed3e14610431578063e1b11da41461046a578063f2fde38b1461049157600080fd5b8063a457c2d7146103dd578063a9059cbb146103f0578063b1bf962d14610403578063c4d66de81461040b57600080fd5b80638e27d7d7116100de5780638e27d7d71461039c5780638f32d59b146103af57806395d89b41146103c2578063a3a7e7f3146103ca57600080fd5b806384d4b410146103515780638b5a6a08146103645780638da5cb5b1461037757600080fd5b8063313ce5671161017c578063715018a61161014b578063715018a6146102ed57806378160376146102f55780637a43e23f146103155780637ecebe001461032857600080fd5b8063313ce567146102aa5780633644e515146102bf57806339509351146102c757806370a08231146102da57600080fd5b806318160ddd116101b857806318160ddd146102355780631da24f3e1461024757806323b872dd1461027057806330adf81f1461028357600080fd5b806306fdde03146101df578063095ea7b3146101fd5780631624f6c614610220575b600080fd5b6101e76104a4565b6040516101f49190611661565b60405180910390f35b61021061020b3660046115a6565b610536565b60405190151581526020016101f4565b61023361022e3660046115cf565b610591565b005b609c545b6040519081526020016101f4565b6102396102553660046114b6565b6001600160a01b03166000908152609e602052604090205490565b61021061027e366004611502565b61064e565b6102397f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60355460405160ff90911681526020016101f4565b610239610788565b6102106102d53660046115a6565b610834565b6102396102e83660046114b6565b6108a7565b6102336108cf565b6101e7604051806040016040528060018152602001603160f81b81525081565b610239610323366004611640565b610930565b6102396103363660046114b6565b6001600160a01b0316600090815260a0602052604090205490565b61021061035f3660046114d0565b610a6a565b6102336103723660046114b6565b610b7a565b6068546001600160a01b03165b6040516001600160a01b0390911681526020016101f4565b609b54610384906001600160a01b031681565b6068546001600160a01b03163314610210565b6101e7610be5565b6102106103d83660046114b6565b610bf4565b6102106103eb3660046115a6565b610cc4565b6102106103fe3660046115a6565b610d54565b610239610e32565b6102336104193660046114b6565b610e69565b61023361042c36600461153d565b610fdb565b61023961043f3660046114d0565b6001600160a01b039182166000908152609f6020908152604080832093909416825291909152205490565b6102397f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61023361049f3660046114b6565b611197565b6060603380546104b39061184f565b80601f01602080910402602001604051908101604052809291908181526020018280546104df9061184f565b801561052c5780601f106105015761010080835404028352916020019161052c565b820191906000526020600020905b81548152906001019060200180831161050f57829003601f168201915b5050505050905090565b336000818152609f602090815260408083206001600160a01b038716808552925280832085905551919290916000805160206119158339815191529061057f9086815260200190565b60405180910390a35060015b92915050565b600054610100900460ff16806105a65750303b155b806105b4575060005460ff16155b6105d95760405162461bcd60e51b81526004016105d0906116b4565b60405180910390fd5b6000805461ffff19811661010117909155835161010090910460ff1690610607906033906020870190611369565b50825161061b906034906020860190611369565b506035805460ff90931660ff1990931692909217909155600080549115156101000261ff00199092169190911790555050565b6000826001600160a01b03811661066457600080fd5b6001600160a01b03811630141561067a57600080fd5b6001600160a01b0385166000908152609f602090815260408083203384529091529020546106a890846111ba565b6001600160a01b0386166000908152609f60209081526040808320338452909152812091909155609d546106dd9085906111dd565b6001600160a01b0387166000908152609e602052604090205490915061070390826111ba565b6001600160a01b038088166000908152609e602052604080822093909355908716815220546107329082611216565b6001600160a01b038087166000818152609e602052604090819020939093559151908816906000805160206118f5833981519152906107749088815260200190565b60405180910390a350600195945050505050565b6000467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6107b46104a4565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b336000908152609f602090815260408083206001600160a01b03861684529091528120546108629083611216565b336000818152609f602090815260408083206001600160a01b03891680855290835292819020859055519384529092600080516020611915833981519152910161057f565b609d546001600160a01b0382166000908152609e6020526040812054909161058b9190611232565b6068546001600160a01b031633146108e657600080fd5b6068546040516001600160a01b03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2606880546001600160a01b0319169055565b609b546000906001600160a01b0316331461094a57600080fd5b8161099457827f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2609c5460405161098391815260200190565b60405180910390a250609c5461058b565b60008212156109ba576109b26109a98361124c565b609c54906111ba565b609c556109cb565b609c546109c79083611216565b609c555b609c546001600160801b0310156109e8576001600160801b03609c555b609c54610a25906109fb6009600a611771565b610a07906161a8611819565b610a1390600019611884565b610a1f90600019611838565b90611232565b609d55609c5460405190815283907f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29060200160405180910390a250609c5492915050565b6000816001600160a01b038116610a8057600080fd5b6001600160a01b038116301415610a9657600080fd5b6001600160a01b0384166000908152609e6020526040812054609d54909190610ac0908390611232565b6001600160a01b0387166000908152609f60209081526040808320338452909152902054909150610af190826111ba565b6001600160a01b038088166000818152609f60209081526040808320338452825280832095909555918152609e90915282812081905590871681522054610b389083611216565b6001600160a01b038087166000818152609e602052604090819020939093559151908816906000805160206118f5833981519152906107749085815260200190565b6068546001600160a01b03163314610b9157600080fd5b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e6961f1a1afb87eaf51fd64f22ddc10062e23aa7838eac5d0bdf140bfd389729060200160405180910390a150565b6060603480546104b39061184f565b6000816001600160a01b038116610c0a57600080fd5b6001600160a01b038116301415610c2057600080fd5b336000908152609e6020526040812054609d54909190610c41908390611232565b336000908152609e60205260408082208290556001600160a01b0388168252902054909150610c709083611216565b6001600160a01b0386166000818152609e60205260409081902092909255905133906000805160206118f583398151915290610caf9085815260200190565b60405180910390a36001935050505b50919050565b336000908152609f602090815260408083206001600160a01b038616845290915281205480831015610cff57610cfa81846111ba565b610d02565b60005b336000818152609f602090815260408083206001600160a01b038a1680855290835292819020859055519384529092600080516020611915833981519152910160405180910390a35060019392505050565b6000826001600160a01b038116610d6a57600080fd5b6001600160a01b038116301415610d8057600080fd5b6000610d97609d54856111dd90919063ffffffff16565b336000908152609e6020526040902054909150610db490826111ba565b336000908152609e6020526040808220929092556001600160a01b03871681522054610de09082611216565b6001600160a01b0386166000818152609e60205260409081902092909255905133906000805160206118f583398151915290610e1f9088815260200190565b60405180910390a3506001949350505050565b6000610e406009600a611771565b610e4c906161a8611819565b610e5890600019611884565b610e6490600019611838565b905090565b600054610100900460ff1680610e7e5750303b155b80610e8c575060005460ff16155b610ea85760405162461bcd60e51b81526004016105d0906116b4565b6000805461ffff1981166101011790915560408051808201825260068082526552656261736560d01b602080840182905284518086019095529184529083015261010090920460ff1691610efd916009610591565b610f0682611276565b609b805461ffff60a01b19169055610f206009600a611771565b610f2c906161a8611819565b609c55610f3b6009600a611771565b610f47906161a8611819565b610f5390600019611884565b610f5f90600019611838565b6001600160a01b0383166000908152609e6020526040902055609c54610f8b906109fb6009600a611771565b609d55609c546040519081526001600160a01b038316906000906000805160206118f58339815191529060200160405180910390a3600080549115156101000261ff001990921691909117905550565b83421115610fe857600080fd5b6001600160a01b03878116600081815260a0602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99381019390935290820194909452938a16606085015260808401899052830182905260c08301879052909160e0016040516020818303038152906040528051906020012090506000611078610788565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015611100573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b03161461112757600080fd5b611132836001611216565b6001600160a01b038b8116600081815260a06020908152604080832095909555609f8152848220938e16808352938152908490208c905592518b815291929091600080516020611915833981519152910160405180910390a350505050505050505050565b6068546001600160a01b031633146111ae57600080fd5b6111b7816112fa565b50565b6000828211156111c957600080fd5b60006111d58385611838565b949350505050565b6000826111ec5750600061058b565b60006111f88385611819565b905082611205858361171a565b1461120f57600080fd5b9392505050565b6000806112238385611702565b90508381101561120f57600080fd5b600080821161124057600080fd5b60006111d5838561171a565b6000600160ff1b82141561125f57600080fd5b6000821261126d578161058b565b61058b82611898565b600054610100900460ff168061128b5750303b155b80611299575060005460ff16155b6112b55760405162461bcd60e51b81526004016105d0906116b4565b60008054606880546001600160a01b0319166001600160a01b03949094169390931790925561ffff1982166101009283900460ff161515909202919091176001179055565b6001600160a01b03811661130d57600080fd5b6068546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b8280546113759061184f565b90600052602060002090601f01602090048101928261139757600085556113dd565b82601f106113b057805160ff19168380011785556113dd565b828001600101855582156113dd579182015b828111156113dd5782518255916020019190600101906113c2565b506113e99291506113ed565b5090565b5b808211156113e957600081556001016113ee565b80356001600160a01b038116811461141957600080fd5b919050565b600082601f83011261142e578081fd5b813567ffffffffffffffff80821115611449576114496118de565b604051601f8301601f19908116603f01168101908282118183101715611471576114716118de565b81604052838152866020858801011115611489578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff8116811461141957600080fd5b6000602082840312156114c7578081fd5b61120f82611402565b600080604083850312156114e2578081fd5b6114eb83611402565b91506114f960208401611402565b90509250929050565b600080600060608486031215611516578081fd5b61151f84611402565b925061152d60208501611402565b9150604084013590509250925092565b600080600080600080600060e0888a031215611557578283fd5b61156088611402565b965061156e60208901611402565b9550604088013594506060880135935061158a608089016114a5565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156115b8578182fd5b6115c183611402565b946020939093013593505050565b6000806000606084860312156115e3578283fd5b833567ffffffffffffffff808211156115fa578485fd5b6116068783880161141e565b9450602086013591508082111561161b578384fd5b506116288682870161141e565b925050611637604085016114a5565b90509250925092565b60008060408385031215611652578182fd5b50508035926020909101359150565b6000602080835283518082850152825b8181101561168d57858101830151858201604001528201611671565b8181111561169e5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60008219821115611715576117156118b2565b500190565b600082611729576117296118c8565b500490565b600181815b8085111561176957816000190482111561174f5761174f6118b2565b8085161561175c57918102915b93841c9390800290611733565b509250929050565b600061120f83836000826117875750600161058b565b816117945750600061058b565b81600181146117aa57600281146117b4576117d0565b600191505061058b565b60ff8411156117c5576117c56118b2565b50506001821b61058b565b5060208310610133831016604e8410600b84101617156117f3575081810a61058b565b6117fd838361172e565b8060001904821115611811576118116118b2565b029392505050565b6000816000190483118215151615611833576118336118b2565b500290565b60008282101561184a5761184a6118b2565b500390565b600181811c9082168061186357607f821691505b60208210811415610cbe57634e487b7160e01b600052602260045260246000fd5b600082611893576118936118c8565b500690565b6000600160ff1b8214156118ae576118ae6118b2565b0390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220c3e7aa91400d8ecdefc57b0f072f26e41b65123728145f0ec7e8f664f2eed9c064736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806384d4b41011610104578063a457c2d7116100a2578063d505accf11610071578063d505accf1461041e578063dd62ed3e14610431578063e1b11da41461046a578063f2fde38b1461049157600080fd5b8063a457c2d7146103dd578063a9059cbb146103f0578063b1bf962d14610403578063c4d66de81461040b57600080fd5b80638e27d7d7116100de5780638e27d7d71461039c5780638f32d59b146103af57806395d89b41146103c2578063a3a7e7f3146103ca57600080fd5b806384d4b410146103515780638b5a6a08146103645780638da5cb5b1461037757600080fd5b8063313ce5671161017c578063715018a61161014b578063715018a6146102ed57806378160376146102f55780637a43e23f146103155780637ecebe001461032857600080fd5b8063313ce567146102aa5780633644e515146102bf57806339509351146102c757806370a08231146102da57600080fd5b806318160ddd116101b857806318160ddd146102355780631da24f3e1461024757806323b872dd1461027057806330adf81f1461028357600080fd5b806306fdde03146101df578063095ea7b3146101fd5780631624f6c614610220575b600080fd5b6101e76104a4565b6040516101f49190611661565b60405180910390f35b61021061020b3660046115a6565b610536565b60405190151581526020016101f4565b61023361022e3660046115cf565b610591565b005b609c545b6040519081526020016101f4565b6102396102553660046114b6565b6001600160a01b03166000908152609e602052604090205490565b61021061027e366004611502565b61064e565b6102397f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60355460405160ff90911681526020016101f4565b610239610788565b6102106102d53660046115a6565b610834565b6102396102e83660046114b6565b6108a7565b6102336108cf565b6101e7604051806040016040528060018152602001603160f81b81525081565b610239610323366004611640565b610930565b6102396103363660046114b6565b6001600160a01b0316600090815260a0602052604090205490565b61021061035f3660046114d0565b610a6a565b6102336103723660046114b6565b610b7a565b6068546001600160a01b03165b6040516001600160a01b0390911681526020016101f4565b609b54610384906001600160a01b031681565b6068546001600160a01b03163314610210565b6101e7610be5565b6102106103d83660046114b6565b610bf4565b6102106103eb3660046115a6565b610cc4565b6102106103fe3660046115a6565b610d54565b610239610e32565b6102336104193660046114b6565b610e69565b61023361042c36600461153d565b610fdb565b61023961043f3660046114d0565b6001600160a01b039182166000908152609f6020908152604080832093909416825291909152205490565b6102397f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61023361049f3660046114b6565b611197565b6060603380546104b39061184f565b80601f01602080910402602001604051908101604052809291908181526020018280546104df9061184f565b801561052c5780601f106105015761010080835404028352916020019161052c565b820191906000526020600020905b81548152906001019060200180831161050f57829003601f168201915b5050505050905090565b336000818152609f602090815260408083206001600160a01b038716808552925280832085905551919290916000805160206119158339815191529061057f9086815260200190565b60405180910390a35060015b92915050565b600054610100900460ff16806105a65750303b155b806105b4575060005460ff16155b6105d95760405162461bcd60e51b81526004016105d0906116b4565b60405180910390fd5b6000805461ffff19811661010117909155835161010090910460ff1690610607906033906020870190611369565b50825161061b906034906020860190611369565b506035805460ff90931660ff1990931692909217909155600080549115156101000261ff00199092169190911790555050565b6000826001600160a01b03811661066457600080fd5b6001600160a01b03811630141561067a57600080fd5b6001600160a01b0385166000908152609f602090815260408083203384529091529020546106a890846111ba565b6001600160a01b0386166000908152609f60209081526040808320338452909152812091909155609d546106dd9085906111dd565b6001600160a01b0387166000908152609e602052604090205490915061070390826111ba565b6001600160a01b038088166000908152609e602052604080822093909355908716815220546107329082611216565b6001600160a01b038087166000818152609e602052604090819020939093559151908816906000805160206118f5833981519152906107749088815260200190565b60405180910390a350600195945050505050565b6000467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6107b46104a4565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b336000908152609f602090815260408083206001600160a01b03861684529091528120546108629083611216565b336000818152609f602090815260408083206001600160a01b03891680855290835292819020859055519384529092600080516020611915833981519152910161057f565b609d546001600160a01b0382166000908152609e6020526040812054909161058b9190611232565b6068546001600160a01b031633146108e657600080fd5b6068546040516001600160a01b03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2606880546001600160a01b0319169055565b609b546000906001600160a01b0316331461094a57600080fd5b8161099457827f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2609c5460405161098391815260200190565b60405180910390a250609c5461058b565b60008212156109ba576109b26109a98361124c565b609c54906111ba565b609c556109cb565b609c546109c79083611216565b609c555b609c546001600160801b0310156109e8576001600160801b03609c555b609c54610a25906109fb6009600a611771565b610a07906161a8611819565b610a1390600019611884565b610a1f90600019611838565b90611232565b609d55609c5460405190815283907f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29060200160405180910390a250609c5492915050565b6000816001600160a01b038116610a8057600080fd5b6001600160a01b038116301415610a9657600080fd5b6001600160a01b0384166000908152609e6020526040812054609d54909190610ac0908390611232565b6001600160a01b0387166000908152609f60209081526040808320338452909152902054909150610af190826111ba565b6001600160a01b038088166000818152609f60209081526040808320338452825280832095909555918152609e90915282812081905590871681522054610b389083611216565b6001600160a01b038087166000818152609e602052604090819020939093559151908816906000805160206118f5833981519152906107749085815260200190565b6068546001600160a01b03163314610b9157600080fd5b609b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e6961f1a1afb87eaf51fd64f22ddc10062e23aa7838eac5d0bdf140bfd389729060200160405180910390a150565b6060603480546104b39061184f565b6000816001600160a01b038116610c0a57600080fd5b6001600160a01b038116301415610c2057600080fd5b336000908152609e6020526040812054609d54909190610c41908390611232565b336000908152609e60205260408082208290556001600160a01b0388168252902054909150610c709083611216565b6001600160a01b0386166000818152609e60205260409081902092909255905133906000805160206118f583398151915290610caf9085815260200190565b60405180910390a36001935050505b50919050565b336000908152609f602090815260408083206001600160a01b038616845290915281205480831015610cff57610cfa81846111ba565b610d02565b60005b336000818152609f602090815260408083206001600160a01b038a1680855290835292819020859055519384529092600080516020611915833981519152910160405180910390a35060019392505050565b6000826001600160a01b038116610d6a57600080fd5b6001600160a01b038116301415610d8057600080fd5b6000610d97609d54856111dd90919063ffffffff16565b336000908152609e6020526040902054909150610db490826111ba565b336000908152609e6020526040808220929092556001600160a01b03871681522054610de09082611216565b6001600160a01b0386166000818152609e60205260409081902092909255905133906000805160206118f583398151915290610e1f9088815260200190565b60405180910390a3506001949350505050565b6000610e406009600a611771565b610e4c906161a8611819565b610e5890600019611884565b610e6490600019611838565b905090565b600054610100900460ff1680610e7e5750303b155b80610e8c575060005460ff16155b610ea85760405162461bcd60e51b81526004016105d0906116b4565b6000805461ffff1981166101011790915560408051808201825260068082526552656261736560d01b602080840182905284518086019095529184529083015261010090920460ff1691610efd916009610591565b610f0682611276565b609b805461ffff60a01b19169055610f206009600a611771565b610f2c906161a8611819565b609c55610f3b6009600a611771565b610f47906161a8611819565b610f5390600019611884565b610f5f90600019611838565b6001600160a01b0383166000908152609e6020526040902055609c54610f8b906109fb6009600a611771565b609d55609c546040519081526001600160a01b038316906000906000805160206118f58339815191529060200160405180910390a3600080549115156101000261ff001990921691909117905550565b83421115610fe857600080fd5b6001600160a01b03878116600081815260a0602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c99381019390935290820194909452938a16606085015260808401899052830182905260c08301879052909160e0016040516020818303038152906040528051906020012090506000611078610788565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015611100573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b03161461112757600080fd5b611132836001611216565b6001600160a01b038b8116600081815260a06020908152604080832095909555609f8152848220938e16808352938152908490208c905592518b815291929091600080516020611915833981519152910160405180910390a350505050505050505050565b6068546001600160a01b031633146111ae57600080fd5b6111b7816112fa565b50565b6000828211156111c957600080fd5b60006111d58385611838565b949350505050565b6000826111ec5750600061058b565b60006111f88385611819565b905082611205858361171a565b1461120f57600080fd5b9392505050565b6000806112238385611702565b90508381101561120f57600080fd5b600080821161124057600080fd5b60006111d5838561171a565b6000600160ff1b82141561125f57600080fd5b6000821261126d578161058b565b61058b82611898565b600054610100900460ff168061128b5750303b155b80611299575060005460ff16155b6112b55760405162461bcd60e51b81526004016105d0906116b4565b60008054606880546001600160a01b0319166001600160a01b03949094169390931790925561ffff1982166101009283900460ff161515909202919091176001179055565b6001600160a01b03811661130d57600080fd5b6068546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b8280546113759061184f565b90600052602060002090601f01602090048101928261139757600085556113dd565b82601f106113b057805160ff19168380011785556113dd565b828001600101855582156113dd579182015b828111156113dd5782518255916020019190600101906113c2565b506113e99291506113ed565b5090565b5b808211156113e957600081556001016113ee565b80356001600160a01b038116811461141957600080fd5b919050565b600082601f83011261142e578081fd5b813567ffffffffffffffff80821115611449576114496118de565b604051601f8301601f19908116603f01168101908282118183101715611471576114716118de565b81604052838152866020858801011115611489578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff8116811461141957600080fd5b6000602082840312156114c7578081fd5b61120f82611402565b600080604083850312156114e2578081fd5b6114eb83611402565b91506114f960208401611402565b90509250929050565b600080600060608486031215611516578081fd5b61151f84611402565b925061152d60208501611402565b9150604084013590509250925092565b600080600080600080600060e0888a031215611557578283fd5b61156088611402565b965061156e60208901611402565b9550604088013594506060880135935061158a608089016114a5565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156115b8578182fd5b6115c183611402565b946020939093013593505050565b6000806000606084860312156115e3578283fd5b833567ffffffffffffffff808211156115fa578485fd5b6116068783880161141e565b9450602086013591508082111561161b578384fd5b506116288682870161141e565b925050611637604085016114a5565b90509250925092565b60008060408385031215611652578182fd5b50508035926020909101359150565b6000602080835283518082850152825b8181101561168d57858101830151858201604001528201611671565b8181111561169e5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60008219821115611715576117156118b2565b500190565b600082611729576117296118c8565b500490565b600181815b8085111561176957816000190482111561174f5761174f6118b2565b8085161561175c57918102915b93841c9390800290611733565b509250929050565b600061120f83836000826117875750600161058b565b816117945750600061058b565b81600181146117aa57600281146117b4576117d0565b600191505061058b565b60ff8411156117c5576117c56118b2565b50506001821b61058b565b5060208310610133831016604e8410600b84101617156117f3575081810a61058b565b6117fd838361172e565b8060001904821115611811576118116118b2565b029392505050565b6000816000190483118215151615611833576118336118b2565b500290565b60008282101561184a5761184a6118b2565b500390565b600181811c9082168061186357607f821691505b60208210811415610cbe57634e487b7160e01b600052602260045260246000fd5b600082611893576118936118c8565b500690565b6000600160ff1b8214156118ae576118ae6118b2565b0390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220c3e7aa91400d8ecdefc57b0f072f26e41b65123728145f0ec7e8f664f2eed9c064736f6c63430008040033

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