Contract 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x8ec7b98359984efd07d1a551e3aa7127456bf89b35429a7ad8ace8d10f37e0bf84076032021-06-18 15:37:252 days 2 hrs ago0x62b4265f8f66abc1c78b2c33bbaa7b8d38835716 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000503295
0x21ac6b3bdee910787c60863d91005fe5af2ce48dbbe45ffe8eb1aafa5fe3634284075432021-06-18 15:34:252 days 2 hrs ago0x62b4265f8f66abc1c78b2c33bbaa7b8d38835716 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00025036
0xa94e9dd2e4635bb3a97fddc6a3da9c714e2885062d664f62e39edbf20670379484066832021-06-18 14:51:252 days 3 hrs ago0x62b4265f8f66abc1c78b2c33bbaa7b8d38835716 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000394345
0xaaf3c1f23166fd8d509f1183f010359c5eba1c397e572b68fdda6786f6b1e07584063962021-06-18 14:36:222 days 3 hrs ago0x62b4265f8f66abc1c78b2c33bbaa7b8d38835716 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000506255
0xc33231dbe1911ff1215ea9ce96c53a9439059415d123cedc80a4265f776eb9cf84061892021-06-18 14:26:012 days 4 hrs ago0x62b4265f8f66abc1c78b2c33bbaa7b8d38835716 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00069362
0x53f7631f6f7d48ec453876c6019b6a6e99e0f7ee3003fe486cddbc58de20934584007802021-06-18 9:53:532 days 8 hrs ago0x3e7ba13eed5e35972e8218c3b5fa6c1a76fe5446 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000832344
0x1bc5003f7caee9e698942438b6ff6995deec706905d5ec6cbbb33f0eabf7136c82123102021-06-11 19:19:118 days 23 hrs ago0x851497cf9b1362858c095cdd577b506d24f57336 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000781035
0x205f63bd663ad41c177b1c932c8ddfd9308c46b33e404cd147b5cccea94b23aa82071482021-06-11 14:58:189 days 3 hrs ago0x85a2beee757634d9f403ec62480f9e2b921525f8 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000856035
0xbc23cc87516b787a2f32d14898b50f76c8bd1bdca6265105cc68e83dbed8a52b81653162021-06-10 3:59:0110 days 14 hrs ago0xb163aece65569a668b8d837592bb70330b14bb52 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000428145
0x68df4641d02cab5d214b3531af1de1c7e9ab828a91851631c8af5f9c35ea365781653132021-06-10 3:58:5210 days 14 hrs ago0xb163aece65569a668b8d837592bb70330b14bb52 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00060325
0xd13044cbf3746245f7a659b16ce41a1a2c71591d16cfab6fbe4238cd5ba5809281228972021-06-08 16:31:3612 days 2 hrs ago0x669a56522a51f43890796697a6187efb9b1004da IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000781035
0x085cc6d65b87a08372e5a4f498a924a847df69df1da65979aa1bffc2a6f9ccc179271952021-06-01 21:02:2518 days 21 hrs ago0x0380058b484233c9a67e73848e9a6cca6e6d0717 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000244005
0x8c399fa01806b66eaf51b30af4c4cfb48d63a3d65e805829860a94333cf2016579271832021-06-01 21:01:4918 days 21 hrs ago0x0380058b484233c9a67e73848e9a6cca6e6d0717 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000856545
0x4f5e9e4e71495a0cfbfd1b6d9e3a109bb9de8371cf9dfe766c17bed806eb280f79179232021-06-01 13:18:2219 days 5 hrs ago0x17e1a6ac8c53e304626a2f0fd40a99fcd30286ca IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000428145
0xbcf4f9f21f628054101bb6ca77284351e478e74304a6b15e1fd669be8ef3097278763022021-05-31 2:27:1820 days 16 hrs ago0x6a5f44d24dca8417db339203d9e07d23321f030b IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000428145
0xae776640d15826d1d3403da93a6f98bdc99af0bba12bd781a05181ee08d973be78758492021-05-31 2:04:3920 days 16 hrs ago0x6a5f44d24dca8417db339203d9e07d23321f030b IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00025036
0xaacae90eedb913d4e733f63b4cacc3a12e28de8dba37a93478aa1504fcd5c87d78758062021-05-31 2:02:3020 days 16 hrs ago0x6a5f44d24dca8417db339203d9e07d23321f030b IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00060325
0x967035629cfe5da645bee1d0563bc0c0f25e39de3d4df2a71b6d3382c8386faa78680002021-05-30 19:30:0720 days 23 hrs ago0x7f308c2e3c824bd7fcf7bba2cc12173e1ac0720b IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000727095
0x667d0f5c90edf4e930b642879b0c10c964344251c1c4a46fe06874ad2bf7bde478413192021-05-29 21:13:3021 days 21 hrs ago0x811bd07c073b7e9dc3dc02afa4f6e2604e3c1435 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000856605
0x504bc45d3849c546b3e4656a7257769b096a5fb71be559180a49fdda5fdda4e577610122021-05-27 2:00:0324 days 16 hrs ago0x2ec38cd0cb45b094c5f8ebc47f6b24d5aecbd3b4 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000604314
0xef1e14c03cba8a40c10e3db1caa50f353f21adcd6bab490891d3e3262509df3377492452021-05-26 16:09:4225 days 2 hrs ago0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000428145
0x29772ca196005d05078898bb170a7bd2dc03a200866dc9734b09ffd2f3eb877877492412021-05-26 16:09:3025 days 2 hrs ago0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00060325
0x254776338f75e71336f6c48a7051bdfb19295a47f877298d8e2fa84166608a2f77231292021-05-25 18:08:4826 days 23 mins ago0xcb6cb8308c8f54ac1c14e32348f2df60d4c3b283 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000503595
0xddedef540ade35cf449079c899b07789dc1008dc655898ee7b3607dae1c98d0a77223952021-05-25 17:32:0626 days 1 hr ago0x529970635a473b88e3c994967ad5411acbb2a578 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.00025036
0x413ab704aed8fc56c9974e9a89317f545f1ffea05e3f61a2a19fc1691d58be5e77223842021-05-25 17:31:3326 days 1 hr ago0x529970635a473b88e3c994967ad5411acbb2a578 IN  0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f0 BNB0.000856485
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x98c735fdfdecff350fde86261d97b33e120de8f607e2ca94bac5037acf92b5a554706992021-03-07 11:27:54105 days 7 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x98c735fdfdecff350fde86261d97b33e120de8f607e2ca94bac5037acf92b5a554706992021-03-07 11:27:54105 days 7 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0x63caeccedde55a9be7f48b7a0cb221501ec05911cb648078d66109389d07c66054706832021-03-07 11:27:06105 days 7 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x5fdc331ce59c540621d643ae313bfff6442464c2ebdea57bac69b6dc345ee0e654704182021-03-07 11:13:51105 days 7 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xd9c4851a0ea123e29a16fb38699804bc8a4bb2b91fd81457e1b6cc40254b451754704102021-03-07 11:13:27105 days 7 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x8c863ae54a2d1a1ae20db76aa966e56e808d96487c5a3794c8ebc463985d088a54695172021-03-07 10:28:48105 days 8 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x848fb9afe5a88d3918cbd3b106fc3ce34bdf90dd87de9913b57583976fd2e67554694452021-03-07 10:25:12105 days 8 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xca8bbe707de5cd230a1b03e1e599cbb895a19f8654782a37a379536a655f577754691352021-03-07 10:09:42105 days 8 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xa31b8c7e9f37342215da9c119817a3aa75a53291be7df59ff72b523ef0c930d954688912021-03-07 9:57:30105 days 8 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xa31b8c7e9f37342215da9c119817a3aa75a53291be7df59ff72b523ef0c930d954688912021-03-07 9:57:30105 days 8 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0xec4c792458ea0a4a990923c33ea422d067446c804096d7928c434c0cb52cd2ca54683892021-03-07 9:32:24105 days 9 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0xab87e3329ec369aa95c25af93f941bbfc80eb26be53d2a4b078213bbd45b0d4354681242021-03-07 9:19:09105 days 9 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xab87e3329ec369aa95c25af93f941bbfc80eb26be53d2a4b078213bbd45b0d4354681242021-03-07 9:19:09105 days 9 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0x430be22e79984f23528f88b222dbf9ae1a400c59a6d7db20919d82e9caac777a54680172021-03-07 9:13:48105 days 9 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0x841e8e2ec47b9c47cd842cb04bac4b107a66d6ebc59b0f6cbc07565cd41635e854677682021-03-07 9:01:21105 days 9 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xe4a778dc5ffab9a85793953eee8ebce1005fbcc9416cbe01b5c01639f130765a54662082021-03-07 7:43:21105 days 10 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x58fe30363d283e8f26de2e20b774cb5f07d99a8e4e1d5560114ad60b97aa170a54660712021-03-07 7:36:30105 days 10 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x32f520765171db452e22ebb166274ed93f01ee80e7942e1e7121334a343d53ad54660192021-03-07 7:33:54105 days 10 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x6013e9cfdae111e0c672c7ba0695390c8b542f69a23d16e0088f28085fc1608d54659482021-03-07 7:30:21105 days 11 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0x14c8e0981dee4eb4dc42a271be759821f69ec72f9ad316db01cc14d425145c5e54655912021-03-07 7:12:30105 days 11 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0x32dd0385bc7a58436d35fe85ae4f6ef09cc27057d75edcec6f3be7e43dd3eb7f54653832021-03-07 7:02:06105 days 11 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xfaa73d0f8b791549ca9a8d0cc46f112e6929a18758ae414ebaf4ab9835b8709154644022021-03-07 6:13:03105 days 12 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f PancakeSwap: OIL 30 BNB
0x82db2c910b7bcdaad531af62b41e29f20fbaf8a48b9315c73a9b321fabfb90e254637402021-03-07 5:39:47105 days 12 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0x067287871dfe426ed2e7f6a5d18fde15cc4752d672f8f64aa1382d51f57ab73854635032021-03-07 5:27:56105 days 13 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
0xe59faf13d682e677f5c9a47ce865c325fb2feaccd24863d6e0d7e8a2a288196854631072021-03-07 5:08:08105 days 13 hrs ago 0xd1e47365fb7eaa3f48a86ad3e1be2263255aaf5f Crudeoil Finance: OIL Token0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Ignition

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-02-19
*/

pragma solidity ^0.5.17;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
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: @openzeppelin/contracts/GSN/Context.sol
/*
 * @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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/ownership/Ownable.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.
 *
 * 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.
 */
contract Ownable is Context {
    address public _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract IRewardDistributionRecipient is Ownable {
    address public rewardDistribution;

    function notifyRewardAmount(uint256 reward) external;

    modifier onlyRewardDistribution() {
        require(
            _msgSender() == rewardDistribution,
            "Caller is not reward distribution"
        );
        _;
    }

    function setRewardDistribution(address _rewardDistribution)
        external
        onlyOwner
    {
        rewardDistribution = _rewardDistribution;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot 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-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash =
            0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account)
        internal
        pure
        returns (address payable)
    {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }
}

contract TokenWrapper {
    using SafeMath for uint256;

    IERC20 public LPToken = IERC20(0xe738c35f8DEfac2517170e3c8AC1C85fFDE6Ff2B);

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function stake(uint256 amount) public {
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        LPToken.transferFrom(msg.sender, address(this), amount);
    }

    function withdraw(uint256 amount) public {
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        LPToken.transfer(msg.sender, amount);
    }
}

contract Ignition is TokenWrapper, IRewardDistributionRecipient {
    IERC20 public MainToken =
        IERC20(0xb1b17DFf66d75b29d34f0Bf8622c406D8219B507);
    uint256 public constant DURATION = 90 days;

    uint256 public periodFinish = 0;
    uint256 public rewardRate = 0;
    uint256 public lastUpdateTime;
    uint256 public rewardPerTokenStored;
    mapping(address => uint256) public userRewardPerTokenPaid;
    mapping(address => uint256) public rewards;

    event RewardAdded(uint256 reward);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);

    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }

    function lastTimeRewardApplicable() public view returns (uint256) {
        return Math.min(block.timestamp, periodFinish);
    }

    function rewardPerToken() public view returns (uint256) {
        if (totalSupply() == 0) {
            return rewardPerTokenStored;
        }
        return
            rewardPerTokenStored.add(
                lastTimeRewardApplicable()
                    .sub(lastUpdateTime)
                    .mul(rewardRate)
                    .mul(1e18)
                    .div(totalSupply())
            );
    }

    function earned(address account) public view returns (uint256) {
        return
            balanceOf(account)
                .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))
                .div(1e18)
                .add(rewards[account]);
    }

    // stake visibility is public as overriding LPTokenWrapper's stake() function
    function stake(uint256 amount) public updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        super.stake(amount);
        emit Staked(msg.sender, amount);
    }

    function withdraw(uint256 amount) public updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        super.withdraw(amount);
        emit Withdrawn(msg.sender, amount);
    }

    function exit() external {
        withdraw(balanceOf(msg.sender));
        getReward();
    }

    function withdrawAmount(uint256 amount) external {
        withdraw(amount);
        getReward();
    }

    function getReward() public updateReward(msg.sender) {
        uint256 reward = earned(msg.sender);
        if (reward > 0) {
            rewards[msg.sender] = 0;
            MainToken.transfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }
    }

    function notifyRewardAmount(uint256 reward)
        external
        onlyRewardDistribution
        updateReward(address(0))
    {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward.div(DURATION);
        } else {
            uint256 remaining = periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardRate);
            rewardRate = reward.add(leftover).div(DURATION);
        }
        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp.add(DURATION);
        emit RewardAdded(reward);
    }

    // only when emergency withdraw
    function withdrawMainToken(uint256 amount) external onlyRewardDistribution {
        require(MainToken.balanceOf(address(this)) > amount, "amount exceeds");
        rewardRate = 0;
        periodFinish = 0;
        MainToken.transfer(_owner, amount);
    }
}

Contract ABI

[{"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":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LPToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MainToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardDistribution","type":"address"}],"name":"setRewardDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawMainToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600080546001600160a01b031990811673e738c35f8defac2517170e3c8ac1c85ffde6ff2b1782556005805490911673b1b17dff66d75b29d34f0bf8622c406d8219b507179055600681905560078190556100666001600160e01b036100b916565b600380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506100bd565b3390565b61126e806100cc6000396000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c80637b0a47ee116100f9578063c8f33c9111610097578063e9fad8ee11610071578063e9fad8ee146103cb578063ebe2b12b146103d3578063f2fde38b146103db578063f5194ae214610401576101c3565b8063c8f33c91146103b3578063cd3daf9d146103bb578063df136d65146103c3576101c3565b80638da5cb5b116100d35780638da5cb5b1461036a5780638f32d59b14610372578063a694fc3a1461038e578063b2bdfa7b146103ab576101c3565b80637b0a47ee1461033457806380faa57d1461033c5780638b87634714610344576101c3565b80631be05289116101665780633d18b912116101405780633d18b912146102e1578063511257a9146102e957806370a0823114610306578063715018a61461032c576101c3565b80631be052891461029f5780632e1a7d4d146102a75780633c6b16ab146102c4576101c3565b80630700037d116101a25780630700037d146102435780630d68b76114610269578063101114cf1461028f57806318160ddd14610297576101c3565b80628cc262146101c8578063011cee36146102005780630562b9f714610224575b600080fd5b6101ee600480360360208110156101de57600080fd5b50356001600160a01b0316610409565b60408051918252519081900360200190f35b61020861048f565b604080516001600160a01b039092168252519081900360200190f35b6102416004803603602081101561023a57600080fd5b503561049e565b005b6101ee6004803603602081101561025957600080fd5b50356001600160a01b03166104b2565b6102416004803603602081101561027f57600080fd5b50356001600160a01b03166104c4565b61020861053f565b6101ee61054e565b6101ee610555565b610241600480360360208110156102bd57600080fd5b503561055c565b610241600480360360208110156102da57600080fd5b5035610643565b6102416107bd565b610241600480360360208110156102ff57600080fd5b50356108f7565b6101ee6004803603602081101561031c57600080fd5b50356001600160a01b0316610a9f565b610241610aba565b6101ee610b5d565b6101ee610b63565b6101ee6004803603602081101561035a57600080fd5b50356001600160a01b0316610b76565b610208610b88565b61037a610b97565b604080519115158252519081900360200190f35b610241600480360360208110156103a457600080fd5b5035610bbd565b610208610ca1565b6101ee610cb0565b6101ee610cb6565b6101ee610d0a565b610241610d10565b6101ee610d2b565b610241600480360360208110156103f157600080fd5b50356001600160a01b0316610d31565b610208610d93565b6001600160a01b0381166000908152600b6020908152604080832054600a909252822054610489919061047d90670de0b6b3a7640000906104719061045c90610450610cb6565b9063ffffffff610da216565b61046588610a9f565b9063ffffffff610deb16565b9063ffffffff610e4416565b9063ffffffff610e8616565b92915050565b6000546001600160a01b031681565b6104a78161055c565b6104af6107bd565b50565b600b6020526000908152604090205481565b6104cc610b97565b61051d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6001545b90565b6276a70081565b33610565610cb6565b600955610570610b63565b6008556001600160a01b038116156105b75761058b81610409565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610600576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61060982610ee0565b60408051838152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b6004546001600160a01b0316610657610f7a565b6001600160a01b03161461069c5760405162461bcd60e51b81526004018080602001828103825260218152602001806112196021913960400191505060405180910390fd5b60006106a6610cb6565b6009556106b1610b63565b6008556001600160a01b038116156106f8576106cc81610409565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b600654421061071c57610714826276a70063ffffffff610e4416565b60075561076a565b600654600090610732904263ffffffff610da216565b9050600061074b60075483610deb90919063ffffffff16565b90506107646276a700610471868463ffffffff610e8616565b60075550505b426008819055610783906276a70063ffffffff610e8616565b6006556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b336107c6610cb6565b6009556107d1610b63565b6008556001600160a01b03811615610818576107ec81610409565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b600061082333610409565b905080156108f357336000818152600b60209081526040808320839055600554815163a9059cbb60e01b815260048101959095526024850186905290516001600160a01b039091169363a9059cbb9360448083019493928390030190829087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506040513d60208110156108ba57600080fd5b505060408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b5050565b6004546001600160a01b031661090b610f7a565b6001600160a01b0316146109505760405162461bcd60e51b81526004018080602001828103825260218152602001806112196021913960400191505060405180910390fd5b600554604080516370a0823160e01b8152306004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561099a57600080fd5b505afa1580156109ae573d6000803e3d6000fd5b505050506040513d60208110156109c457600080fd5b505111610a09576040805162461bcd60e51b815260206004820152600e60248201526d616d6f756e74206578636565647360901b604482015290519081900360640190fd5b6000600781905560068190556005546003546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169263a9059cbb92604480820193602093909283900390910190829087803b158015610a7057600080fd5b505af1158015610a84573d6000803e3d6000fd5b505050506040513d6020811015610a9a57600080fd5b505050565b6001600160a01b031660009081526002602052604090205490565b610ac2610b97565b610b13576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b60075481565b6000610b7142600654610f7e565b905090565b600a6020526000908152604090205481565b6003546001600160a01b031690565b6003546000906001600160a01b0316610bae610f7a565b6001600160a01b031614905090565b33610bc6610cb6565b600955610bd1610b63565b6008556001600160a01b03811615610c1857610bec81610409565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610c5e576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b610c6782610f94565b60408051838152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b6003546001600160a01b031681565b60085481565b6000610cc061054e565b610ccd5750600954610552565b610b71610cfb610cdb61054e565b610471670de0b6b3a7640000610465600754610465600854610450610b63565b6009549063ffffffff610e8616565b60095481565b610d21610d1c33610a9f565b61055c565b610d296107bd565b565b60065481565b610d39610b97565b610d8a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6104af81611034565b6005546001600160a01b031681565b6000610de483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110d5565b9392505050565b600082610dfa57506000610489565b82820282848281610e0757fe5b0414610de45760405162461bcd60e51b81526004018080602001828103825260218152602001806111f86021913960400191505060405180910390fd5b6000610de483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061116c565b600082820183811015610de4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600154610ef3908263ffffffff610da216565b60015533600090815260026020526040902054610f16908263ffffffff610da216565b336000818152600260209081526040808320949094558154845163a9059cbb60e01b815260048101949094526024840186905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b158015610a7057600080fd5b3390565b6000818310610f8d5781610de4565b5090919050565b600154610fa7908263ffffffff610e8616565b60015533600090815260026020526040902054610fca908263ffffffff610e8616565b33600081815260026020908152604080832094909455815484516323b872dd60e01b815260048101949094523060248501526044840186905293516001600160a01b03909416936323b872dd93606480820194918390030190829087803b158015610a7057600080fd5b6001600160a01b0381166110795760405162461bcd60e51b81526004018080602001828103825260268152602001806111d26026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156111645760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611129578181015183820152602001611111565b50505050905090810190601f1680156111565780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836111bb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611129578181015183820152602001611111565b5060008385816111c757fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742072657761726420646973747269627574696f6ea265627a7a723158204a0309b4b93afae8af6f8b494aec9036383ca8782b16cf095296225295d4b25e64736f6c63430005110032

Deployed ByteCode Sourcemap

17689:3782:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17689:3782:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19295:265;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19295:265:0;-1:-1:-1;;;;;19295:265:0;;:::i;:::-;;;;;;;;;;;;;;;;16841:74;;;:::i;:::-;;;;-1:-1:-1;;;;;16841:74:0;;;;;;;;;;;;;;20166:106;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20166:106:0;;:::i;:::-;;18119:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18119:42:0;-1:-1:-1;;;;;18119:42:0;;:::i;7830:161::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7830:161:0;-1:-1:-1;;;;;7830:161:0;;:::i;7537:33::-;;;:::i;17013:91::-;;;:::i;17852:42::-;;;:::i;19850:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19850:203:0;;:::i;20574:588::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20574:588:0;;:::i;20280:286::-;;;:::i;21207:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21207:261:0;;:::i;17112:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17112:110:0;-1:-1:-1;;;;;17112:110:0;;:::i;6698:140::-;;;:::i;17941:29::-;;;:::i;18728:131::-;;;:::i;18055:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18055:57:0;-1:-1:-1;;;;;18055:57:0;;:::i;5887:79::-;;;:::i;6253:94::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;19651:191;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19651:191:0;;:::i;5398:21::-;;;:::i;17977:29::-;;;:::i;18867:420::-;;;:::i;18013:35::-;;;:::i;20061:97::-;;;:::i;17903:31::-;;;:::i;6993:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6993:109:0;-1:-1:-1;;;;;6993:109:0;;:::i;17760:85::-;;;:::i;19295:265::-;-1:-1:-1;;;;;19535:16:0;;19349:7;19535:16;;;:7;:16;;;;;;;;;19451:22;:31;;;;;;19389:163;;19535:16;19389:123;;19507:4;;19389:95;;19430:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;19389:18;19399:7;19389:9;:18::i;:::-;:40;:95;:40;:95;:::i;:::-;:117;:123;:117;:123;:::i;:::-;:145;:163;:145;:163;:::i;:::-;19369:183;19295:265;-1:-1:-1;;19295:265:0:o;16841:74::-;;;-1:-1:-1;;;;;16841:74:0;;:::o;20166:106::-;20226:16;20235:6;20226:8;:16::i;:::-;20253:11;:9;:11::i;:::-;20166:106;:::o;18119:42::-;;;;;;;;;;;;;:::o;7830:161::-;6099:9;:7;:9::i;:::-;6091:54;;;;;-1:-1:-1;;;6091:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7943:18;:40;;-1:-1:-1;;;;;;7943:40:0;-1:-1:-1;;;;;7943:40:0;;;;;;;;;;7830:161::o;7537:33::-;;;-1:-1:-1;;;;;7537:33:0;;:::o;17013:91::-;17084:12;;17013:91;;:::o;17852:42::-;17887:7;17852:42;:::o;19850:203::-;19904:10;18463:16;:14;:16::i;:::-;18440:20;:39;18507:26;:24;:26::i;:::-;18490:14;:43;-1:-1:-1;;;;;18548:21:0;;;18544:157;;18605:15;18612:7;18605:6;:15::i;:::-;-1:-1:-1;;;;;18586:16:0;;;;;;:7;:16;;;;;;;;:34;;;;18669:20;;18635:22;:31;;;;;;:54;18544:157;19944:1;19935:6;:10;19927:40;;;;;-1:-1:-1;;;19927:40:0;;;;;;;;;;;;-1:-1:-1;;;19927:40:0;;;;;;;;;;;;;;;19978:22;19993:6;19978:14;:22::i;:::-;20016:29;;;;;;;;20026:10;;20016:29;;;;;;;;;;19850:203;;:::o;20574:588::-;7723:18;;-1:-1:-1;;;;;7723:18:0;7707:12;:10;:12::i;:::-;-1:-1:-1;;;;;7707:34:0;;7685:117;;;;-1:-1:-1;;;7685:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20698:1;18463:16;:14;:16::i;:::-;18440:20;:39;18507:26;:24;:26::i;:::-;18490:14;:43;-1:-1:-1;;;;;18548:21:0;;;18544:157;;18605:15;18612:7;18605:6;:15::i;:::-;-1:-1:-1;;;;;18586:16:0;;;;;;:7;:16;;;;;;;;:34;;;;18669:20;;18635:22;:31;;;;;;:54;18544:157;20741:12;;20722:15;:31;20718:304;;20783:20;:6;17887:7;20783:20;:10;:20;:::i;:::-;20770:10;:33;20718:304;;;20856:12;;20836:17;;20856:33;;20873:15;20856:33;:16;:33;:::i;:::-;20836:53;;20904:16;20923:25;20937:10;;20923:9;:13;;:25;;;;:::i;:::-;20904:44;-1:-1:-1;20976:34:0;17887:7;20976:20;:6;20904:44;20976:20;:10;:20;:::i;:34::-;20963:10;:47;-1:-1:-1;;20718:304:0;21049:15;21032:14;:32;;;21090:29;;17887:7;21090:29;:19;:29;:::i;:::-;21075:12;:44;21135:19;;;;;;;;;;;;;;;;;7813:1;20574:588;:::o;20280:286::-;20321:10;18463:16;:14;:16::i;:::-;18440:20;:39;18507:26;:24;:26::i;:::-;18490:14;:43;-1:-1:-1;;;;;18548:21:0;;;18544:157;;18605:15;18612:7;18605:6;:15::i;:::-;-1:-1:-1;;;;;18586:16:0;;;;;;:7;:16;;;;;;;;:34;;;;18669:20;;18635:22;:31;;;;;;:54;18544:157;20344:14;20361:18;20368:10;20361:6;:18::i;:::-;20344:35;-1:-1:-1;20394:10:0;;20390:169;;20429:10;20443:1;20421:19;;;:7;:19;;;;;;;;:23;;;20459:9;;:38;;-1:-1:-1;;;20459:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20459:9:0;;;;:18;;:38;;;;;20421:19;20459:38;;;;;;;;:9;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;20459:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20459:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;20517:30:0;;;;;;;;20528:10;;20517:30;;;;;;20459:38;20517:30;;;20390:169;18711:1;20280:286;:::o;21207:261::-;7723:18;;-1:-1:-1;;;;;7723:18:0;7707:12;:10;:12::i;:::-;-1:-1:-1;;;;;7707:34:0;;7685:117;;;;-1:-1:-1;;;7685:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21301:9;;:34;;;-1:-1:-1;;;21301:34:0;;21329:4;21301:34;;;;;;21338:6;;-1:-1:-1;;;;;21301:9:0;;:19;;:34;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;21301:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21301:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21301:34:0;:43;21293:70;;;;;-1:-1:-1;;;21293:70:0;;;;;;;;;;;;-1:-1:-1;;;21293:70:0;;;;;;;;;;;;;;;21387:1;21374:10;:14;;;21399:12;:16;;;21426:9;;21445:6;;21426:34;;;-1:-1:-1;;;21426:34:0;;-1:-1:-1;;;;;21445:6:0;;;21426:34;;;;;;;;;;;;:9;;;;;:18;;:34;;;;;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;21426:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21426:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;21207:261:0:o;17112:110::-;-1:-1:-1;;;;;17196:18:0;17169:7;17196:18;;;:9;:18;;;;;;;17112:110::o;6698:140::-;6099:9;:7;:9::i;:::-;6091:54;;;;;-1:-1:-1;;;6091:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6781:6;;6760:40;;6797:1;;-1:-1:-1;;;;;6781:6:0;;6760:40;;6797:1;;6760:40;6811:6;:19;;-1:-1:-1;;;;;;6811:19:0;;;6698:140::o;17941:29::-;;;;:::o;18728:131::-;18785:7;18812:39;18821:15;18838:12;;18812:8;:39::i;:::-;18805:46;;18728:131;:::o;18055:57::-;;;;;;;;;;;;;:::o;5887:79::-;5952:6;;-1:-1:-1;;;;;5952:6:0;5887:79;:::o;6253:94::-;6333:6;;6293:4;;-1:-1:-1;;;;;6333:6:0;6317:12;:10;:12::i;:::-;-1:-1:-1;;;;;6317:22:0;;6310:29;;6253:94;:::o;19651:191::-;19702:10;18463:16;:14;:16::i;:::-;18440:20;:39;18507:26;:24;:26::i;:::-;18490:14;:43;-1:-1:-1;;;;;18548:21:0;;;18544:157;;18605:15;18612:7;18605:6;:15::i;:::-;-1:-1:-1;;;;;18586:16:0;;;;;;:7;:16;;;;;;;;:34;;;;18669:20;;18635:22;:31;;;;;;:54;18544:157;19742:1;19733:6;:10;19725:37;;;;;-1:-1:-1;;;19725:37:0;;;;;;;;;;;;-1:-1:-1;;;19725:37:0;;;;;;;;;;;;;;;19773:19;19785:6;19773:11;:19::i;:::-;19808:26;;;;;;;;19815:10;;19808:26;;;;;;;;;;19651:191;;:::o;5398:21::-;;;-1:-1:-1;;;;;5398:21:0;;:::o;17977:29::-;;;;:::o;18867:420::-;18914:7;18938:13;:11;:13::i;:::-;18934:78;;-1:-1:-1;18980:20:0;;18973:27;;18934:78;19042:237;19085:179;19250:13;:11;:13::i;:::-;19085:138;19218:4;19085:106;19180:10;;19085:68;19138:14;;19085:26;:24;:26::i;:179::-;19042:20;;;:237;:24;:237;:::i;18013:35::-;;;;:::o;20061:97::-;20097:31;20106:21;20116:10;20106:9;:21::i;:::-;20097:8;:31::i;:::-;20139:11;:9;:11::i;:::-;20061:97::o;17903:31::-;;;;:::o;6993:109::-;6099:9;:7;:9::i;:::-;6091:54;;;;;-1:-1:-1;;;6091:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7066:28;7085:8;7066:18;:28::i;17760:85::-;;;-1:-1:-1;;;;;17760:85:0;;:::o;9340:136::-;9398:7;9425:43;9429:1;9432;9425:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9418:50;9340:136;-1:-1:-1;;;9340:136:0:o;10290:471::-;10348:7;10593:6;10589:47;;-1:-1:-1;10623:1:0;10616:8;;10589:47;10660:5;;;10664:1;10660;:5;:1;10684:5;;;;;:10;10676:56;;;;-1:-1:-1;;;10676:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11229:132;11287:7;11314:39;11318:1;11321;11314:39;;;;;;;;;;;;;;;;;:3;:39::i;8884:181::-;8942:7;8974:5;;;8998:6;;;;8990:46;;;;;-1:-1:-1;;;8990:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17468:214;17535:12;;:24;;17552:6;17535:24;:16;:24;:::i;:::-;17520:12;:39;17604:10;17594:21;;;;:9;:21;;;;;;:33;;17620:6;17594:33;:25;:33;:::i;:::-;17580:10;17570:21;;;;:9;:21;;;;;;;;:57;;;;17638:7;;:36;;-1:-1:-1;;;17638:36:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17638:7:0;;;;:16;;:36;;;;;;;;;;;;;:7;:36;;;5:2:-1;;;;30:1;27;20:12;4599:98:0;4679:10;4599:98;:::o;375:106::-;433:7;464:1;460;:5;:13;;472:1;460:13;;;-1:-1:-1;468:1:0;;375:106;-1:-1:-1;375:106:0:o;17230:230::-;17294:12;;:24;;17311:6;17294:24;:16;:24;:::i;:::-;17279:12;:39;17363:10;17353:21;;;;:9;:21;;;;;;:33;;17379:6;17353:33;:25;:33;:::i;:::-;17339:10;17329:21;;;;:9;:21;;;;;;;;:57;;;;17397:7;;:55;;-1:-1:-1;;;17397:55:0;;;;;;;;;17438:4;17397:55;;;;;;;;;;;;-1:-1:-1;;;;;17397:7:0;;;;:20;;:55;;;;;;;;;;;;;:7;:55;;;5:2:-1;;;;30:1;27;20:12;7208:266:0;-1:-1:-1;;;;;7296:22:0;;7274:110;;;;-1:-1:-1;;;7274:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7421:6;;7400:38;;-1:-1:-1;;;;;7400:38:0;;;;7421:6;;7400:38;;7421:6;;7400:38;7449:6;:17;;-1:-1:-1;;;;;;7449:17:0;-1:-1:-1;;;;;7449:17:0;;;;;;;;;;7208:266::o;9813:226::-;9933:7;9969:12;9961:6;;;;9953:29;;;;-1:-1:-1;;;9953:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9953:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10005:5:0;;;9813:226::o;11891:379::-;12011:7;12113:12;12106:5;12098:28;;;;-1:-1:-1;;;12098:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;12098:28:0;;12137:9;12153:1;12149;:5;;;;;;;11891:379;-1:-1:-1;;;;;11891:379:0:o

Swarm Source

bzzr://4a0309b4b93afae8af6f8b494aec9036383ca8782b16cf095296225295d4b25e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.